找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2832|回复: 0
收起左侧

单片机跑表设计(计时时间存放于结构体变量中)实验

[复制链接]
ID:72519 发表于 2015-1-21 23:13 | 显示全部楼层 |阅读模式
是用51hei单片机开发板 电路图详见:http://www.51hei.com/f/51hei-5.pdf  的数码管部分, 用2个74hc573 锁存,p0口作为数据口 ,p3.6和p3.7分别是段和位的锁存端口.P2口上面是按键
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. //======================
  5. uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  7. sbit D=P3^6;
  8. sbit V=P3^7;
  9. uchar status;
  10. sbit OUT=P1^0;
  11. void delay(uint k);
  12. //================
  13. struct time
  14. {
  15. uchar sec;
  16. uchar msec;
  17. };
  18. struct time run_time,set_time;
  19. struct time *pt1,*pt2;
  20. //===============
  21. void initial(void)
  22. {
  23. TMOD=0x11;
  24. TH0=-(10000/256);
  25. TL0=-(10000%256);
  26. TH1=-(1000/256);
  27. TL1=-(1000%256);
  28. ET0=1;ET1=1;TR1=1;
  29. EA=1;
  30. }
  31. //=================
  32. void time0(void) interrupt 1
  33. {
  34. TH0=-(10000/256);
  35. TL0=-(10000%256);
  36. run_time.msec++;
  37. if(run_time.msec>99){run_time.sec++;run_time.msec=0;}
  38. if(run_time.sec>99){run_time.msec=0;run_time.sec=0;}
  39. if((pt2->msec>0)||(pt2->sec>0))
  40. {
  41. if((pt1->msec==pt2->msec)&&(pt1->sec==pt2->sec)){TR0=0;OUT=0;}
  42.    }
  43. }
  44. //==================
  45. void display(uchar cnt)
  46. {
  47. switch(cnt)
  48. {
  49. case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
  50. case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
  51. case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
  52. case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;;break;
  53. case 4:D=1;P0=SEG7[set_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
  54. case 5:D=1;P0=SEG7[set_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
  55. case 6:D=1;P0=SEG7[set_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
  56. case 7:D=1;P0=SEG7[set_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
  57. default:break;
  58.     }
  59. }
  60. //=======
  61. void set_ms_display(uchar cnt)
  62. {
  63. switch(cnt)
  64. {
  65. case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
  66. case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
  67. case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
  68. case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;break;
  69. case 4:D=1;P0=SEG7[set_time.msec%10]|0x80;D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
  70. case 5:D=1;P0=SEG7[set_time.msec/10]|0x80;D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
  71. case 6:D=1;P0=SEG7[set_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
  72. case 7:D=1;P0=SEG7[set_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
  73. default:break;
  74.    }
  75. }
  76. //==============
  77. void set_s_display(uchar cnt)
  78. {
  79. switch(cnt)
  80. {
  81. case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
  82. case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
  83. case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
  84. case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;break;
  85. case 4:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
  86. case 5:D=1;P0=SEG7[set_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
  87. case 6:D=1;P0=SEG7[set_time.sec%10]|0x80;D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
  88. case 7:D=1;P0=SEG7[set_time.sec/10]|0x80;D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
  89. default:break;
  90.   }
  91. }
  92. //================
  93. void time1(void) interrupt 3
  94. {
  95. static uchar cnt;
  96. TH1=-(1000/256);
  97. TL1=-(1000%256);
  98. cnt++;
  99. if(cnt>7)cnt=0;
  100. switch(status)
  101. {
  102. case 5:display(cnt);break;
  103. case 0:display(cnt);break;
  104. case 1:set_ms_display(cnt);break;
  105. case 2:set_s_display(cnt);break;
  106. default:break;
  107.     }
  108. }
  109. //==========
  110. void key_s1(void)
  111. {
  112. P2=0xff;
  113. if(P2==0xbf)
  114. {
  115. switch(status)
  116. {
  117. case 1:if(set_time.msec==99)set_time.msec=99;
  118. else set_time.msec++;break;
  119. case 2:if(set_time.sec==99)set_time.sec=99;
  120. else set_time.sec++;break;
  121. default:break;
  122.    }
  123. }
  124. }
  125. //===========
  126. void key_s2(void)
  127. {
  128. P2=0xff;
  129. if(P2==0xdf)
  130. {
  131. switch(status)
  132. {
  133. case 1:if(set_time.msec==0)set_time.msec=0;
  134. else set_time.msec--;break;
  135. case 2:if(set_time.sec==0)set_time.sec=0;
  136. else set_time.sec--;break;
  137. default:break;
  138.    }
  139. }
  140. }
  141. //===============
  142. void key_s4(void)
  143. {
  144. P2=0xff;
  145. if(P2==0xef){status++;}
  146. if(status==3)status=1;
  147. if(status==6)
  148. {run_time.msec=0;
  149. run_time.sec=0;
  150. status=0;}
  151. }
  152. //============
  153. void key_s3(void)
  154. {
  155. P2=0xff;
  156. if(P2==0x7f){status=5;TR0=1;}
  157. }
  158. //===============
  159. void main(void)
  160. {
  161. pt1=&run_time;pt2=&set_time;
  162. initial();
  163. for(;;)
  164. {
  165. key_s1();
  166. key_s2();
  167. key_s3();
  168. key_s4();
  169. delay(300);
  170.    }
  171. }
  172. //================
  173. void delay(uint k)
  174. {
  175. uint data i,j;
  176. for(i=0;i<k;i++){
  177. for(j=0;j<121;j++)
  178. {;}}
  179. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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