基于STC15W4K58S4單片機的電子萬年歷(數碼管顯示)該壓縮包包含源碼TXT文件 源工程文件(Keil uVision4文件)和課程設計報告
電子時鐘的設計
—單片機綜合設計報告
目錄
1 任務內容
2 系統框圖
3 硬件電路圖
4 軟件流程圖
5 結束語
附錄1:實際效果圖
附錄2:源程序
參考文獻
1 任務內容 設計一個基于單片機的電子萬年歷,能夠在數碼管顯示時間、日期、星期、鬧鐘、秒表等信息。并且具備通過獨立按鍵調整時間、日期、鬧鐘、自動判閏年、自動判斷星期等功能。 通過采用單片機內部定時器實現基礎時間單位的變化與獨立按鍵輸入; 采用C語言編寫主要功能(日歷程序、時間調整程序、顯示程序、按鍵掃描程序等),再在Keil uVision4 中進行調試,確保無問題后在實驗電路板上進行實物仿真調試。 2 系統框圖
圖2-1電子時鐘總體設計框圖
3 硬件電路圖 圖3-1電子時鐘硬件總電路圖 圖3-2電子時鐘數碼管電路圖 圖3-3電子時鐘獨立按鍵電路圖 圖3-4電子時鐘蜂鳴器電路圖
4 軟件流程圖 主程序流程圖: 主函數中循環等待按鍵與功能判斷,flag1(key1)為菜單鍵,可選擇3個功能模塊分別為校準時間,秒表和設置鬧鐘。flag2(key2)為分屏鍵,按一次可循環顯示年月日和星期(例如:2018-5-29 [2]),按二次為返回。主函數默認狀態下為顯示時分秒(例如:20-18-09),同時自動判斷鬧鐘時間是否到點,到點則蜂鳴器發出聲響,默認發出聲響連續時間為1分鐘,也可按下flag3(key3)強制關閉蜂鳴器。 
圖4-1電子時鐘主程序流程圖 校準時間/鬧鐘設置子流程圖: 校準時間功能模塊中flag2(key2)為移位鍵,控制當前校準的日期時間單位,并且此位會已局部閃屏的方式反饋給操作者。flag3(key3)與flag4 (key4)分別為加減和減鍵,控制當前日期時間單位的加減操作(設置鬧鐘模塊與之類似)。 
圖4-2電子時鐘校準時間/設置鬧鐘流程圖 秒表子流程圖: 秒表模塊中flag2(key2)為暫停或計數鍵控制秒表的暫停計時和開始計時,flag3(key3)為清零鍵控制秒表計數的清零操作。 
圖4-3電子時鐘秒表流程圖
中斷計時流程圖: 通過中斷控制進行時間的計時操作,不占用CPU,通過芯片內部晶振溢出計時,能夠較精準的計時。軟件程序中從日期時間單位的最小單位秒開始自動逐步更新但前的時間,年月日和星期。通過軟件程序與硬件的結合,較好的達到電子時鐘的功能和效果。 
圖4-4電子時鐘中斷計時流程圖
5 結束語 在此次電子時鐘的課程設計中,收獲良多。剛拿到課題時,就比較有興趣。大致想了一下思路,就開始著手寫代碼,因為這是第一次使用Keil uVision4軟件編寫程序,對該軟件的編譯環境和編碼規則不太了解。初始階段中運行程序出現了許許多多的問題,比如函數重復定義,變量重復定義,數組溢出,未定義變量,定義函數未調用等等,自己的思維不嚴謹寫完代碼總是一大堆錯誤和警告,通過慢慢調試,查找錯誤,并把自己的思維邏輯慢慢完善,最終解決了所有的錯誤與警告。時鐘的大至此我對Keil uVision4軟件也漸漸從陌生到熟悉。電子時鐘的大致的框架也基本完成了,但是該電子時鐘的功能比較單一,并且不太人性化。于是開始版本升級和優化代碼,加入一些其他附帶功能(如:鬧鐘,秒表,顯示星期等)和比較人性化的東西(如:循環顯示年月日和星期,帶閃屏提示的校準時間和設置鬧鐘,閏年判斷等)。然后,就是上試驗箱調自己的電子時鐘的實際效果與功能實現。第一次下載在實驗箱上運行的時候。很快就發現了問題,發現時間未變化。于是我就開始調試,發現管腳分配有問題,改完之后再次下載到實驗版觀察現象。發現實際效果與自己所希望的效果完全一樣。看著自己設計的電子時鐘得以實現,還是非常開心的。 回想這一路的設計到實現的過程,我們綜合那些理論知識來運用到設計和創新,同時還讓我們明白了一個團隊凝聚在一起時所能發揮出的巨大潛能! 在此次課程設計中我比較擅長C語言,有一定的編程能力。隊友比較擅長報告文檔的編寫,我們相互合作,一起交流,共同進步,完成了課程設計。隊友的編程能力得到了一定的提高,我的報告文檔編寫能力也得到了提高。此外通過查找大量資料,請教老師,以及不懈的努力,不僅培養了獨立思考、 動手制作的能力,在各種其它能力上也都有了一定的提高。更重要的是,在課程設計中,我們學會了很多學習的方法,知道了理論和實踐的巨大差別。而這是以后最實用的,真的是受益匪淺。要面對社會的挑戰,只有不斷的學習、實踐,再學習、再實踐。同時在與老師和同學的交流過程中,互動學習,將知識融會貫通。通過自己的努力,將自己的想要達到的效果都得以實現,做出了一個包含自己的想法的萬年歷,對以后的學習是一個莫大的鼓舞,激起了我的學習興趣和開發創新思維。
附錄1:實際效果圖
 圖1-1時-分-秒 顯示效果圖圖1-2年-月-日 [星期] 顯示效果圖(循環顯示) 附錄2:源程序 - //********************************************************************************************
- //主函數 main.c
- //********************************************************************************************
- #include "LED_595DISP.h"
- #include "keyboard.h"
- #include "timer.h"
- #include <intrins.h>
- sbit sound=P1^3;//蜂鳴器(LED燈代替)
- unsigned char xdata tem[20] ;//顯示中間轉換
- unsigned int xdata dy[6][2]={{0,0},{5,6},{8,9},{11,12},{14,15},{17,18}};//校準 設置鬧鐘 轉換
- unsigned int xdata LZX[6];//鬧鐘
- unsigned char i,j,bj;
- unsigned char wz;// 校準/設置 位置
- void Date_XS(void); //日期顯示
- void time_XS(void); //時間顯示
- void Delay500ms(void);//循環顯示延時
- void Delay21ms();//秒表延時
- void fuz(void); //附值函數 用于校準/設置
- void Date_LZ(void); //鬧鐘函數
- void Date_JZ(void); //校準函數
- int fmq(void);// 蜂鳴器啟動判斷
- void mbtemr(); //秒表計時
- void miaobiao(void);
- void main(void)
- {
- Timer0Init();
- while(1) //任務主循環
- { Key_scan(); //按鍵識別
- //實時顯示
- if(flag1) //菜單鍵
- {
- if(flag1==1)Date_JZ(); //功能1 校對時間
- if(flag1==2) miaobiao(); //功能2 秒表
- if(flag1==3)Date_LZ(); //功能3 設置鬧鐘
- }
- else if(flag2)Date_XS(); //查看日期 星期
- else time_XS(); //查看時間
- //蜂鳴器啟動判斷
- if(fmq())bj=150;
- if(flag3||flag4)bj=0; // 蜂鳴器啟器強制關閉
- if(bj){sound=0,bj--; } //或響應時間結束
- else sound=1;
-
- LED_Display();
- }
- }
- void time_XS(void)//時間顯示
- {
- tem[0]=Date[3]/10;
- tem[1]=Date[3]%10;
- tem[2]=17;
- tem[3]=Date[4]/10;
- tem[4]=Date[4]%10;
- tem[5]=17;
- tem[6]=Date[5]/10;
- tem[7]=Date[5]%10;
- for(i=0;i<8;i++)
- Dis_buf[i]=tem[i];
- Key_scan(); //按鍵識別
- LED_Display(); //實時顯示
- }
- void Date_XS(void) //日期 星期顯示
- {
- tem[0]=Date[0]/1000; //年
- tem[1]=Date[0]%1000/100;
- tem[2]=Date[0]%100/10;
- tem[3]=Date[0]%10;
- tem[4]=17;
- tem[5]=Date[1]/10; //月
- tem[6]=Date[1]%10;
- tem[7]=17;
- tem[8]=Date[2]/10; //日
- tem[9]=Date[2]%10;
- tem[10]=16;
- tem[11]=12;
- getxq();
- tem[12]=xq+1; //星期
- tem[13]=13;
- tem[14]=16;
- j=0;
- while(flag2)
- {
- for(i=0;i<8;i++)
- Dis_buf[i]=tem[(i+j)%15];
- LED_Display();
- Delay500ms();
- j=(j+1)%15;
- }
- }
- void Date_JZ(void)
- { unsigned char count1=0;fuz();wz=0;
- while(1)
- {
- Key_scan();
- if(flag1!=1){flag2=flag3=flag4=0;break;} //功能鍵(返回鍵)
- if(flag2){wz=(wz+1)%6;flag2=0;} //移位鍵
- if(flag3){Date[wz]++;flag3=0;} //加鍵
- if(flag4){Date[wz]--;flag4=0;} //減鍵
- //對更改數據進行 存儲更新
- if(wz==1){if(Date[wz]<0)Date[wz]=12;if(Date[wz]>12)Date[wz]=1;}
- if(wz==2)Date_gx();
- if(wz==3){if(Date[wz]<0)Date[wz]=23;if(Date[wz]>=24)Date[wz] =0;}
- if(wz==4||wz==5){if(Date[wz]<0)Date[wz]=59;if(Date[wz]>=60)Date[wz]=0;}
- //對更改數據進行 顯示更新
- if(wz==0) //更新 年
- {
- tem[0]=Date[0]/1000;
- tem[1]=Date[0]%1000/100;
- tem[2]=Date[0]%100/10;
- tem[3]=Date[0]%10;
- }
- else //更新其他
- {tem[dy[wz][0]]=Date[wz]/10;
- tem[dy[wz][1]]=Date[wz]%10;
- }
- //循環初始化
- if(wz==2)j=2;
- else if(wz>=3&&wz<=5)j=11;
- else j=0;
- //循環 帶閃 顯示
- for(i=0;i<8;i++)
- if(count1<5&&wz==0&&(i+j)%20==0)Dis_buf[i]=Dis_buf[i+1]=Dis_buf[i+2]=Dis_buf[i+3]=16,i=3;
- else if(count1<5&&dy[wz][0]==(i+j)%20)Dis_buf[i]=Dis_buf[i+1]=16,i++;
- else Dis_buf[i]=tem[(j+i)%20];
- if(count1==40)count1=0;//每40 顯示 5 單位時間
- count1++;
- LED_Display(); //實時顯示
-
- }
- }
復制代碼 篇幅有限 子函數與完整程序在壓縮包中
0.png (43.26 KB, 下載次數: 44)
下載附件
2018-10-14 14:36 上傳
全部資料51hei下載地址:
單片機電子萬年歷設計.rar
(6.19 MB, 下載次數: 161)
2018-10-14 14:08 上傳
點擊文件名下載附件
基于STC15W4K58S4單片機的電子萬年歷 下載積分: 黑幣 -5
|