|
這是我這個(gè)周用單片機(jī)做的時(shí)鐘,用數(shù)碼管顯示,用定時(shí)器來即時(shí)。
Clock.zip
(93.36 KB, 下載次數(shù): 15)
2018-10-29 15:34 上傳
點(diǎn)擊文件名下載附件
程序源碼及仿真電路 下載積分: 黑幣 -5
QQ截圖20181029153400.png (112.53 KB, 下載次數(shù): 58)
下載附件
2018-10-29 15:35 上傳
單片機(jī)源程序:
- #include"reg51.h"
- #define uchar unsigned char
- uchar code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0xff,0xbf};
- uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
- uchar data timedata[3]={0x00,0x00,0x00};
- //timedata[0]: 秒計(jì)數(shù) timedata[1] :分計(jì)數(shù) timedata[2] :小時(shí)計(jì)數(shù)
- uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
- //ms50:每過50ms加一 con按鍵按下計(jì)數(shù) 為1 改變分鐘 為2改變小時(shí)
- //con1 con2
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- void delay1ms(int t)
- {
- unsigned char a,b;
- for(b=0;b<t;b++)
- for(a=0;a<120;a++);
- }
- void keyscan() //按鍵檢測(cè)函數(shù)
- {
- EA=0; //關(guān)閉總中斷
- if(key0==0) //判斷按鍵是否按下
- {
- delay1ms(10); //延時(shí)消抖
- while(key0==0); //等待按鍵釋放
- con++; //計(jì)數(shù)值加
- TR0=0; //關(guān)閉定時(shí)器0
- ET0=0; //關(guān)閉定時(shí)器0中斷
- if(con>=3) //若按下3次
- {
- con=0; //計(jì)數(shù)值清0
- TR0=1; //開啟定時(shí)器
- ET0=1; //開啟定時(shí)器中斷
- }
- }
- if(con!=0) //若按鍵0按下一次
- {
- if(key1==0) //如果按鍵1按下
- {
- delay1ms(10); //延時(shí)消抖
- while(key1==0); //等待按鍵釋放
- timedata[con]++; //(分/時(shí))自加
- if(con==2) //若按下兩次
- con1=24;
- else con1=60;
- if(timedata[con]>=con1) //若加到最大值則將0賦值給變量
- timedata[con]=0;
- }
- }
- if(con!=0)
- {
- if(key2==0)
- {
- delay1ms(10);
- while(key2==0);
- timedata[con]--;
- if(con==2)
- con1=23;
- else con1=59;
- if(timedata[con]<=0)
- timedata[con]=con1; //若減到最小值0則將最大值付給變量
- }
- }
- EA=1;
- }
- void scan()
- {
- char k;
- dis[0]=timedata[0]%10; //顯示秒個(gè)位數(shù)據(jù)
- dis[1]=timedata[0]/10; //顯示秒十位數(shù)據(jù)
- dis[3]=timedata[1]%10; //顯示分個(gè)位數(shù)據(jù)
- dis[4]=timedata[1]/10; //顯示分十位數(shù)據(jù)
- dis[6]=timedata[2]%10; //顯示時(shí)個(gè)位數(shù)據(jù)
- dis[7]=timedata[2]/10; //顯示時(shí)十位數(shù)據(jù)
- for(k=0;k<8;k++)
- {
- P0=~dis_7[dis[k]]; //段選端
- P2=scan_con[k]; //位選端
- delay1ms(1);
- P2=0xff; //消影
- }
- }
- void main(void)
- {
- TMOD=0X01; //開啟定時(shí)器0
- TH0=0X3C; //選擇工作方式2
- TL0=0XB0; //載入高位初值
- TR0=1; //載入低位初值
- ET0=1; //開啟定時(shí)器中斷0
- EA=1; //全局中斷使能
- while(1)
- {
- scan();
- keyscan();
- }
- }
- void time_intt0(void) interrupt 1
- {
- ET0=0; //關(guān)閉定時(shí)器0中斷
- TR0=0; //
- TH0=0X3C;
- TL0=0XB0;
- TR0=1; //
- ms50++; //50毫秒計(jì)數(shù)
- if(ms50==20) //1秒
- {
- ms50=0x00;
- timedata[0]++;
- if(timedata[0]==60)
- {
- timedata[0]=0;
- timedata[1]++;
- if(timedata[1]==60)
- {
- timedata[1]=0;
- timedata[2]++;
- if(timedata[2]==24)
- {
- timedata[2]=0;
- }
- }
- }
- }
- ET0=1;
- }
復(fù)制代碼
|
|