基于51单片机定时中断使LED灯循环亮灭

定时器中断

定时器计数为0~65535,共65536个数,当定时器计数计满65536个后会自动清零,所以常在清零时启动另一个任务(例如:使LED点亮),65536可以看做65536微妙 ,因为定时中断计数到第65536个才会清零(65535是第65536个计数)因为65535溢出值已经确定,所以用改变初值也就是定时开始的值来改变定时时间。举个栗子

#include <REGX51.H>
int c=1;
sbit LED=P2^0;

void main()
{	
	  EA=1;//总中断
      TR0=1;//启动定时中断0
	  ET0=1;//  定时/计数器0中断控制位,先打开ET0之后EA才能打开
      TMOD=0x01;//设置定时器模式为方式1: 16位计数器
      TH0 = 0x9e;//初值高八位:计算方式为(65536-25000)/256  取整换算为16进制
      TL0=  0x58;//初值低八位:计算方式为(65536-25000)%256  取余换算为16进制
      //初值可直接写计算方式  65536-25000=40536(十进制)=9E58(十六进制)9E为高八位,58为低八位
	 while(1)//死循环 
	 {  
		 if(c==100){	// c为100使电平翻转
			 LED=~LED;	//默认LED=1时,LED=~LED会使LED=0;反之LED=1;也就是电平翻转
			 c=1;//电平翻转后使c为1,继续运行使c再次为100,达到循环亮灭
}
   
}
	 }
void time()interrupt 1{
    TH0 = 0x9e;
    TL0=  0x58;
		c++;//c=100;运行100次定时器 25000微妙*100=2.5s		

	}
使用80C51单片机控制两个LED实现交替亮灭功能通常需要以下步骤: 1. **硬件连接**:将两个LED分别连接到P1口的两个I/O引脚,例如P1.0和P1.1。其中,一般将正极接Vcc,负极通过电阻接到单片机的低电平输出端。 2. **初始化**:在程序开始时,设置P1口为输出模式,通过位操作将P1.0和P1.1置为初始状态(通常是高电平,LED熄灭)。 3. **定时控制**:为了实现交替亮灭,可以利用单片机定时器T0或T1。这里假设使用中断的方式,设置一个计数器,当计数到一定值时,改变对应LED的状态(比如P1.0点亮,P1.1熄灭)。 4. **中断服务函数**:编写一个中断服务函数来处理定时器溢出事件。每当定时器溢出时,就切换LED状态,并启动下一个计数周期。 5. **主循环**:在主循环里,保持定时器工作并处理其他必要的任务,同时等待定时器中断。 6. **程序伪码示例**: ```c #include <reg51.h> #define LED_ON P1_0 = 0 #define LED_OFF P1_0 = 1 void timer0 interrupt 1 { if (current_state == led1_on) { current_state = led2_on; } else { current_state = led1_on; } // 更新LED状态 switch (current_state) { case led1_on: LED_ON; break; case led2_on: LED_OFF; break; } } void main() { TMOD = 0x01; // 设置T0为模式1,外部中断 TH0 = 0xFD; // 设置定时初值,大约每1ms触发一次中断 TL0 = 0xFD; ET0 = 1; // 开启定时器T0中断 EA = 1; // 开全局中断 P1 = 0xFF; // 初始化所有IO口为输入 current_state = led1_off; // 初始状态之一 while(1); }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值