找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用单片机定时器实现流水灯即时熄灭和暂停的Proteus仿真+代码

[复制链接]
跳转到指定楼层
楼主
ID:524018 发表于 2019-5-1 12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原代码
按键1 控制亮灭,按下时灯灭,再按下继续流水
按键2 控制暂停,按下时暂停,保持该LED灯亮,再按下继续

单片机源程序如下:
  1. #include<reg52.h>
  2. sbit KEY=P3^2;                 //按键1
  3. sbit KEY1=P3^3;                //按键2
  4. unsigned char code d[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
  5. 0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0x00,0xff}; //灯的效果(常量)
  6. void time();
  7. void timer();//调用中断
  8. bit flag;         //标志位1
  9. bit flag1;          //标志位2

  10. void main()
  11. {
  12. time();
  13. while(1)
  14. {
  15.   if(!KEY)
  16.         {
  17.    
  18.          if(!KEY)
  19.           {
  20.             while(!KEY);                          //控制灯停止的按键
  21.                  {flag=~flag;}
  22.           }
  23.         }

  24. if(!KEY1)
  25.            {
  26.    
  27.          if(!KEY1)
  28.           {
  29.             while(!KEY1);                         //控制灯熄灭的按键
  30.                  {flag1=~flag1;}
  31.           }
  32.         }        
  33. }
  34. }

  35. void time()
  36. {
  37.         TMOD|=0x01;               
  38.         //设置定时器工作模式TMOD(定时器工作方式寄存器);
  39.         //GATE(定时器/计数器的开关控制选项)设置为0;即定时器/计数器的开关控制仅由TCON寄存器中的TRx(x = 0,1)控制
  40.         //C/T位(定时器模式和计数器模式选择位)设置为0使其工作在定时器模式下;将该位置1则为定时器模式。
  41.         //M1M0设置为01,使用16位计数

  42.         TH0 = 0xD8;            //65536-10000
  43.         TL0 = 0xF0;            //55536
  44.         EA =1;                         //开启总中断
  45.         EX0=1;                        //开启0号外部中断
  46.         IT0=1;                        //设置外部中断0触发方式,1 - 负跳变触发
  47.         TR0=1;                         //定时器0运行控制位,将该位置1时启动定时器0
  48.         ET0=1;                         //定时器/计数器0中断允许位

  49. }

  50. void timer() interrupt 0
  51. {
  52.            P2=0xff;
  53. }

  54. void timeer() interrupt 1
  55. {
  56.         static unsigned int k=0;
  57.         static unsigned char i=0;

  58.         TH0=(65536-2000)/256;
  59.         TL0=(65536-2000)%256;                //实现延时

  60.         if((!flag)&&(!flag1))
  61.         {
  62.                 k++;
  63.                 if(k<150)                                //当两个按键都没有被按下时,灯进行流水效果
  64.                 {P2=d[i];}
  65.                          if(k==300)
  66.                         {
  67.                                 k=0;
  68.                                 i++;
  69.                                 if(i==18)
  70.                                 i=0;
  71.                         }  
  72.         }                        
  73. }
复制代码

全部资料51hei下载地址:
Proteus 8.7模拟.zip (52.52 KB, 下载次数: 18)
hex原文件.zip (607 Bytes, 下载次数: 12)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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