找回密码
 立即注册

QQ登录

只需一步,快速开始

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

从左到右在从右到左的流水灯

[复制链接]
ID:415088 发表于 2019-11-8 15:25 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include <led.h>


  3. u8 T0RH = 0; //T0 重载值的高字节
  4. u8 T0RL = 0; //T0 重载值的低字节
  5. u8 flag = 0;//

  6. void led_show()
  7. {
  8.         u8 l_cnt = 0;
  9.         u8 r_cnt = 0;
  10.         bit led_flag = 0;//控制左右移位标志位
  11.        
  12.         while(1)
  13.         {
  14.                 if(flag == 100)//改变flag的大小,可控制等的移动速度
  15.                 {
  16.                         if(led_flag == 0)
  17.                         {
  18.                                 flag = 0;
  19.                                 P0 = ~(0x01 << l_cnt);
  20.                                 l_cnt++;
  21.                                 if(l_cnt >= 8)
  22.                                 {       
  23.                                         l_cnt = 0;
  24.                                         led_flag = 1;
  25.                                 }
  26.                         }
  27.                         else if(led_flag == 1)
  28.                         {
  29.                                 flag = 0;
  30.                                 P0 = ~(0x80 >> r_cnt);
  31.                                 r_cnt++;
  32.                                 if(r_cnt >= 8)
  33.                                 {
  34.                                         r_cnt = 0;
  35.                                         led_flag = 0;
  36.                                 }
  37.                         }
  38.                 }
  39.         }
  40. }


  41. void main()
  42. {       
  43.         ConfigTimer0(1);//定时1ms
  44.        
  45.         while(1)
  46.         {
  47.                 led_show();
  48.         }
  49. }



  50. /* 配置并启动 T0, ms-T0 定时时间 */
  51. void ConfigTimer0(u16 ms)
  52. {
  53.         u32 tmp; //临时变量
  54.        
  55.         EA = 1;
  56.         tmp = 11059200 / 12; //定时器计数频率
  57.         tmp = (tmp * ms) / 1000; //计算所需的计数值
  58.         tmp = 65536 - tmp; //计算定时器重载值
  59.         tmp = tmp + 12; //补偿中断响应延时造成的误差
  60.         T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
  61.         T0RL = (unsigned char)tmp;
  62.         TMOD &= 0xF0; //清零 T0 的控制位
  63.         TMOD |= 0x01; //配置 T0 为模式 1
  64.         TH0 = T0RH; //加载 T0 重载值
  65.         TL0 = T0RL;
  66.         ET0 = 1; //使能 T0 中断
  67.         TR0 = 1; //启动 T0
  68. }

  69. /* T0 中断服务函数,执行 100ms 定时 */
  70. void InterruptTimer0() interrupt 1
  71. {
  72.         TH0 = T0RH; //重新加载重载值
  73.         TL0 = T0RL;
  74.        
  75.         flag++;
  76. }
复制代码

使用定时器来实现左右循环移动的流水灯,请各位帮忙指点

LED流水灯.rar

55.06 KB, 下载次数: 5, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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