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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于狀態機應用程序的電子表

[復制鏈接]
跳轉到指定樓層
樓主
希望能給大家提供經驗,51單片機做的狀態機應用程序的電子表


  1. #include <REGX51.H>
  2. #include <intrins.h>
  3. typedef unsigned char uint8;
  4. #define NT 29
  5. const uint8 THH=(65536-2000+NT)/256;
  6. const uint8 TLL=(65536-2000+NT)%256;
  7. uint8 code SEG7CC[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};
  8. uint8 volatile LED[]={2,3,5,9,5,0};   
  9. volatile uint8 hour=23;  
  10. volatile uint8 minute=59;   
  11. volatile uint8 sec=50;   
  12. volatile uint8 mode=0;
  13. volatile uint8 isAddPush=0;
  14. void timeDly(unsigned int n);
  15. void tickProc();
  16. void main()
  17. {  
  18. //char i,temp;
  19.   EA=1; //總中斷開關  
  20.   ET0=1;  //分中斷開關  
  21.   TMOD = 1;  //設置為 16 位定時器模式。  
  22.   TR0=1;     //啟動定時器 T0  
  23.   ET1=1;  
  24.   TR1=1;  
  25.   TMOD |= 0x10; //不更改原先的代碼  
  26.   PT0 =1;//時間的刷新比按鍵更重要  
  27.   PT1 =1;// 時間的刷新比按鍵更重要  
  28.   EX0=1;  
  29.   EX1=1;  
  30.   IT0=1;  
  31.   IT1=1;
  32. while(1)  
  33.   {  
  34.     tickProc();

  35. }
  36. } void tickProc()
  37.   {  static uint8 N=0;//記錄調用次數,實現閃爍  
  38.   switch(mode)
  39.    {
  40.   case 0://正常運行模式下,N 不變,秒定時器運行   
  41.   TR1 =1;   
  42.   break;   
  43.   case 1://模式 1 下,小時閃   
  44.   TR1 =0;   
  45.    N++;
  46.   if(isAddPush)//如果有加鍵按下,小時加   
  47.   {  if(++hour>23) hour=0;  
  48.   isAddPush=0;   
  49.    }   
  50.   if(N%2==0) //N 為偶數,小時數字滅   
  51.   {   
  52. LED[0]=10;
  53. LED[1]=10;   
  54.   }   
  55. else //N 為奇數,小時恢復正常數字,實現閃爍
  56.     {     
  57.         LED[0]=hour/10;  
  58.         LED[1]=hour%10;   
  59.         }   
  60.         timeDly(500);   
  61.         break;   
  62. case 2:   
  63. TR1 =0;   
  64. N++;   
  65. if(isAddPush)   
  66. {  if(++minute>59) minute=0;  isAddPush=0;    }   
  67. if(N%2==0)   
  68. {     LED[2]=10;  LED[3]=10;    }   
  69. else   
  70. {     LED[2]=minute/10;  LED[3]=minute%10;    }   
  71. timeDly(500);   
  72. break;
  73. case 3:   
  74. TR1 =0;   
  75. N++;   
  76. if(isAddPush)   
  77. {  if(++sec>59) sec=0;  isAddPush=0;    }   
  78. if(N%2==0)     
  79. {     LED[4]=10;  LED[5]=10;    }   
  80. else   
  81.   {
  82.     LED[4]=sec/10;  LED[5]=sec%10;   
  83.         }   
  84. timeDly(500);   
  85. break;   
  86. default: mode=0;//增強抗干擾能力
  87. }
  88.   }
  89.   void int0ISR()interrupt 0
  90.   {  timeDly(10);//消除抖動
  91. IE0 =0;//二次進入同類中斷,中斷標志位會保留,防止處理 2 次。
  92. if(P3_2) return;//松開按鍵,后邊沿,不處理
  93. if(++mode>3) mode=0;
  94. LED[0]=hour/10; //模式變后,閃的位置也會變,要重置正常顯示情況  
  95. LED[1]=hour%10;  
  96. LED[2]= minute/10;  
  97. LED[3]= minute%10;  
  98. LED[4] = sec/10;  
  99. LED[5] = sec%10; }
  100. void int1ISR() interrupt 2
  101. {  timeDly(10);
  102. IE1 =0;
  103. if(P3_3) return;  
  104. isAddPush=1;//有按鍵則置位標志位,這個處理較為復雜,在主循環中處理。
  105. }

  106. void timeDly(unsigned int n)
  107. {  
  108. unsigned int i;  
  109. for(; n>0; n--)   
  110. for(i=123; i>0; i--);
  111. }
  112. void t1ISR() interrupt 3
  113. {  
  114. static uint8 N=0;//記錄中斷次數
  115. TH1 = (65536-62500)/256;
  116. TL1 = (65536-62500)%256;

  117. if(++N>=16)  
  118.   {  
  119.    N=0;
  120.    ET0 =0;//時分秒比顯示定時刷新重要,暫時先關刷新中斷   
  121. if(++sec>59)   
  122. {   
  123. sec=0;   
  124. if(++minute>59)   
  125. {     
  126. minute =0;  
  127. if(++hour>23)
  128. hour=0;   
  129. }   
  130. }
  131. LED[0]=hour/10;//時分秒有改變,重置顯示緩沖區   
  132. LED[1]=hour%10;  
  133. LED[2]= minute/10;  
  134. LED[3]= minute%10;   
  135. LED[4] = sec/10;   
  136. LED[5] = sec%10;

  137. ET0 =1;   
  138. }
  139. }
  140. void t0ISR() interrupt 1
  141. {  
  142. static uint8 N=0;

  143. switch(N)  
  144. {   
  145. case 0:      
  146. P2 = (1<<5);
  147. P1 = SEG7CC[ LED[5]];  
  148. break;   
  149. case 1:      
  150. P2 = (1<<4);  
  151. if(LED[4]!=0)  
  152. P1 = SEG7CC[ LED[4]];  
  153. else   
  154. P1 = SEG7CC[10];//秒高位為 0,則不顯示  
  155. break;
  156. case 2:     
  157. P2 = (1<<3);  
  158. P1 = SEG7CC[ LED[3]];   
  159. if(mode==0) //如果是正常顯示,則將這個位置的小數點點亮  
  160. P1 = SEG7CC[ LED[3]] | 0x80;  
  161. break;
  162. case 3:     
  163. P2 = (1<<2);  
  164. if(LED[2]!=0)  
  165. P1 = SEG7CC[ LED[2]];  
  166. else  
  167. P1 = SEG7CC[10];//分鐘高位為 0,則不顯示   
  168. break;
  169. case 4:     
  170. P2 = (1<<1);  
  171. P1 = SEG7CC[ LED[1]];  
  172. if(mode==0) //如果是正常顯示,則將這個位置的小數點點亮  
  173. P1 = SEG7CC[ LED[1]] | 0x80;
  174. break;
  175. case 5:   
  176. P2 = 1;  
  177. if(LED[0]!=0)  
  178. P1 = SEG7CC[LED[0]];  
  179. else  
  180. P1 = SEG7CC[10];//小時高位為 0,則不顯示  
  181. break;
  182. default:   
  183. N=0;//出錯,令 N 歸零。
  184.   }  
  185.   if(++N>5) N=0;  
  186.   TH0 = THH;   
  187.   TL0 = TLL;

  188. }
復制代碼

所有資料打包下載:
新建文件夾.rar (51.65 KB, 下載次數: 14)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区在线观看视频 | 日韩欧美一区二区三区免费看 | 国产成人精品福利 | 黄视频欧美 | 欧美精品一区二区三区在线播放 | 日韩免费视频 | 成人午夜高清 | 黑人久久 | 日本福利片 | 91九色porny首页最多播放 | 久草网址| av一级一片 | 精精国产视频 | av电影手机在线看 | 亚洲黄色一区二区三区 | 成人在线视频网 | 亚洲精品福利视频 | 日韩精品久久 | 在线视频成人 | 在线观看亚洲欧美 | 精品一区二区三区在线视频 | 一级黄色片在线免费观看 | 国产精品免费一区二区三区四区 | 成人一区二区在线 | 在线一区视频 | 欧美理论片在线观看 | 欧美一级免费看 | 日韩三级一区 | 国产精品视频综合 | 国产成人精品一区二区三区 | 久艹网站| 一区二区三区四区在线 | 国产人成精品一区二区三 | 久久综合一区 | 亚洲成人一区二区三区 | 成人视屏在线观看 | 欧美久久一区 | 欧美中文在线 | 欧美一区免费在线观看 | 精品在线一区二区三区 | www.操com|