久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13450|回復: 6
打印 上一主題 下一主題
收起左側

基于STC15W4K58S4單片機的電子萬年歷設計源碼與報告(數碼管顯示)

  [復制鏈接]
跳轉到指定樓層
樓主
基于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:源程序
  1. //********************************************************************************************
  2. //主函數 main.c
  3. //********************************************************************************************
  4. #include "LED_595DISP.h"         
  5. #include "keyboard.h"
  6. #include "timer.h"  
  7. #include <intrins.h>
  8. sbit sound=P1^3;//蜂鳴器(LED燈代替)
  9. unsigned char xdata tem[20] ;//顯示中間轉換
  10. unsigned int xdata dy[6][2]={{0,0},{5,6},{8,9},{11,12},{14,15},{17,18}};//校準 設置鬧鐘 轉換
  11. unsigned int xdata LZX[6];//鬧鐘
  12. unsigned char i,j,bj;
  13. unsigned char wz;//        校準/設置  位置
  14. void Date_XS(void);         //日期顯示
  15. void time_XS(void);          //時間顯示
  16. void Delay500ms(void);//循環顯示延時
  17. void Delay21ms();//秒表延時
  18. void fuz(void);        //附值函數 用于校準/設置
  19. void Date_LZ(void);        //鬧鐘函數
  20. void Date_JZ(void);        //校準函數
  21. int fmq(void);// 蜂鳴器啟動判斷
  22. void mbtemr(); //秒表計時
  23. void miaobiao(void);
  24. void  main(void)  
  25. {
  26.     Timer0Init();
  27.     while(1)           //任務主循環  
  28.   {  Key_scan();     //按鍵識別
  29.                    //實時顯示
  30.                  if(flag1) //菜單鍵
  31.                  {
  32.                        if(flag1==1)Date_JZ(); //功能1 校對時間
  33.                            if(flag1==2) miaobiao(); //功能2 秒表
  34.                            if(flag1==3)Date_LZ(); //功能3 設置鬧鐘
  35.                  }           
  36.                 else if(flag2)Date_XS(); //查看日期 星期
  37.                  else time_XS();          //查看時間
  38.             //蜂鳴器啟動判斷
  39.                 if(fmq())bj=150;
  40.                 if(flag3||flag4)bj=0;  // 蜂鳴器啟器強制關閉
  41.                  if(bj){sound=0,bj--; } //或響應時間結束
  42.                   else sound=1;
  43.                  
  44.                  LED_Display();
  45.     }      
  46. }
  47. void time_XS(void)//時間顯示
  48. {
  49.              tem[0]=Date[3]/10;
  50.                          tem[1]=Date[3]%10;
  51.                          tem[2]=17;
  52.                          tem[3]=Date[4]/10;
  53.                          tem[4]=Date[4]%10;
  54.                          tem[5]=17;
  55.                          tem[6]=Date[5]/10;
  56.                          tem[7]=Date[5]%10;
  57.                   for(i=0;i<8;i++)
  58.                   Dis_buf[i]=tem[i];  
  59.                   Key_scan();     //按鍵識別
  60.                   LED_Display();  //實時顯示

  61. }
  62. void Date_XS(void) //日期  星期顯示
  63. {
  64.              tem[0]=Date[0]/1000;          //年
  65.                          tem[1]=Date[0]%1000/100;
  66.                          tem[2]=Date[0]%100/10;
  67.                          tem[3]=Date[0]%10;
  68.                          tem[4]=17;
  69.                          tem[5]=Date[1]/10;          //月
  70.                          tem[6]=Date[1]%10;
  71.                          tem[7]=17;
  72.                          tem[8]=Date[2]/10;         //日
  73.                          tem[9]=Date[2]%10;
  74.                          tem[10]=16;
  75.                          tem[11]=12;
  76.                          getxq();
  77.                          tem[12]=xq+1;                //星期
  78.                          tem[13]=13;
  79.                  tem[14]=16;
  80.                                   j=0;
  81.                           while(flag2)
  82.                          {
  83.                           for(i=0;i<8;i++)
  84.                     Dis_buf[i]=tem[(i+j)%15];
  85.                           LED_Display();
  86.                          Delay500ms();
  87.                                  j=(j+1)%15;
  88.                          }         
  89. }
  90. void Date_JZ(void)
  91. { unsigned char count1=0;fuz();wz=0;
  92.         while(1)
  93.         {  
  94.              Key_scan();
  95.                  if(flag1!=1){flag2=flag3=flag4=0;break;} //功能鍵(返回鍵)
  96.                  if(flag2){wz=(wz+1)%6;flag2=0;}  //移位鍵
  97.                  if(flag3){Date[wz]++;flag3=0;}          //加鍵
  98.                  if(flag4){Date[wz]--;flag4=0;}         //減鍵
  99.                  //對更改數據進行 存儲更新
  100.                  if(wz==1){if(Date[wz]<0)Date[wz]=12;if(Date[wz]>12)Date[wz]=1;}
  101.                  if(wz==2)Date_gx();
  102.                  if(wz==3){if(Date[wz]<0)Date[wz]=23;if(Date[wz]>=24)Date[wz] =0;}
  103.                  if(wz==4||wz==5){if(Date[wz]<0)Date[wz]=59;if(Date[wz]>=60)Date[wz]=0;}
  104.                   //對更改數據進行 顯示更新
  105.                   if(wz==0)         //更新 年
  106.                         {
  107.                          tem[0]=Date[0]/1000;
  108.                          tem[1]=Date[0]%1000/100;
  109.                          tem[2]=Date[0]%100/10;
  110.                          tem[3]=Date[0]%10;
  111.                         }
  112.                         else                 //更新其他
  113.                         {tem[dy[wz][0]]=Date[wz]/10;
  114.                          tem[dy[wz][1]]=Date[wz]%10;
  115.                         }
  116.                 //循環初始化
  117.                         if(wz==2)j=2;
  118.                         else if(wz>=3&&wz<=5)j=11;
  119.                         else j=0;         
  120.                 //循環 帶閃 顯示
  121.                   for(i=0;i<8;i++)
  122.                   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;
  123.                         else if(count1<5&&dy[wz][0]==(i+j)%20)Dis_buf[i]=Dis_buf[i+1]=16,i++;
  124.                           else Dis_buf[i]=tem[(j+i)%20];
  125.                           if(count1==40)count1=0;//每40  顯示 5 單位時間
  126.                             count1++;
  127.                           LED_Display();  //實時顯示
  128.                  
  129.         }
  130. }
復制代碼
篇幅有限 子函數與完整程序在壓縮包中



全部資料51hei下載地址:
單片機電子萬年歷設計.rar (6.19 MB, 下載次數: 161)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:555676 發表于 2019-6-9 10:15 | 只看該作者
挺不錯的呀
回復

使用道具 舉報

板凳
ID:47293 發表于 2019-7-25 19:17 | 只看該作者
資料齊全完整,感謝樓主分享
回復

使用道具 舉報

地板
ID:671658 發表于 2019-12-23 19:48 | 只看該作者
厲害丫,真的棒。
回復

使用道具 舉報

5#
ID:675096 發表于 2019-12-28 09:05 | 只看該作者
感謝感謝,這網站太好用了.感謝樓主的分享
回復

使用道具 舉報

6#
ID:1139636 發表于 2024-12-13 17:42 | 只看該作者
太高級了,感謝樓主的分享
回復

使用道具 舉報

7#
ID:1139727 發表于 2024-12-14 14:55 | 只看該作者
太厲害了 感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产精品 | 91高清在线视频 | 久草色视频| 欧美激情亚洲天堂 | 日韩免费在线观看视频 | 爱综合 | 久久成人精品视频 | 一区二区在线免费观看视频 | 夜夜夜夜夜夜曰天天天 | 午夜视频免费在线观看 | 国产激情一区二区三区 | 天天干天天爽 | 精品国产欧美一区二区三区不卡 | 精品在线99 | 日韩一区二| 欧美1区 | 在线国产视频 | www.788.com色淫免费 | 国产日韩视频在线 | 狠狠操天天操 | 亚洲一区视频在线 | 亚洲黄色国产 | 免费国产一区二区视频 | 香蕉视频一区二区 | 欧美综合色 | 免费影视在线观看 | 亚洲天堂中文字幕 | 在线视频成人 | 午夜视频精品 | 91国自视频| 国产欧美精品区一区二区三区 | av毛片 | 亚洲视频二区 | 国产亚洲精品久久yy50 | 天天综合国产 | 国产一区二区三区不卡av | 成人av一区二区三区 | av网站免费观看 | 精品国产区| 亚洲视频免费 | 国产成人精品久久二区二区91 |