大一時候做的單片機設計,在b站錄了視頻進行相應的介紹(BV1mJ411L7Ek)很多朋友一直想要但是以前的代碼水平并不咋地(怕放出來丟人)也就一直沒有開源,之后有時間會用狀態機+時間片輪的思想進行重構給朋友們進行對比學習,這次就先給各位放出來了
基本的時間與溫度顯示功能/時間校準/鬧鐘功能/秒表(開始、暫停、繼續,記錄一個秒表時間,秒表進行清零,長按顯示記錄的秒表時間)/倒計時(開始、暫停、繼續,重新倒計時,倒計時清零)/12/24時顯示選擇
因為各種中斷的原因,這個電子鐘本身去記錄時間的功能已經被破壞掉了,后續應該可以在增加變量,去記錄所經歷的中斷數,對于基礎時鐘的時間進行補償,使其達到更加精準的效果。(不過那樣又是得花費很多時間去計算所占用的時間啊什么的,實在是肝不動了)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (43.76 KB, 下載次數: 167)
下載附件
2021-12-13 21:46 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<absacc.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define out P0
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit E=P2^2;
- sbit ctime=P3^2;//外部中斷0,時間校準
- sbit s_alarm=P3^3;//外部中斷1,鬧鐘設定
- sbit LED=P1^2;//低電平點亮
- sbit P2_4=P1^1;//24時12時標記位,實在沒辦法了,data區已經用完了
- //五個按鍵低電平有效,上下左右 確認 1234 0
- void lcd_initial(void);
- void lcd_initial2(void);
- void check_busy(void);
- void write_command(uchar com);
- void write_data(uchar dat);
- void string(uchar ad,uchar*s);
- void delay(uint);
- int read_keys(void);
- void c_string(uchar ad,uchar *s);
- void s_string(uchar ad,uchar s);
- void write_time(void);
- void inter_init(void);
- void base_time(void);
- void C_time(void);
- void alarm(void);
- void stopwatch(void);
- void countdown(void);
- void c_down(void);
- void t24_12(void);
- struct xwei
- {
- uchar x_address;//顯示屏的地址
- uchar* zhi;//指向傳遞值的指針
- }wei[2][7];
- struct zwei
- {
- uchar x_address;//顯示屏的地址
- uchar zhi;//存儲值
- };
- uchar code mdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
- uchar code weeks[7][5]={"Mon","Tues","Wed","Thur","Fri","Sat","Sun"};
- uchar code tab1[]={"20 - - "};
- uchar code tab2[]={" : : "};
- uchar second[3]={53,55};//記錄s//所有數值均以ASCII值表示
- uchar minute[3]={53,57};//記錄min
- uchar hour[3]={50,51};//記錄h
- uchar day[3]={51,49};//記錄日
- uchar month[3]={49,50};//記錄月
- uchar year[3]={49,56};//記錄年
- uchar week=7;//記錄星期幾
- uchar x=0,y=0;//光標位置
- uchar a_p_m=0;//am,pm標記量
- uchar pFlag=0;
- uchar btFlag=1;//基本事件標記
- uchar bpFlag=0;//基本校準標記
- uchar bfFlag=0;//基本選擇標記
- uchar swFlag=0;//秒表標記
- uchar cdFlag=0;//倒計時標記
- uchar acFlag=0;//鬧鐘標記
- uint timer=0;//中斷記錄變量
- uint sd=0;//秒表,倒計時記錄變量
- uchar sdFlag=0;//毫秒級計時標記位
- int B_state_tag=-1;//按鍵狀態標記位
- //鬧鐘變量
- struct zwei alarm_clock[4];
- struct zwei TIME_clock[4];
- void timer0() interrupt 1 using 1//基本時鐘
- {
- timer++;
- if(timer==10000)
- {
- timer=0;
- btFlag=1;
- }
- }
- void timer1() interrupt 3 using 1//秒表,倒計時時鐘
- {
- sd++;
- if(sd==800)//每100ms加加//由實際測試得出非計算值
- {
- sd=0;
- sdFlag=1;
- }
- }
- void int0() interrupt 0 using 0//時間校準
- {
- bpFlag=1;
- }
- void int1() interrupt 2//功能選擇
- {
- bfFlag=1;//帶選擇
- EA=0;
- //TR0=0;
- pFlag=1;
- lcd_initial2();
- delay(1);
- write_command(0x01);
- delay(1);
- x=0;
- while(bfFlag)
- {
- while(read_keys()==-1);//等待按鍵按下
- B_state_tag=read_keys();
- x=B_state_tag-1;//上下按鍵選擇日期或者時間
- while(bfFlag)//按鍵與顯示屏操作
- {
- while(read_keys()==-1);
- B_state_tag=read_keys();//讀取按鍵值
- while(read_keys()!=-1);
- switch(B_state_tag)
- {
- case 1://上
- {
- string(0x80,"alarm clock");
- acFlag=1;
- }break;
- case 2://下
- {
- string(0x80,"stopwatch");
- swFlag=1;
- }break;
- case 3://左
- {
- string(0x80,"countdown");
- cdFlag=1;
- }break;
- case 4://右
- {
- if(P2_4==0)
- P2_4=1;
- if(P2_4==1)
- string(0xce," ");
- string(0x80,"24or12");
- }break;
- case 0://確認
- {
- bfFlag=0;
- }break;
- default:break;
- }
- while(read_keys()!=-1);
- }
- }
- lcd_initial();
- inter_init();
- bfFlag=0;
- }
- //系統時鐘為12MHZ
- void main()
- {
- P2_4=0;
- lcd_initial();
- inter_init();
- P1=0xff;//讀取按鍵,先寫入
- string(0x80,tab1);
- string(0xc0,tab2);
-
- while(1)
- {
- if(swFlag==1)//秒表
- {
- for(x=1;x<=1;)//只執行一次清屏操作
- {
- TR1=1;
- TH1=0x9C;//100us 中斷一次
- TL1=0x9C;
- write_command(0x01);
- string(0x83,":");
- x=2;
- }
- stopwatch();
- }
- else
- {
- write_time();
- }
-
- if(cdFlag==1)//倒計時
- {
- for(x=1;x<=1;)//只執行一次清屏操作
- {
- write_command(0x01);
- string(0x83,":");
- countdown();
- TH1=0x9C;//100us 中斷一次
- TL1=0x9C;
- x=2;
- }
- countdown();
- c_down();
- }
- else
- {
- write_time();
- }
-
- if(btFlag==1)
- {
- base_time();
- }
- if(bpFlag==1)
- {
- C_time();
- }
- if(acFlag==1)
- {
- LED=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
仿真代碼51hei附件下載:
多功能電子鐘.7z
(75.87 KB, 下載次數: 262)
2021-12-13 21:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|