程序要求如下:
1、使用定時(shí)器中斷
2、數(shù)碼管顯示:時(shí)-分-秒
3、三個(gè)按鍵控制:MOD鍵、+鍵,-鍵
在正常計(jì)時(shí)時(shí),按MOD鍵一次,時(shí)間暫停,如果這時(shí)按+鍵或鍵-鍵,秒的數(shù)量就加1或減一;再按MOD鍵(兩次),如果這時(shí)按+鍵或鍵-鍵,分 的數(shù)量就加1或減一;再按MOD鍵(三次),如果這時(shí)按+鍵或鍵-鍵,時(shí)的數(shù)量就加1或減一;再按MOD鍵(四次),啟動(dòng)計(jì)時(shí)(恢復(fù)正常計(jì)時(shí))。 4、12小時(shí)制或24小時(shí)制。 廢話不多說(shuō),直接上圖
仿真.jpg (177.98 KB, 下載次數(shù): 105)
下載附件
2019-5-6 21:45 上傳
單片機(jī)源程序如下:
- //------------------------------------------------------------------------
- //名稱:按鍵調(diào)節(jié)數(shù)碼管顯示
- //------------------------------------------------------------------------
- //說(shuō)明:
- // 按MOD鍵一次,時(shí)間暫停,如果這時(shí)按+鍵或鍵-鍵,
- // 秒的數(shù)量就加1或減一;再按MOD鍵(兩次),如果這時(shí)按+鍵或鍵-鍵,
- // 分的數(shù)量就加1或減一;再按MOD鍵(三次),如果這時(shí)按+鍵或鍵-鍵,
- // 時(shí)的 數(shù)量就加1或減一;再按MOD鍵(四次),啟動(dòng)計(jì)時(shí)(恢復(fù)正常計(jì)時(shí))。
- //------------------------------------------------------------------------
- #include <reg51.h> //調(diào)用含有51專用寄存器的頭文件
- #define uchar unsigned char //用uchar代替unsigned char
- #define uint unsigned int //用uint代替unsigned int
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽(yáng)極數(shù)碼管斷碼表
- //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極數(shù)碼管斷碼表
- sbit mode = P1^0; //模式調(diào)節(jié)
- sbit s1 = P1^1; //加
- sbit s2 = P1^2; //減
- int sec=20,min=5,hour=12; //顯示初值
- uint temp; //臨時(shí)變量
- uchar m,n;
- /***********************************
- 延時(shí)子函數(shù)
- *************************************/
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=120;j>0;j--);
- }
- /*******************************
- 顯示子函數(shù)
- ********************************/
- void display(void)
- {
- P2=0x80;
- P0=table[sec%10]; //顯示秒個(gè)位
- delayms(5);
- P2=0x40;
- P0=table[sec/10]; //顯示秒十位
- delayms(5);
-
- P2=0x20; //顯示橫線
- P0=0xbf;
- delayms(5);
- P2=0x10; //顯示分個(gè)位
- P0=table[min%10];
- delayms(5);
- P2=0x08; //顯示分十位
- P0=table[min/10];
- delayms(5);
- P2=0x04; //顯示橫線
- P0=0xbf;
- delayms(5);
- P2=0x02; //顯示時(shí)個(gè)位
- P0=table[hour%10];
- delayms(5);
- P2=0x01; //顯示時(shí)十位
- P0=table[hour/10];
- delayms(5);
- }
- /*****************************************
- 按鍵子函數(shù)
- *******************************************/
- void key()
- {
- if(mode==0) //第一次判斷"模式"按鍵按下
- {
- delayms(5); //延時(shí)消抖
- if(mode==0) //第二次判斷"模式"按鍵按下
- { TR0=0;n++; } //暫停計(jì)時(shí),并且記錄按鍵按下的次數(shù)
- while(!mode) //等待按鍵釋放
- {display();} //調(diào)用顯示函數(shù)消除數(shù)碼管閃爍
- }
- if(n>3) //如果第四次按下mode鍵則繼續(xù)計(jì)時(shí),并且重新記錄按下的按鍵次數(shù)
- {TR0=1;n=0;}
- /********************************
- 調(diào)整+
- *********************************/
- if (s1==0) //第一次判斷"+"按鍵按下
- {
- {delayms(10); //延時(shí)消抖
- if (s1==0) //第二次判斷"模式"按鍵按下
- {
- switch(n) //根據(jù)"模式"按鍵按下的次數(shù),執(zhí)行對(duì)應(yīng)程序
- {
- case 1:sec++;if(sec>59)sec=0; //秒遞增,最大顯示59,若59繼續(xù)遞增則顯示00
- break;
- case 2:min++;if(min>59)min=0; //分遞增,最大顯示59,若59繼續(xù)遞增則顯示00
- break;
- case 3:hour++;if(hour>23)hour=0; //時(shí)遞增,最大顯示59,若23繼續(xù)遞增則顯示00
- break;
- }
- }
- }
- while(!s1) //等待"+"按鍵釋放
- {display();} //調(diào)用顯示函數(shù)消除數(shù)碼管閃爍
- }
- /******************************
- 調(diào)整-
- *******************************/
- if (s2==0) //第一次判斷"-"按鍵按下
- {
- {delayms(10); //延時(shí)消抖
- if(s2==0) //第二次判斷"模式"按鍵按下
- {
- switch(n) //根據(jù)"模式"按鍵按下的次數(shù),執(zhí)行對(duì)應(yīng)程序
- {
- case 1:sec--;if(sec<=0)sec=59; //秒遞減,最小顯示00,若00繼續(xù)遞減則顯示59
- break;
- case 2:min--;if(min<=0)min=59; //分遞減,最小顯示00,若00繼續(xù)遞減則顯示59
- break;
- case 3:hour--;if(hour<=-1)hour=23; //時(shí)遞減,最小顯示00,若00繼續(xù)遞減則顯示23
- break;
- }
- }
- }
- while(!s2)//等待按鍵釋放
- {display();}//調(diào)用顯示函數(shù)消除數(shù)碼管閃爍
- }
- }
- /*************主函數(shù)************/
- void main(void)
- {
- TMOD=0x11; //設(shè)置工作方式
- ET0=1; //使能定時(shí)器0
- TH0=(65536-50000)/256; //定時(shí)器的初值
- TL0=(65536-50000)%256;
- TR0=1; //停止開(kāi)啟定時(shí)器0
- EA=1; //使能中斷
- while(1)
- {
- display(); //調(diào)用顯示函數(shù)
- key(); //調(diào)用按鍵處理函數(shù)
- }
- }
- /************定時(shí)器0中斷計(jì)時(shí)**********/
- void Time0() interrupt 1
- {
- TH0=(65536-50000)/256; //重裝初值50ms;
- TL0=(65536-50000)%256;
- m=m+1;
- key();
- if(m>20) // m=20說(shuō)明1秒時(shí)間到
- {
- m=0;
- sec++;
- if(sec>59) //判斷到達(dá)60s
- {
- min++; //分鐘加1
- sec=0;
- if(min>59) //判斷到達(dá)60分
- {
- hour=hour+1; //小時(shí)加1
- min=0;
- }
- if(hour==24)hour=0;
- }
- }
- }
復(fù)制代碼
0.png (9.38 KB, 下載次數(shù): 80)
下載附件
2019-5-6 23:02 上傳
所有資料51hei提供下載:
可調(diào)時(shí)鐘.zip
(59.2 KB, 下載次數(shù): 184)
2019-5-6 21:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|