久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3765|回復(fù): 8
收起左側(cè)

單片機用按鍵來控制數(shù)碼管倒數(shù)總是有問題 小白求助

[復(fù)制鏈接]
ID:237524 發(fā)表于 2017-10-7 15:32 | 顯示全部樓層 |閱讀模式
我在做一個用按鍵來控制數(shù)碼管倒數(shù),當(dāng)小時、分鐘、秒都為零時,報警響起,大佬們幫忙看一下哪里錯了吧,,寫到后面我自己都亂了。。

#include<reg52.h>
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;
#define fosc 11059200L
#define TO_50ms(65536-50000*(fosx/12000000L))   //50ms定時參數(shù)
sbit en1=P2^6;                   //個位  秒
sbit en2=P2^7;                   //十位  秒
sbit en3=P2^5;                   //個位  分
sbit en4=P2^4;         //十位  分
sbit en5=P2^3;         //個位  時
sbit en6=P2^2;         //十位  時
sbit clear=P1^0;           //清零                           
sbit char display_num,count_in_TO;     //計數(shù)值、進(jìn)入定時器的次數(shù)
sbit alert=P3^2;     //報警輸入
sbit speaker=P0^2;   //報警輸出
sbit led=P0^0;       //工作指示
/*
共陰級數(shù)碼管0~9的字形碼
*/
coust unsigned char seg7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int init_port()
{
        //配置P0模式為開漏輸出
        P0M1=0xff;
        P0M0=0xff;
        P1M1 |=0x01;                                                          //P1.0輸入
        P1M0 |=0x00;
        P2M1 |=0xc0;
        P2M0 |=0xc0;

        clear=1;
}

bit run_flag;        //工作標(biāo)志
int ms_delay(unsigned int t)
{
         unsigned int i;
        for(t;t>0;t--)                         //外層循環(huán)t次
                for(i=110;i>0;i--);                          //內(nèi)層循環(huán)110次
}
//INTO中斷服務(wù)程序
int INTO_interrupt() interrupt 0
{
        EXO=0;                   //關(guān)INTO中斷
        run_flag=0;
}
int init_int()
{
        ITO=1;                                                //設(shè)置INTO為下降沿觸發(fā)
        EXO=1;                                                //允許INTO中斷
}
int INTO_interrupt() interrupt 1                 
{
        running=~running;     //切換暫停/計時
        if(running)
        {                                          //切換為運行
                TRO=1;
        }
        else
        {                                          //切換為暫停
                TRO=0;
        }
}
int TimerO_interrupt() interrupt 2
{
        THO=TO_50ms >>8;      //重新初值
        TLO=TO_50ms;
        if((++ count_in_TO)==20) //count_in_TO自加到20.計時1s
        {
                count_in_TO=0;
                if((++display_num)==60)
                {                                  //display_num自加1后判斷是否等于60
                        dispaly_num=0;
                }
        }
}
int init_timer()
{
        TMOD=0x09;         //定時器0模式1,16bit
        THO=TO_50ms >>8;   //THO=TO_50ms/256
        TLO=TO_50ms;       //TLO=TO_50ms%256
        ETO=1;
}
int display1(unsigned char c2,unsigned char c1)
{
        P0=seg7[c2];                     //送入秒十位的段碼
        en2=0;                                         //顯示DS2
        ms_delay(10);
        en1=1;                                         //關(guān)閉DS2

        P0=seg7[c1];                          //送入秒個位的段碼
        en1=0;                //顯示DS1
        ms_delay(100);
        en1=1;                 //顯示DS1
}
int display2(unsigned char c3,unsigned char c4)
{
        P0=seg7[c3];                     //送入分個位的段碼
        en3=0;                                         //顯示DS2
        ms_delay(10);
        en1=1;        

        P0=seg7[c4];                     //送入分十位的段碼
        en4=0;                                         //顯示DS2
        ms_delay(10);
        en1=1;        
}
int display3(unsigned char c5,unsigned char c6)
{
        P0=seg7[c5];                     //送入時個位的段碼
        en5=0;                                         //顯示DS2
        ms_delay(10);
        en1=1;        

        P0=seg7[c6];                     //送入時十位的段碼
        e6=0;                                         //顯示DS2
        ms_delay(10);
        en1=1;        
}
int        while(1)                //報警程序
        {
                if(display3_num=0)
                {                                 //正常運行
                        if(display2_num=0)
                        {
                                if(display1_num=0)
                                           speaker=1;
                        }
                }
        }
int while(2)
{
          TR1=0;                                //若按下K1鍵,則定時器T1關(guān)閉,時鐘暫停
        if(K2==0)                                //若按下K2鍵
         {
                Delay_ms(10);                //延時去抖
                if(K2==0)
                {
                        while(!K2);                //等待K2鍵釋放
                        hour++;                //小時調(diào)整
                        if(hour==24)
                        {
                                hour = 0;
                        }
                }
        }
        if(K3==0)                                //若按下K3鍵
         {
                Delay_ms(10);
                if(K3==0)
                {
                        while(!K3);                //等待K3鍵釋放
                           min++;                //分鐘調(diào)整
                        if(min==60)
                        {
                                min = 0;
                        }               
                }
        }
        if(K4==0)                                //若按下K4鍵
         {
                Delay_ms(10);
                if(K4==0)
                {
                        while(!K4);                //等待K4鍵釋放
                                                   sec++;
                                                if(sec==60)
                                                {
                                                        sec=0;
                                                }
                        TR1=1;                //調(diào)整完畢后,時鐘恢復(fù)走時
                        K1_FLAG=0;                //將K1鍵按下標(biāo)志位清0
                }
        }        
}
int while(3)                                         //按鍵
{
        shi=display1_num/10;
        ge=display1_num%10;
        display1(shi,ge);
        shi=ge=0;
        shi=display2_num/10;
        ge=display2_num%10;
        display2(shi,ge);
        shi=ge=0;
        shi=display3_num/10;
        ge=display3_num%10;
        display3(shi,ge);
        //檢測清零按鍵
        if(clear==0)
        {
                ms_delay(10)
                if(clear==0)
                {                                  //確認(rèn)按下清零按鈕
                        if(!running)   //如果處于暫停狀態(tài)
                        display=0;
                }
        }
}
int while(4)
{
        int num;
        num=display3*3600+display*60+display;
        if(num==0)
        {
                speaker=1;
        }
        else
        {
                display3_num=num/3600;
                display2_num=(num%3600)/60;
                display1_num=(num%3600)%60;

        }
        
}
main()
{
        //配置端口模式
        P0M1=0x03;              //P0.1、P0.0輸出
        P0M0=0x03;
        P3M1=0x04;                            //P3.2輸入
        P3M0=0x00;

        unsigned char shi,ge;          //定義十位、個位要輸出的數(shù)據(jù)
        init_port();
        init_int();
        init_timer();

        display1_num=0;
        display2_num=0;
        display3_num=0;
        count_in_TO=0;
        running=0;
        //把兩個數(shù)碼管都關(guān)閉
        en2=1;
        en1=1;


        ITO=0;      //設(shè)置INTO為低電平觸發(fā)
        EXO=1;      //允許INTO中斷
        EA=1;       //開總中斷

        while(2)                 //按鍵
        while(4)                 //倒數(shù)
        while(3)                 //暫停

        alert=1;
        speaker=1;

        while(1)
        
}

回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2017-10-8 00:25 | 顯示全部樓層
學(xué)會先畫程序流程圖、框圖,再按圖寫程序,就不會亂了。
回復(fù)

使用道具 舉報

ID:236614 發(fā)表于 2017-10-8 08:28 | 顯示全部樓層
調(diào)用的函數(shù)全部錯誤,程序上太多while,while會給你放坑,而且while也不是那樣用的。
回復(fù)

使用道具 舉報

ID:237524 發(fā)表于 2017-10-8 09:35 | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-10-8 00:25
學(xué)會先畫程序流程圖、框圖,再按圖寫程序,就不會亂了。

嗯嗯,,,好的,,我試試啊
回復(fù)

使用道具 舉報

ID:111634 發(fā)表于 2017-10-8 15:18 | 顯示全部樓層
實例96  能預(yù)置初值的倒計時秒表
Proteus仿真一下,確認(rèn)有效。
實例96 能設(shè)置初值的倒計時秒表.rar (40 KB, 下載次數(shù): 5)
能預(yù)置初值的倒計時秒表.jpg
以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機應(yīng)用100案例,用于仿真實驗操作,書中電路和程序設(shè)計有詳細(xì)說明,電路與程序真實可靠可信可行,程序語句條條有注解。若需99.99秒,硬件電路增加一位595。軟件程序增加0.01s10ms計數(shù)器,并修改相應(yīng)計數(shù)顯示程序。仿真電路和Hex文件能在清華出版社網(wǎng)站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。
回復(fù)

使用道具 舉報

ID:237812 發(fā)表于 2017-10-8 15:23 | 顯示全部樓層
你這個在主程序用while(2),這個是死循環(huán),按鍵怎么能得到處理。程序怪怪的
回復(fù)

使用道具 舉報

ID:237524 發(fā)表于 2017-10-25 21:34 | 顯示全部樓層
zl2168 發(fā)表于 2017-10-8 15:18
實例96  能預(yù)置初值的倒計時秒表
先Proteus仿真一下,確認(rèn)有效。
以上摘自張志良編著《80C51單片機仿真設(shè) ...

嗯嗯,,謝謝大佬費心了。我看看啊
回復(fù)

使用道具 舉報

ID:212797 發(fā)表于 2017-10-27 12:31 | 顯示全部樓層
程序里面的int while(2)這些是什么?函數(shù)嗎?感覺有些怪
回復(fù)

使用道具 舉報

ID:242454 發(fā)表于 2017-10-27 13:48 | 顯示全部樓層
這個程序真心有點看不大懂,程序?qū)懙奶侠?nbsp;  ,WHILE里面?zhèn)數(shù)值 那肯定是進(jìn)私循環(huán)了,

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜成人免费视频 | a国产一区二区免费入口 | 农夫在线精品视频免费观看 | xxxxx黄色片| 中国毛片免费 | 成年人免费在线视频 | 亚洲精品视频二区 | 九九热在线视频免费观看 | 美女艹b| 国产美女久久 | 草久久免费视频 | 欧美在线观看一区 | 99婷婷| 国产午夜在线观看 | 国产欧美日韩在线观看 | 91精品久久久久久久久久 | av网站观看 | 精品欧美一区二区三区久久久 | 色视频成人在线观看免 | 成人夜晚看av | 红桃成人在线 | av国产在线观看 | 亚洲一区二区精品视频 | 欧美专区在线观看 | 在线一区观看 | 国产专区在线 | 亚洲精品中文字幕在线观看 | 91综合在线观看 | 91综合网 | 国产一级视频在线 | 国产成人麻豆免费观看 | 欧美精品1区2区3区 精品国产欧美一区二区 | 91精品导航 | 精品国产成人 | 六月成人网 | 亚洲+变态+欧美+另类+精品 | 免费大黄视频 | 亚洲一区二区三区在线播放 | 国产女人精品视频 | 国产精品久久久久久久久免费樱桃 | 成人精品国产免费网站 |