這是我這個周用單片機做的時鐘,用數碼管顯示,用定時器來即時。
Clock.zip
(93.36 KB, 下載次數: 15)
2018-10-29 15:34 上傳
點擊文件名下載附件
程序源碼及仿真電路 下載積分: 黑幣 -5
QQ截圖20181029153400.png (112.53 KB, 下載次數: 58)
下載附件
2018-10-29 15:35 上傳
單片機源程序:
- #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]: 秒計數 timedata[1] :分計數 timedata[2] :小時計數
- uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
- //ms50:每過50ms加一 con按鍵按下計數 為1 改變分鐘 為2改變小時
- //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() //按鍵檢測函數
- {
- EA=0; //關閉總中斷
- if(key0==0) //判斷按鍵是否按下
- {
- delay1ms(10); //延時消抖
- while(key0==0); //等待按鍵釋放
- con++; //計數值加
- TR0=0; //關閉定時器0
- ET0=0; //關閉定時器0中斷
- if(con>=3) //若按下3次
- {
- con=0; //計數值清0
- TR0=1; //開啟定時器
- ET0=1; //開啟定時器中斷
- }
- }
- if(con!=0) //若按鍵0按下一次
- {
- if(key1==0) //如果按鍵1按下
- {
- delay1ms(10); //延時消抖
- while(key1==0); //等待按鍵釋放
- timedata[con]++; //(分/時)自加
- 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; //顯示秒個位數據
- dis[1]=timedata[0]/10; //顯示秒十位數據
- dis[3]=timedata[1]%10; //顯示分個位數據
- dis[4]=timedata[1]/10; //顯示分十位數據
- dis[6]=timedata[2]%10; //顯示時個位數據
- dis[7]=timedata[2]/10; //顯示時十位數據
- for(k=0;k<8;k++)
- {
- P0=~dis_7[dis[k]]; //段選端
- P2=scan_con[k]; //位選端
- delay1ms(1);
- P2=0xff; //消影
- }
- }
- void main(void)
- {
- TMOD=0X01; //開啟定時器0
- TH0=0X3C; //選擇工作方式2
- TL0=0XB0; //載入高位初值
- TR0=1; //載入低位初值
- ET0=1; //開啟定時器中斷0
- EA=1; //全局中斷使能
- while(1)
- {
- scan();
- keyscan();
- }
- }
- void time_intt0(void) interrupt 1
- {
- ET0=0; //關閉定時器0中斷
- TR0=0; //
- TH0=0X3C;
- TL0=0XB0;
- TR0=1; //
- ms50++; //50毫秒計數
- 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;
- }
復制代碼
|