51单片机使用定时器实现流水灯

基于STC89C52RC,使用定时器,1s流水一个灯

#include<reg52.h>
#define LED_PORT P2 
void timer()
{
 unsigned char count;
  for(count=0;count<50;count++)
  {
  while(TF0==0)    ;
  TF0=0;
  TH0=0XB1;
  TL0=0XE0;     
  }    
  }
void main()
{
  unsigned char i;
  TMOD=0X01;
  
  TR0=1;
  LED_PORT=~0x01;
 while(1)
 {
  for(i=0;i<8;i++)
  {    
  LED_PORT=~(0X01<<i);     //左移取反
  timer();
  }    
  for(i=0;i<8;i++)
  {
  LED_PORT=~(0x80>>i);     //右移取反
  timer();
  }
  }
  }

  
  

51单片机使用定时器实现流水灯程序主要是利用定时器的计数功能周期性地切换LED灯的状态,以达到动态显示的效果。一般步骤如下: 1. **初始化定时器**: 首先配置定时器工作模式,比如使用8051系列的定时器T0,通常需要设置为模式1,即自动重装定时器模式。 ```c TMOD = 0x01; // 设置T0为模式1 TH0 = 0xFF; // 初始化高8位计数值 TL0 = 0xFD; // 初始化低8位计数值,形成延时时间 ``` 2. **设定中断触发条件**: 让定时器溢出(定时器最大值减1后再次等于0)时引发中断。 ```c ET0 = 1; // 开启定时器T0溢出中断 IE = 1 << TF0; // 启动中断允许控制寄存器,打开TF0中断标志 ``` 3. **编写中断服务程序(ISR)`: 当定时器溢出时,进入ISR,在这里改变灯的状态并清除溢出标志。 ```c void Timer0_ISR(void) interrupt 1 { if (TF0) { // 检查是否溢出 P1 ^= 0b11111111; // 变换灯的状态,例如P1口的7位LED灯,异或操作会循环切换灯亮灯灭 TF0 = 0; // 清除溢出标志,准备下一次计数 } } ``` 4. **主程序中启动定时器**: 开启外部中断源,并启用GATE引脚,使得定时器能够启动中断。 ```c EX0 = 1; // 开启外部中断 EA = 1; // 全局中断使能 ``` 5. **处理其他任务**: 主程序可以继续执行其他任务,当定时器的中断被响应时,LED灯状态会随之变化。 注意:流水灯的具体连接方式取决于硬件电路布局,通常是将LED串联到单片机的I/O口上,然后通过轮流点亮各段LED来实现流水效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值