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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2334|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

我的單片機(jī)電子時(shí)鐘設(shè)計(jì) 含源碼,仿真原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我上個(gè)月所做的單片機(jī)電子時(shí)鐘仿真設(shè)計(jì)
keil4和proteus8進(jìn)行模擬仿真
都是自己原創(chuàng)的請(qǐng)大家多多指教,批評(píng)指正!

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


單片機(jī)源程序如下:
  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. //按鍵是否按下的標(biāo)志位,按下為1,沒(méi)按下為0
  10. bit  isKey0 = 0; //修改
  11. bit  isKey1 = 0; //增加---修改顯示
  12. bit  isKey2 = 0; //減少
  13. bit  isKey3 = 0; //確認(rèn)

  14. //0 正常顯示狀態(tài)  1 修改時(shí)間狀態(tài)
  15. bit  changeOrNormalState = 0;
  16. //顯示模式 0 顯示正常時(shí)分秒  1 顯示正常年月日  2 顯示修改時(shí)間下的時(shí)分秒  3顯示修改時(shí)間下的年月日
  17. u8   showMode = 0;
  18. //正在修改的變量 0 秒 1 分 2 時(shí) 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   根據(jù)顯示狀態(tài)變量,修改現(xiàn)在的顯示變量
  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   按鍵按下時(shí),各個(gè)狀態(tài)值變1
  81.   * @param   mode: 1 連續(xù) 0 不連續(xù)
  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   按鍵按下后的執(zhí)行函數(shù)
  109.   * @param   : [輸入/出]
  110.   * @retval  返回值
  111.   */
  112. void ClockChangeFunction()
  113. {
  114.         if(isKey0 == 1)
  115.         {
  116.                 isKey0 = 0;
  117.                 if(changeCount == 0 && changeOrNormalState == 0)//修改的位選為0,即為秒,同時(shí)顯示狀態(tài)為正常顯示狀態(tài)下
  118.                 {
  119.                         changeOrNormalState = 1;//顯示狀態(tài)改為修改時(shí)間模式
  120.                         DataTempGet();//獲取修改前的時(shí)間變量值
  121.                         showMode = 2;//顯示模式為顯示修改時(shí)間下的時(shí)分秒
  122.                 }else if(changeOrNormalState == 1)//假如為顯示模式
  123.                 {
  124.                         changeCount++;//按鍵按下位次++
  125.                         if(changeCount > 5)
  126.                                 changeCount = 0;
  127.                         if(changeCount > 2)//時(shí)分秒是0、1、2,大于2就要換成年月日顯示
  128.                                 showMode = 3;//顯示模式為顯示修改時(shí)間下的年月日
  129.                         else
  130.                                 showMode = 2;
  131.                 }
  132.         }else if(isKey1 == 1)
  133.         {
  134.                 isKey1 = 0;
  135.                 if(changeOrNormalState == 1)//顯示狀態(tài)為修改時(shí)間模式
  136.                 {
  137.                         dataAdd();//對(duì)應(yīng)位次時(shí)間變量增加
  138.                 }else //正常顯示模式
  139.                 {
  140.                         if(showMode == 0)//切換時(shí)間和日期的顯示
  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;//變?yōu)檎o@示模式
  158.                         ds1302writetime();//寫入修改后的時(shí)間
  159.                         showMode = 0;//顯示模式為時(shí)分秒
  160.                         changeCount = 0;//修改位次歸零
  161.                 }
  162.         }
  163. }

  164. /**
  165.   * @name    DataTempGet
  166.   * @brief   修改按鍵按下后,將現(xiàn)在的時(shí)間,放入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   增加按鍵按下后,時(shí)間變量的變化方式,主要是有個(gè)平閏年的處理,其他都比較正常
  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   減少按鍵按下后,時(shí)間變量的變化方式
  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   修改時(shí)間模式下,選中的時(shí)間變量閃爍
  316.   * @param   : [輸入/出]
  317.   * @retval  返回值
  318.   */
  319. void dataBlink()
  320. {
  321.         static u8  blinkCount = 0;
  322. ……………………

  323. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:529213 發(fā)表于 2023-3-10 23:05 來(lái)自手機(jī) | 只看該作者
樓主大神級(jí)別,做得非常漂亮,厲害了
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线播放 | 精品久久久久久久久久久 | 99久久99热这里只有精品 | 蜜桃精品噜噜噜成人av | 九九精品久久久 | 国产成人免费在线 | 日韩一区二区在线观看 | 国产成人精品一区二区三区四区 | 成人午夜网站 | 亚洲成人精品在线 | 欧美国产视频 | 欧美三区视频 | 欧美精品一区二区三区蜜桃视频 | 久久精品99 | 一区二区三区网站 | 91国内精品 | 久久黄色 | 日韩一区二 | 日本一本在线 | 亚洲一区二区三区国产 | 亚洲高清一区二区三区 | 久久大陆 | 国产美女福利在线观看 | 亚州综合一区 | 日韩二区 | 性色的免费视频 | 日韩国产在线 | 日韩免费高清视频 | 一区二区视频免费观看 | 国产综合久久久久久鬼色 | 久久中文一区二区 | 91偷拍精品一区二区三区 | 草久久久 | 丁香婷婷久久久综合精品国产 | 久久青青| 亚洲一区二区电影在线观看 | 久久久久国产一区二区三区四区 | 亚洲福利网站 | xxxxx黄色片 欧美一区免费 | 国产精品1区 | 欧美福利网站 |