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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我的單片機電子時鐘設計 含源碼,仿真原理圖

[復制鏈接]
跳轉到指定樓層
樓主
這是我上個月所做的單片機電子時鐘仿真設計
keil4和proteus8進行模擬仿真
都是自己原創的請大家多多指教,批評指正!

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include "main.h"

  3. #include "seg.h"
  4. #include "ds1302.h"

  5. sbit KEY0 = P3^4;
  6. sbit KEY1 = P3^5;
  7. sbit KEY2 = P3^6;
  8. sbit KEY3 = P3^7;

  9. //按鍵是否按下的標志位,按下為1,沒按下為0
  10. bit  isKey0 = 0; //修改
  11. bit  isKey1 = 0; //增加---修改顯示
  12. bit  isKey2 = 0; //減少
  13. bit  isKey3 = 0; //確認

  14. //0 正常顯示狀態  1 修改時間狀態
  15. bit  changeOrNormalState = 0;
  16. //顯示模式 0 顯示正常時分秒  1 顯示正常年月日  2 顯示修改時間下的時分秒  3顯示修改時間下的年月日
  17. u8   showMode = 0;
  18. //正在修改的變量 0 秒 1 分 2 時 3 日 4 月 5 年
  19. u8   changeCount = 0;

  20. void Timer0Init(void);
  21. void segBuffChange(void);
  22. void ClockChangeFunction(void);
  23. void dataAdd(void);
  24. void dataSub(void);
  25. void DataTempGet(void);

  26. void main()
  27. {
  28.         ds1302init();
  29.         Timer0Init();
  30.         while(1)
  31.         {
  32.                 ds1302readtime();
  33.                 ClockChangeFunction();
  34.         }
  35. }

  36. /**
  37.   * @name    SegBuffChange
  38.   * @brief   根據顯示狀態變量,修改現在的顯示變量
  39.   * @param   : [輸入/出]
  40.   * @retval  返回值
  41.   */
  42. void SegBuffChange()
  43. {
  44.         if(showMode == 0)
  45.         {
  46.                 segBuff[5] = second%10;
  47.                 segBuff[4] = second/10;
  48.                 segBuff[3] = minute%10;
  49.                 segBuff[2] = minute/10;
  50.                 segBuff[1] = hour%10;
  51.                 segBuff[0] = hour/10;
  52.         }else if(showMode == 1)
  53.         {
  54.                 segBuff[5] = day%10;
  55.                 segBuff[4] = day/10;
  56.                 segBuff[3] = month%10;
  57.                 segBuff[2] = month/10;
  58.                 segBuff[1] = year%10;
  59.                 segBuff[0] = year/10;
  60.         }else if(showMode == 2)
  61.         {
  62.                 segBuff[5] = secondTemp%10;
  63.                 segBuff[4] = secondTemp/10;
  64.                 segBuff[3] = minuteTemp%10;
  65.                 segBuff[2] = minuteTemp/10;
  66.                 segBuff[1] = hourTemp%10;
  67.                 segBuff[0] = hourTemp/10;
  68.         }else if(showMode == 3)
  69.         {
  70.                 segBuff[5] = dayTemp%10;
  71.                 segBuff[4] = dayTemp/10;
  72.                 segBuff[3] = monthTemp%10;
  73.                 segBuff[2] = monthTemp/10;
  74.                 segBuff[1] = yearTemp%10;
  75.                 segBuff[0] = yearTemp/10;
  76.         }
  77. }

  78. /**
  79.   * @name    KeyScan
  80.   * @brief   按鍵按下時,各個狀態值變1
  81.   * @param   mode: 1 連續 0 不連續
  82.   * @retval  返回值
  83.   */
  84. void KeyScan(u8 mode)
  85. {
  86.     static int keyCount = 0;
  87.     static int keyState = 0;
  88.     if(mode == 1) keyState=0;
  89.     if (keyState == 0 && (KEY0 == 0||KEY1 == 0||KEY2 == 0||KEY3 == 0))
  90.     {
  91.         keyCount++;
  92.         if(keyCount>2)
  93.         {
  94.             keyState = 1;
  95.             keyCount=0;
  96.             if(KEY0 == 0) isKey0 = 1;
  97.             else if(KEY1 == 0) isKey1 = 1;
  98.                         else if(KEY2 == 0) isKey2 = 1;
  99.                         else if(KEY3 == 0) isKey3 = 1;
  100.         }
  101.     } else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && KEY3 == 1)
  102.     {
  103.         keyState = 0;
  104.     }
  105. }

  106. /**
  107.   * @name    ClockChangeFunction
  108.   * @brief   按鍵按下后的執行函數
  109.   * @param   : [輸入/出]
  110.   * @retval  返回值
  111.   */
  112. void ClockChangeFunction()
  113. {
  114.         if(isKey0 == 1)
  115.         {
  116.                 isKey0 = 0;
  117.                 if(changeCount == 0 && changeOrNormalState == 0)//修改的位選為0,即為秒,同時顯示狀態為正常顯示狀態下
  118.                 {
  119.                         changeOrNormalState = 1;//顯示狀態改為修改時間模式
  120.                         DataTempGet();//獲取修改前的時間變量值
  121.                         showMode = 2;//顯示模式為顯示修改時間下的時分秒
  122.                 }else if(changeOrNormalState == 1)//假如為顯示模式
  123.                 {
  124.                         changeCount++;//按鍵按下位次++
  125.                         if(changeCount > 5)
  126.                                 changeCount = 0;
  127.                         if(changeCount > 2)//時分秒是0、1、2,大于2就要換成年月日顯示
  128.                                 showMode = 3;//顯示模式為顯示修改時間下的年月日
  129.                         else
  130.                                 showMode = 2;
  131.                 }
  132.         }else if(isKey1 == 1)
  133.         {
  134.                 isKey1 = 0;
  135.                 if(changeOrNormalState == 1)//顯示狀態為修改時間模式
  136.                 {
  137.                         dataAdd();//對應位次時間變量增加
  138.                 }else //正常顯示模式
  139.                 {
  140.                         if(showMode == 0)//切換時間和日期的顯示
  141.                                 showMode = 1;
  142.                         else if(showMode == 1)
  143.                                 showMode = 0;
  144.                 }
  145.         }else if(isKey2 == 1)
  146.         {
  147.                 isKey2 = 0;
  148.                 if(changeOrNormalState == 1)//和增加一樣
  149.                 {
  150.                         dataSub();
  151.                 }
  152.         }else if(isKey3 == 1)
  153.         {
  154.                 isKey3 = 0;
  155.                 if(changeOrNormalState == 1)//在修改模式下按下
  156.                 {
  157.                         changeOrNormalState = 0;//變為正常顯示模式
  158.                         ds1302writetime();//寫入修改后的時間
  159.                         showMode = 0;//顯示模式為時分秒
  160.                         changeCount = 0;//修改位次歸零
  161.                 }
  162.         }
  163. }

  164. /**
  165.   * @name    DataTempGet
  166.   * @brief   修改按鍵按下后,將現在的時間,放入temp中
  167.   * @param   : [輸入/出]
  168.   * @retval  返回值
  169.   */
  170. void DataTempGet()
  171. {
  172.         secondTemp = second;
  173.         minuteTemp = minute;
  174.         hourTemp   = hour;
  175.         dayTemp    = day;
  176.         monthTemp  = month;
  177.         weekTemp   = week;
  178.         yearTemp   = year;
  179. }

  180. /**
  181.   * @name    dataAdd
  182.   * @brief   增加按鍵按下后,時間變量的變化方式,主要是有個平閏年的處理,其他都比較正常
  183.   * @param   : [輸入/出]
  184.   * @retval  返回值
  185.   */
  186. void dataAdd()
  187. {
  188.         if(changeCount == 0)
  189.         {
  190.                 secondTemp ++;
  191.                 if(secondTemp > 59)
  192.                         secondTemp = 0;
  193.         }else if(changeCount == 1)
  194.         {
  195.                 minuteTemp ++;
  196.                 if(minuteTemp > 59)
  197.                         minuteTemp = 0;
  198.         }else if(changeCount == 2)
  199.         {
  200.                 hourTemp ++;
  201.                 if(hourTemp > 23)
  202.                         hourTemp = 0;
  203.         }else if(changeCount == 3)
  204.         {
  205.                 dayTemp ++;
  206.                 if(monthTemp == 1 || monthTemp == 3 || monthTemp == 5 || monthTemp == 7 || monthTemp == 8 || monthTemp == 10 || monthTemp == 12)
  207.                 {
  208.                         if(dayTemp > 31)
  209.                                 dayTemp = 1;
  210.                 }else if(monthTemp == 3 || monthTemp == 6 || monthTemp == 9 || monthTemp == 11)
  211.                 {
  212.                         if(dayTemp > 30)
  213.                                 dayTemp = 1;
  214.                 }else if(monthTemp == 2)
  215.                 {
  216.                         if((2000+year)%400==0)
  217.                         {
  218.                                 if(dayTemp > 29)
  219.                                         dayTemp = 1;
  220.                         }
  221.                         else
  222.                         {
  223.                                 if((2000+year)%4==0&&(2000+year)%100!=0)
  224.                                 {
  225.                                         if(dayTemp > 29)
  226.                                                 dayTemp = 1;
  227.                                 }else
  228.                                 {
  229.                                         if(dayTemp > 28)
  230.                                                 dayTemp = 1;
  231.                                 }
  232.                         }
  233.                 }
  234.         }else if(changeCount == 4)
  235.         {
  236.                 monthTemp ++;
  237.                 if(monthTemp > 12)
  238.                         monthTemp = 1;
  239.         }else if(changeCount == 5)
  240.         {
  241.                 yearTemp ++;
  242.                 if(yearTemp > 99)
  243.                         yearTemp = 0;
  244.         }
  245. }

  246. /**
  247.   * @name    dataSub
  248.   * @brief   減少按鍵按下后,時間變量的變化方式
  249.   * @param   : [輸入/出]
  250.   * @retval  返回值
  251.   */
  252. void dataSub()
  253. {
  254.         if(changeCount == 0)
  255.         {
  256.                 secondTemp --;
  257.                 if((char)secondTemp < 0)
  258.                         secondTemp = 59;
  259.         }else if(changeCount == 1)
  260.         {
  261.                 minuteTemp --;
  262.                 if((char)minuteTemp < 0)
  263.                         minuteTemp = 59;
  264.         }else if(changeCount == 2)
  265.         {
  266.                 hourTemp --;
  267.                 if((char)hourTemp < 0)
  268.                         hourTemp = 23;
  269.         }else if(changeCount == 3)
  270.         {
  271.                 dayTemp --;
  272.                 if(monthTemp == 1 || monthTemp == 3 || monthTemp == 5 || monthTemp == 7 || monthTemp == 8 || monthTemp == 10 || monthTemp == 12)
  273.                 {
  274.                         if(dayTemp < 1)
  275.                                 dayTemp = 31;
  276.                 }else if(monthTemp == 3 || monthTemp == 6 || monthTemp == 9 || monthTemp == 11)
  277.                 {
  278.                         if(dayTemp < 1)
  279.                                 dayTemp = 30;
  280.                 }else if(monthTemp == 2)
  281.                 {
  282.                         if((2000+year)%400==0)
  283.                         {
  284.                                 if(dayTemp < 1)
  285.                                         dayTemp = 29;
  286.                         }
  287.                         else
  288.                         {
  289.                                 if((2000+year)%4==0&&(2000+year)%100!=0)
  290.                                 {
  291.                                         if(dayTemp < 1)
  292.                                                 dayTemp = 29;
  293.                                 }else
  294.                                 {
  295.                                         if(dayTemp < 1)
  296.                                                 dayTemp = 28;
  297.                                 }
  298.                         }
  299.                        
  300.                 }
  301.         }else if(changeCount == 4)
  302.         {
  303.                 monthTemp --;
  304.                 if(monthTemp < 1)
  305.                         monthTemp = 12;
  306.         }else if(changeCount == 5)
  307.         {
  308.                 yearTemp --;
  309.                 if((char)yearTemp < 0)
  310.                         yearTemp = 99;
  311.         }
  312. }

  313. /**
  314.   * @name    dataBlink
  315.   * @brief   修改時間模式下,選中的時間變量閃爍
  316.   * @param   : [輸入/出]
  317.   * @retval  返回值
  318.   */
  319. void dataBlink()
  320. {
  321.         static u8  blinkCount = 0;
  322. ……………………

  323. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼與Proteus8.9仿真下載:
1、基于51單片機的電子時鐘設計.zip (221.99 KB, 下載次數: 55)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:529213 發表于 2023-3-10 23:05 來自手機 | 只看該作者
樓主大神級別,做得非常漂亮,厲害了
回復

使用道具 舉報

板凳
ID:1126493 發表于 2024-7-5 16:57 | 只看該作者
樓主這個代碼解決燃眉之急了,謝謝樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品视频 | 国产成人午夜精品影院游乐网 | 中文字幕成人免费视频 | 亚av在线 | 国产高清一区二区三区 | 人人九九精 | av影音资源| 国产日韩欧美精品一区二区三区 | 一区二区三区视频在线观看 | 天天综合网7799精品 | 欧美激情综合五月色丁香小说 | 无码一区二区三区视频 | 亚洲欧美一区二区三区在线 | 久久99精品国产自在现线小黄鸭 | 久久久久亚洲 | 极品粉嫩国产48尤物在线播放 | 久久国内精品 | 国产区在线免费观看 | 国产视频福利一区 | 精品一区二区三区在线观看国产 | 欧美日在线 | 91天堂网 | 日韩av免费在线观看 | 欧美成人一区二区三区片免费 | 黄色av网站在线免费观看 | 99久久精品免费看国产高清 | 久久33| av免费成人| 九九久久在线看 | 国内自拍视频在线观看 | 成人片免费看 | 999精品视频| 中文字幕二区三区 | 久久久久久久久国产成人免费 | 91麻豆产精品久久久久久 | 亚洲第一网站 | 亚洲小视频 | www.色午夜.com| 亚洲成在线观看 | 99成人在线视频 | 操到爽|