找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3136|回复: 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 单片机教程网

快速回复 返回顶部 返回列表