找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子时钟直接设置定时时间,并实时显示时间的单片机程序问题

[复制链接]
ID:348416 发表于 2018-6-9 20:54 | 显示全部楼层 |阅读模式
2黑币

仿真图

仿真图

按键的效果

按键的效果


要求加一个串口直接设置定时时间,并实时显示剩余时间。     感觉改动的难度有点大。   现在P3.1是修改时分秒,修改标志就是dp。p3.2加p3.3
减   现在在图的基础上加新串口实现定时的倒计时功能。     倒计时的不知道怎么去弄了。

现在的代码如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit k1=P3^1;  //第一个按键,选择设置
  5. uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管段码表
  6. uchar disbuf[8]; //声明显示缓冲区8个单元
  7. uchar hour=12;   //声明小时变量,初值为12
  8. uchar minute=59; //声明分变量,初值为59
  9. uchar second;    //声明秒变量
  10. uchar t0n;       //定时器T0中断计数,定时50ms,中断20次为1秒
  11. uchar dis;       //调时状态下,显示小数点位
  12. void delay()     //延时子程序,用于显示子程序
  13. {
  14. uint j;
  15. for(j=300;j>0;j--);
  16. }
  17. //显示子程序,参数dis为显示小数点位
  18. void display(uchar dis)
  19. {
  20. uchar j,disbit=0x01; //位码
  21. for(j=0;j<8;j++)
  22. {
  23. P2=~disbit;       //P2口输出位码
  24. if(dis>0&&dis==j) //调时状态下,显示小数点
  25. P0=distab[disbuf[j]]+0x80; //在小时,分,秒位上显示小数点
  26. else
  27. P0=distab[disbuf[j]]; //其它位正常显示
  28. disbit<<=1;           //取下一个位码
  29. delay();              //延时
  30. }
  31. }
  32. void main()
  33. {
  34. disbuf[2]=disbuf[5]=10;//数码管第3,6位显示-
  35. TMOD=0x01;
  36. TH0 =0x3C;    //单片机晶振频率=12M,定时50ms,时间常数=3CB0
  37. TL0 =0xB0;
  38. IE  =0x82;    //开定时器T0中断
  39. TR0 =1;       //启动定时器T0
  40. IT0 =1;       //设置外部中断为下降沿有效
  41. IT1 =1;
  42. while(1)
  43. {
  44. display(dis); //调显示子程序
  45. if(k1==0)     //选择设置
  46. {
  47. dis++;    //停止计时,进入调时状态
  48. EX0=1;    //调时状态下,允许外部INT0,INT1中断
  49. EX1=1;    //用来调小时,分,秒
  50. if(dis>7) //调小时,在小时位显示小数点
  51. {
  52. dis=0; //灭小数点
  53. t0n=0; //调时结束,开始计时
  54. TR0=1;
  55. EX0=0; //关外部中断
  56. EX1=0;
  57. }
  58. else if(dis==2)dis=4; //调分,在分位显示小数点
  59. else if(dis==5)dis=7; //调秒,在秒位显示小数点
  60. while(k1==0)display(dis); //等待按键释放
  61. }
  62. if(t0n>=20&&dis==0) //中断20次,1秒到,计时状态下时钟计时
  63. {
  64. t0n=0;
  65. second++;      //秒加1
  66. if(second>=60) //到60秒
  67. {
  68. second=0;
  69. minute++;      //分加1
  70. if(minute>=60) //到60分
  71. {
  72. minute=0;
  73. hour++;    //小时加1
  74. if(hour>=24)
  75. hour=0;
  76. }
  77. }
  78. }
  79. disbuf[0]=hour/10;    //显示小时十位
  80. disbuf[1]=hour%10;    //显示小时个位
  81. disbuf[3]=minute/10;  //显示分十位
  82. disbuf[4]=minute%10;  //显示分个位
  83. disbuf[6]=second/10;  //显示秒十位
  84. disbuf[7]=second%10;  //显示秒个位
  85. }
  86. }
  87. //定时器T0中断服务子程序
  88. void T0_isr() interrupt 1
  89. {
  90. TH0=0x3C;  //重写时间常数
  91. TL0=0xb0;
  92. t0n++;     //中断次加1
  93. }
  94. //外部中断INT0服务程序,调时状态下,加1
  95. void INT0_ISR() interrupt 0
  96. {
  97. if(dis==1)     //调小时
  98. {
  99. hour++;    //小时加1
  100. if(hour>=24)
  101. hour=0;
  102. }
  103. if(dis==4)     //调分
  104. {
  105. minute++;  //分加1
  106. if(minute>=60)
  107. minute=0;
  108. }
  109. if(dis==7)     //调秒
  110. {
  111. second++;  //秒加1
  112. if(second>=60)
  113. second=0;
  114. }
  115. }
  116. //外部中断INT1服务程序,调时状态下,减1
  117. void INT1_ISR() interrupt 2
  118. {
  119. if(dis==1)   //调小时
  120. {
  121. hour--;  //小时减1
  122. if(hour==0xff)
  123. hour=23;
  124. }
  125. if(dis==4)    //调分
  126. {
  127. minute--; //分减1
  128. if(minute==0xff)
  129. minute=59;
  130. }
  131. if(dis==7)   //调秒
  132. {
  133. second--;//秒减1
  134. if(second==0xff)
  135. second=59;
  136. }
  137. }
复制代码

仿真图

仿真图

按键显示的效果

按键显示的效果
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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