找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4114|回复: 2
打印 上一主题 下一主题
收起左侧

单片机多档倒计时proteus仿真与源程序

[复制链接]
跳转到指定楼层
楼主
//30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动倒计时,数码管显示数值每秒减1,
//倒计时结束,LED熄灭,数码管显示设定值;如果倒计时没结束时,再按下key2键,倒计时时间置设定值重新计时
//仿真通过;附件有源程序,仿真文件,hex文件

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序:
  1. //30秒,300秒,600秒三档倒计时,key1按键切换时间,key2键LED点亮,松手后启动倒计时,数码管显示数值每秒减1,
  2. //倒计时结束,LED熄灭,数码管显示设定值;如果倒计时没结束时,再按下key2键,倒计时时间置设定值重新计时
  3. //仿真通过
  4. #include <reg52.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. sbit led = P1^7;
  8. sbit key1 = P1^0; //时间切换键
  9. sbit key2 = P1^1; //启动按键
  10. sbit we1 = P2^0;  //数码管位端口
  11. sbit we2 = P2^1;
  12. sbit we3 = P2^2;
  13. uchar knum;                  //key1按键按下次数计数变量
  14. uchar cont;                  //中断次数变量
  15. uint cont1=30,cont2=300,cont3=600;        //定义时间变量并赋值30秒,300秒,600秒

  16. uchar code LedTab[]=  //定义共阴极数码管段码
  17.    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

  18. void delay(uint z)
  19. {
  20.         uint x,y;
  21.         for(x=z; x>0; x--)
  22.                 for(y=114; y>0; y--);
  23. }


  24. void display1(uint shu)
  25. {
  26.         we1 = 0;
  27.         P0 = LedTab[shu/100];
  28.         delay(5);
  29.         we1 = 1;
  30.         
  31.         we2 = 0;
  32.         P0 = LedTab[shu%100/10];
  33.         delay(5);
  34.         we2 = 1;
  35.         
  36.         we3 = 0;
  37.         P0 = LedTab[shu%10];
  38.         delay(5);
  39.         we3 = 1;        
  40. }

  41. void keyscan()
  42. {
  43.         if(key1==0)
  44.         {
  45.                 delay(5);
  46.                 if(key1==0)
  47.                 {
  48.                         while(!key1);
  49.                         knum++;
  50.                         if(knum==3)
  51.                                 knum=0;
  52.                 }
  53.         }

  54.         if(key2 == 0)
  55.         {
  56.                 delay(5);
  57.                 if(key2 == 0)         //key2按下
  58.                 {
  59.                         led = 0;         //点亮LED,松手后启动倒计时
  60.                         while(!key2)        //这句后面不加分号,下一句调用显示函数,按键时数码管才不会灭
  61.                         {
  62. //                                if(knum==0)
  63. //                                display1(cont1);
  64. //                                if(knum==1)
  65. //                                display1(cont2);
  66. //                                if(knum==2)
  67. //                                display1(cont3);

  68.                                 switch(knum)
  69.                                 {
  70.                                          case 0: display1(cont1);  break;
  71.                                          case 1: display1(cont2);  break;
  72.                                          case 2: display1(cont3);  break;
  73.                                 }

  74.         
  75.                                 TR0 = 1;         //启动定时器
  76.         //                        led = 0;         //点亮LED
  77.                                 cont1=30;
  78.                                 cont2=300;
  79.                                 cont3=600;
  80.                         }
  81.                 }
  82.         }
  83. }


  84. void main()
  85. {
  86.         TMOD = 0X01;                          //T0定时器,模式1, 16位计数
  87.         TH0 = (65536-46082)/256;  //50ms初值
  88.         TL0 = (65536-46082)%256;
  89.         EA = 1;                         //开总中断
  90.         ET0 = 1;                 //开定时器中断

  91.         while(1)
  92.         {
  93.                 keyscan();
  94.                 switch(knum)
  95.                 {
  96.                          case 0: display1(cont1); cont2=300; cont3=600; break;
  97.                          case 1: display1(cont2); cont1=30; cont3=600; break;
  98.                          case 2: display1(cont3); cont1=30; cont2=300; break;
  99.                 }
  100.         }
  101. }


  102. void timer0() interrupt 1
  103. {
  104.         TH0 = (65536-46082)/256; //重装初值
  105.         TL0 = (65536-46082)%256;
  106.         cont++;
  107.         if(cont == 20)
  108.         {
  109.                 cont = 0;
  110.                 switch(knum)
  111.                 {
  112.                         case 0: cont1--;
  113.                                         if(cont1==0)
  114.                                         {
  115.                                                 cont1=30;  //倒计时时间到
  116.                                                 led=1;           //熄灭LED
  117.                                                 TR0=0;           //关闭定时器
  118.                                         } break;

  119.                         case 1: cont2--;
  120.                                         if(cont2==0)
  121.                                         {
  122.                                                 cont2=300;
  123.                                                 led=1;
  124.                                                 TR0=0;
  125.                                         } break;

  126.                         case 2: cont3--;
  127.                                         if(cont3==0)
  128.                                         {
  129.                                                 cont3=600;
  130.                                                 led=1;
  131.                                                 TR0=0;
  132.                                         } break;
  133.                 }
  134.         }
  135. }
复制代码

全部资料51hei下载地址:
多档倒计时.rar (22.25 KB, 下载次数: 74)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89835 发表于 2018-11-7 23:35 | 只看该作者
试了下,还不错,很经典的小例子,感谢楼主分享
回复

使用道具 举报

板凳
ID:1045601 发表于 2023-6-2 14:03 来自手机 | 只看该作者
可以         
回复

使用道具 举报

地板
ID:53813 发表于 2023-11-23 09:38 | 只看该作者
正好是我类似项目需要的,参考下,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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