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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為什么鬧鐘響了之后秒數不會轉動而且時間有時快有時慢?附單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:924233 發表于 2021-6-21 21:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
9黑幣
能不能幫我看一下,先謝謝
單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define LCD1602_DB  P0 //定義1602的DB口為P0口
  6. uchar code table[]="CurrentTime"; //當前時間
  7. uchar code table1[]="00:00:00";
  8. uchar key1Flag = 0;//定義按鍵關閉符
  9. uchar key2Flag = 0;
  10. uchar key3Flag = 0;
  11. uchar key4Flag = 0;
  12. uchar count = 0;
  13. uchar sec = 57;//秒
  14. uchar min = 59;//分
  15. uchar hour = 9;//小時
  16. uchar clockHour = 0;//鬧鐘小時
  17. uchar clockMin = 0;//分
  18. uchar clockFlag = 0;// 定義鬧鐘關閉符
  19. uchar beepNum = 0;//聲音
  20. uchar temp=0;
  21. uchar shijian=0;
  22. sbit LCD1602_RS = P2^0;        //指令1/數據0選擇端
  23. sbit LCD1602_RW = P2^1;        //讀1寫0選擇端
  24. sbit LCD1602_E = P2^2;        //讀1寫0使能端
  25. sbit Key1 = P1^0;//定義鍵位符
  26. sbit Key2 = P1^1;
  27. sbit Key3 = P1^2;
  28. sbit Key4 = P1^3;
  29. sbit Speaker = P2^5;//定義蜂鳴器
  30. sbit LED=P2^4;
  31. void Delay1ms()                //@12.000MHz
  32. {
  33.         uchar i, j;

  34.         i = 12;
  35.         j = 169;
  36.         do
  37.         {
  38.                 while (--j);
  39.         } while (--i);
  40. }
  41. void Delay20ms()                //@12.000MHz
  42. {
  43.         uchar i, j, k;

  44.         _nop_();
  45.         _nop_();
  46.         i = 1;
  47.         j = 234;
  48.         k = 113;
  49.         do
  50.         {
  51.                 do
  52.                 {
  53.                         while (--k);
  54.                 } while (--j);
  55.         } while (--i);
  56. }
  57. void delay()
  58. {
  59.     unsigned int a;
  60.         while(a--);
  61. }
  62. void Beep()         //蜂鳴器警報
  63. {                                 
  64.         Speaker = 0;
  65.         Delay20ms();
  66.         Speaker = 1;
  67. }
  68. void LcdWaitReady()         //檢查LCD忙函數
  69. {

  70.         uchar sta;
  71.         LCD1602_DB = 0xFF;
  72.         LCD1602_RS = 0;
  73.         LCD1602_RW = 1;
  74.         do        {
  75.                 LCD1602_E = 1;
  76.                 sta = LCD1602_DB;
  77.                 LCD1602_E = 0;
  78.         }while(sta & 0x80);
  79. }

  80. void LcdWriteCmd(uchar cmd)        //寫命令函數
  81. {

  82.         LcdWaitReady();
  83.         LCD1602_RS = 0;
  84.         LCD1602_RW = 0;
  85.         LCD1602_DB = cmd;
  86.         LCD1602_E = 1;
  87.         LCD1602_E = 0;
  88. }
  89. void LcdWriteDat(uchar dat)        //寫數據函數
  90. {

  91.         LcdWaitReady();
  92.         LCD1602_RS = 1;
  93.         LCD1602_RW = 0;
  94.         LCD1602_DB = dat;
  95.         LCD1602_E = 1;
  96.         LCD1602_E = 0;
  97. }
  98. void LcdSetCursor(uchar x, uchar y)//時間設置
  99. {

  100.         uchar addr;
  101.         if(y == 0)
  102.                 addr = 0x00 + x;
  103.         else
  104.                 addr = 0x40 + x;
  105.         LcdWriteCmd(addr | 0x80);
  106. }
  107. void LcdShowStr(uchar x, uchar y, uchar *str)
  108. {

  109.         LcdSetCursor(x, y);
  110.         while(*str != '\0')
  111.         {
  112.                 LcdWriteDat(*str++);   
  113.         }
  114. }
  115. void InitLcd1602()//初始化LCD函數         
  116. {

  117.         LcdWriteCmd(0x01);
  118.         LcdWriteCmd(0x38);
  119.         LcdWriteCmd(0x0c);
  120.         LcdWriteCmd(0x06);
  121. }
  122. void WriteAddress(uchar x)
  123. {
  124.          LcdWriteCmd(0x80 + x);
  125. }
  126. void DisplayMinTens()   //顯示分十位
  127. {                                
  128.         WriteAddress(0x49);
  129.         LcdWriteDat((min / 10) + '0');
  130.         Delay1ms();
  131. }
  132. void DisplayMinUnits()          //顯示分個位
  133. {                    
  134.         WriteAddress(0x4A);
  135.         LcdWriteDat((min % 10) + '0');
  136.         Delay1ms();        
  137. }
  138. void DisplayHourTens()   //顯示時十位
  139. {                                
  140.         WriteAddress(0x46);
  141.         LcdWriteDat((hour / 10) + '0');
  142.         Delay1ms();
  143. }
  144. void DisplayHourUnits()//顯示時個位
  145. {                     
  146.         WriteAddress(0x47);
  147.         LcdWriteDat((hour % 10) + '0');
  148.         Delay1ms();        
  149. }
  150. void DisplayClkMinTens()  //顯示鬧鐘分十位
  151. {                                 
  152.         WriteAddress(0x49);
  153.         LcdWriteDat((clockMin / 10) + '0');
  154.         Delay1ms();
  155. }
  156. void DisplayClkMinUnits() //顯示鬧鐘分個位
  157. {                     
  158.         WriteAddress(0x4A);
  159.         LcdWriteDat((clockMin % 10) + '0');
  160.         Delay1ms();        
  161. }
  162. void DisplayClkHourTens()  //顯示鬧鐘時十位
  163. {                        
  164.         WriteAddress(0x46);
  165.         LcdWriteDat((clockHour / 10) + '0');
  166.         Delay1ms();
  167. }
  168. void DisplayClkHourUnits() //顯示鬧鐘時個位
  169. {                     
  170.         WriteAddress(0x47);
  171.         LcdWriteDat((clockHour % 10) + '0');
  172.         Delay1ms();        
  173. }
  174. void DisplayClkSecTens() //顯示秒十位
  175. {                     
  176.         WriteAddress(0x4C);
  177.         LcdWriteDat((sec / 10) + '0');
  178.         Delay1ms();        
  179. }
  180. void DisplayClkSecUnits() //顯示秒個位
  181. {                        
  182.         WriteAddress(0x4D);
  183.         LcdWriteDat((sec % 10) + '0');
  184.         Delay1ms();        
  185. }

  186. void ScanKey4()
  187. {
  188.         if((Key4 == 0)&(clockFlag ==1))
  189.         {
  190.                 Delay20ms();
  191.                 if((Key4 == 0)&(clockFlag ==1))
  192.                  {
  193.                         clockFlag = 0;
  194.                         beepNum = 0;
  195.                         key4Flag = 0;
  196.                 }
  197.         }
  198. }
  199. void InitTimer0()//初始化定時器0
  200. {                                 
  201.         TMOD = 0x11;
  202.         TH0 = (65536 - 50000) / 256;
  203.         TL0 = (65536 - 50000) % 256;
  204.         TH1 = (65536 - 50000) / 256;
  205.         TL1 = (65536 - 50000) % 256;
  206.         ET1=1;
  207.    ET0=1;
  208.         EA = 1;
  209.         PT0=1;
  210.         TR0=1;
  211.         TR1=1;
  212.         
  213.                
  214. }
  215. void main()//主函數
  216. {

  217.         InitLcd1602();
  218.         LcdShowStr(0,0,table);
  219.         LcdShowStr(6,1,table1);
  220.         InitTimer0();
  221.         while(1)
  222.          {
  223.                 if(sec == 60)
  224.                 {
  225.                 sec = 0;
  226.                 min++;
  227.                 }
  228.                 if(min == 60)
  229.                  {
  230.                         min = 0;
  231.                         hour++;
  232.                 }
  233.                 if(hour == 24)
  234.                  {
  235.                         hour = 0;
  236.                 }
  237.                 LcdShowStr(0,0,table);
  238.                 DisplayHourTens();
  239.                 DisplayHourUnits();
  240.                 LcdShowStr(8,1,":");               
  241.                 DisplayMinTens();
  242.                 DisplayMinUnits();
  243.                 LcdShowStr(11,1,":");
  244.                 DisplayClkSecUnits();
  245.                 DisplayClkSecTens();
  246. //==============================================================        
  247.                 if((Key1 == 0)&(key1Flag == 0)) {              //設置當前時間
  248.                         Delay20ms();
  249.                         if((Key1 == 0)&(key1Flag == 0)) {
  250.                                 TR0 = 0;
  251.                                 InitLcd1602();
  252.                                 LcdShowStr(0,0,"SetCurrentTime");
  253.                                 DisplayHourTens();
  254.                                 DisplayHourUnits();
  255.                                 LcdShowStr(8,1,":");
  256.                                 DisplayMinTens();
  257.                                 DisplayMinUnits();
  258.                                 key1Flag = 1;
  259.                         }
  260.            }
  261.                 while(key1Flag == 1)
  262.                  {
  263.                         if(Key1 == 0) {
  264.                                 Delay20ms();
  265.                                 if(Key1 == 0)
  266.                                 {
  267.                                         hour++;
  268.                                         if(hour == 24)
  269.                                          {
  270.                                                 hour = 0;
  271.                                         }
  272.                                         DisplayHourTens();
  273.                                         DisplayHourUnits();
  274.                                         LcdShowStr(8,1,":");
  275.                                         DisplayMinTens();
  276.                                         DisplayMinUnits();
  277.                                 }
  278.                         }
  279.                         if(Key2 == 0)
  280.                         {
  281.                                 Delay20ms();
  282.                                 if(Key2 == 0)
  283.                                 {
  284.                                         min++;
  285.                                         if(min == 60)
  286.                                         {
  287.                                                 min = 0;
  288.                                                 hour++;
  289.                                         }
  290.                                         DisplayHourTens();
  291.                                         DisplayHourUnits();
  292.                                         LcdShowStr(8,1,":");
  293.                                         DisplayMinTens();
  294.                                         DisplayMinUnits();
  295.                                 }
  296.                         }
  297.                         if((Key3 == 0)&(key1Flag == 1)) {                 //退出設置當前時間
  298.                                 Delay20ms();
  299.                                 if((Key3 == 0)&(key1Flag == 1)) {
  300.                                         InitLcd1602();
  301.                                         LcdShowStr(0,0,table);
  302.                                         DisplayHourTens();
  303.                                         DisplayHourUnits();
  304.                                         LcdShowStr(8,1,":");               
  305.                                         DisplayMinTens();
  306.                                         DisplayMinUnits();
  307.                                         LcdShowStr(11,1,":");
  308.                                         DisplayClkSecUnits();
  309.                                         DisplayClkSecTens();        
  310.                                         key1Flag = 0;
  311.                                         TR0 = 1;
  312.                                 }
  313.                         }                                       
  314.                 }
  315. //==============================================================
  316.                 if((min==0)&(sec<5)) //時間到整點
  317.                  {        
  318.                          LED=0;
  319.                         delay();
  320.                          Beep();
  321.                          Beep();
  322.                          Delay20ms();            
  323.                 }
  324.                 if((min==0)&(sec>=5))
  325.                 {
  326.                 LED=1;
  327.                 }

  328. //==============================================================
  329.                 if((Key2 == 0)&(key2Flag == 0))
  330.                 {                        //顯示鬧鐘時間
  331.                         Delay20ms();  
  332.                         if((Key2 == 0)&(key2Flag == 0))
  333.                          {
  334.                                 key2Flag = 1;
  335.                                 InitLcd1602();
  336.                                 while(key2Flag == 1)
  337.                                  {
  338.                                         LcdShowStr(0,0,"Clock Time");
  339.                                         DisplayClkHourTens();
  340.                                         DisplayClkHourUnits();
  341.                                         LcdShowStr(8,1,":");
  342.                                         DisplayClkMinTens();
  343.                                         DisplayClkMinUnits();
  344.                                         if(Key2 == 0)
  345.                                         {
  346.                                                 Delay20ms();
  347.                                                 if(Key2 == 0)
  348.                                                  {
  349.                                                         key2Flag = 0;
  350.                                                         InitLcd1602();
  351.                                                         DisplayHourTens();
  352.                                                         DisplayHourUnits();
  353.                                                         LcdShowStr(8,1,":");               
  354.                                                         DisplayMinTens();
  355.                                                         DisplayMinUnits();
  356.                                                         LcdShowStr(11,1,":");
  357.                                                         DisplayClkSecUnits();
  358.                                                         DisplayClkSecTens();
  359.                                                 }
  360.                                         }        
  361.                                 }
  362.                         }
  363.                 }
  364. //==============================================================
  365.                 if((Key3 == 0)&(key3Flag == 0))         //設置鬧鐘時間
  366.                  {                        
  367.                         Delay20ms();
  368.                         if((Key3 == 0)&(key3Flag == 0))
  369.                          {
  370.                                 TR0 = 0;
  371.                                 InitLcd1602();
  372.                                 LcdShowStr(0,0,"SetClockTime");
  373.                                 DisplayClkHourTens();
  374.                                 DisplayClkHourUnits();
  375.                                 LcdShowStr(8,1,":");
  376.                                 DisplayClkMinTens();
  377.                                 DisplayClkMinUnits();
  378.                                 key3Flag = 1;
  379.                         }        
  380.                 }
  381.                 while(key3Flag == 1)
  382.                 {
  383.                         if(Key1 == 0)
  384.                         {
  385.                                 Delay20ms();
  386.                                 if(Key1 == 0)
  387.                                 {
  388.                                          clockHour++;
  389.                                          if(clockHour == 24)
  390.                                          {
  391.                                                  clockHour = 0;
  392.                                          }
  393.                                          DisplayClkHourTens();
  394.                                          DisplayClkHourUnits();
  395.                                          LcdShowStr(8,1,":");
  396.                                          DisplayClkMinTens();
  397.                                          DisplayClkMinUnits();
  398.                                 }
  399.                         }
  400.                         if(Key2 == 0)
  401.                         {
  402.                                 Delay20ms();
  403.                                 if(Key2 == 0)
  404.                                 {
  405.                                         clockMin++;
  406.                                         if(clockMin == 60)
  407.                                          {
  408.                                                 clockHour++;
  409.                                                 clockMin = 0;
  410.                                         }
  411.                                          DisplayClkHourTens();
  412.                                          DisplayClkHourUnits();
  413.                                          LcdShowStr(8,1,":");
  414.                                          DisplayClkMinTens();
  415.                                          DisplayClkMinUnits();
  416.                                 }
  417.                         }
  418.                         if(Key3 == 0)
  419.                         {                                                         //退出設置鬧鐘時間
  420.                                 Delay20ms();
  421.                                 if(Key3 == 0)
  422.                                 {
  423.                                         key3Flag = 0;
  424.                                         InitLcd1602();
  425.                                         TR0 = 1;
  426.                                         DisplayHourTens();
  427.                                         DisplayHourUnits();
  428.                                         LcdShowStr(8,1,":");               
  429.                                         DisplayMinTens();
  430.                                         DisplayMinUnits();
  431.                                         LcdShowStr(11,1,":");
  432.                                         DisplayClkSecUnits();
  433.                                         DisplayClkSecTens();
  434.                                 }
  435.                         }
  436.                 }
  437. //==============================================================
  438.                 if((Key4 == 0)&(key4Flag == 0)) //鬧鐘ON/OFF位設置
  439.                 {                        
  440.                         Delay20ms();
  441.                         if((Key4 == 0)&(key4Flag == 0))
  442.                          {
  443.                                 key4Flag = 1;
  444.                                 InitLcd1602();
  445.                                 LcdShowStr(0,0,"Clock ON");
  446.                                 Delay20ms();
  447.                                 
  448.                                 Delay20ms();
  449.                                 
  450.                                 Delay20ms();
  451.                                 
  452.                                 Delay20ms();
  453.                                 
  454.                                 Delay20ms();
  455.                         }
  456.                 }
  457.                 if((Key4 == 0)&(key4Flag == 1))         //鬧鐘ON/OFF位設置
  458.                  {                        
  459.                         Delay20ms();
  460.                         if((Key4 == 0)&(key4Flag == 1))
  461.                         {
  462.                                 key4Flag = 0;
  463.                                 InitLcd1602();                                   
  464.                                 LcdShowStr(0,0,"Clock OFF");
  465.                                 Delay20ms();
  466.                                 Delay20ms();
  467.                                 Delay20ms();
  468.                                 Delay20ms();
  469.                         }
  470.                 }
  471. //==============================================================
  472.         if((key4Flag == 1)&(hour == clockHour)&(min == clockMin))
  473.         {        
  474.                         clockFlag = 1;                                                         //鬧鐘時間到
  475.                         InitLcd1602();
  476.                         LcdShowStr(0,0,table);
  477.                         LcdShowStr(0,0,"Time's up");
  478.                                         DisplayHourTens();
  479.                                         DisplayHourUnits();
  480.                                         LcdShowStr(8,1,":");               
  481.                                         DisplayMinTens();
  482.                                         DisplayMinUnits();
  483.                                         LcdShowStr(11,1,":");
  484.                                         DisplayClkSecUnits();
  485.                                         DisplayClkSecTens();
  486.                         while(clockFlag == 1)
  487.                         {
  488.                             LED=!LED;
  489.                                 Beep();
  490.                                 ScanKey4();
  491.                                 Delay20ms();
  492.                                 ScanKey4();
  493.                                 Delay20ms();
  494.                                 ScanKey4();
  495.                                 Delay20ms();
  496.                                 ScanKey4();
  497.                                 Delay20ms();
  498.                                 ScanKey4();
  499.                                         Delay20ms();
  500.                                 ScanKey4();
  501.                                         Delay20ms();
  502.                                 ScanKey4();
  503.                                 Delay20ms();
  504.                                 ScanKey4();
  505.                                 Delay20ms();
  506.                                 ScanKey4();
  507.                                 beepNum++;
  508.                                 if(beepNum == 20)
  509.                                 {
  510.                                         clockFlag = 0;
  511.                                         beepNum = 0;
  512.                                         key4Flag = 0;
  513.                                         LED=1;
  514.                                 }        
  515.                         }
  516.                 }
  517.         }
  518. }
  519. void Timer0() interrupt 1
  520. {
  521.         temp++;
  522.         if(temp == 20)
  523.         {
  524.                 sec++;
  525.                 temp = 0;
  526.         }
  527.         TH0 = (65536 - 50000) / 256;
  528.         TL0 = (65536 - 50000) % 256;
  529. }
  530. void Timer1() interrupt 3
  531. {
  532. TH1=(65536-50000)/256;
  533. TL1=(65536-50000)%256;
  534. }
復制代碼

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

使用道具 舉報

沙發
ID:752974 發表于 2021-6-22 08:28 | 只看該作者
在使用單片機時,有一個重要的概念:叫做“實時性”。
回復

使用道具 舉報

板凳
ID:924233 發表于 2021-6-22 08:33 | 只看該作者
munuc_w 發表于 2021-6-22 08:28
在使用單片機時,有一個重要的概念:叫做“實時性”。

能夠指點 一下嗎不是很懂
回復

使用道具 舉報

地板
ID:811711 發表于 2021-6-22 09:21 | 只看該作者
找例程看一下把,代碼太長看不懂啊
回復

使用道具 舉報

5#
ID:94031 發表于 2021-6-22 09:59 | 只看該作者
定時1中斷就沒用,為什么初始化要開定時1中斷。
回復

使用道具 舉報

6#
ID:924233 發表于 2021-6-22 10:06 | 只看該作者
xuyaqi 發表于 2021-6-22 09:59
定時1中斷就沒用,為什么初始化要開定時1中斷。

因為想用這個定時1中斷去使鬧鐘程序響了之后秒數能夠繼續轉動,不會用就放在那里了
回復

使用道具 舉報

7#
ID:123289 發表于 2021-6-22 13:46 | 只看該作者
記住:CPU在任何時刻只能做一件事,
當時鐘該走的時候CPU沒有讓它走,它就不走了。
如果你的程序能不用DELAY,估計問題就解決了。
我猜你離開了DELAY就不會延時了。即搞不定!
回復

使用道具 舉報

8#
ID:924233 發表于 2021-6-22 22:01 | 只看該作者
yzwzfyz 發表于 2021-6-22 13:46
記住:CPU在任何時刻只能做一件事,
當時鐘該走的時候CPU沒有讓它走,它就不走了。
如果你的程序能不用DE ...

是的  之前就想過是因為delay太多導致那個鬧鐘秒數不走  延時完之后就繼續走了   想用兩個定時器解決 但是不會【笑哭】
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91不卡 | 免费在线观看黄网站 | 日韩一区二区三区视频 | 国产精品视频免费观看 | 韩日一区二区 | 九九热这里 | 日韩色视频 | 日韩插插| 成人在线免费视频 | 久久国产精品视频观看 | av特级毛片 | 蜜桃久久 | 毛片免费在线观看 | 狠狠婷婷综合久久久久久妖精 | 欧美国产日韩一区二区三区 | 99热首页 | 日本三级在线 | 69堂永久69tangcom | 黑人粗黑大躁护士 | 91视频免费视频 | 成人av在线播放 | 一区二区三区四区免费视频 | 国产99久久精品一区二区永久免费 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲va中文字幕 | 三级特黄特色视频 | 欧美区日韩区 | 久久亚洲国产精品 | 五月天综合影院 | 中文字幕男人的天堂 | 亚洲最大av网站 | 久久99精品久久久久久 | 成人精品一区二区三区 | 国产精品高潮呻吟久久 | 看羞羞视频免费 | 怡红院成人在线视频 | 欧美一区二区三区视频 | 国产精品美女久久久久aⅴ国产馆 | 日韩中文在线视频 | 久在线 | 成人精品国产一区二区4080 |