请使用51单片机的定时器1和定时器2,写一段红外遥控定时1H和PWM调光强弱的程序。要求定时器2控制定时的时间长度且优先级高于定时器1,定时器1用于控制PWM调光
时间: 2023-11-20 19:05:36 浏览: 63
思路:
1. 使用定时器2实现定时1小时的功能,定时器2的中断函数中设置一个标志位,表示时间已到。
2. 使用定时器1实现PWM调光功能,定时器1的中断函数中改变PWM的占空比,实现调光。
3. 在主函数中,不断检测定时器2的标志位,若为真,则停止PWM输出,表示定时时间到。
代码实现:
```c
#include <reg52.h>
sbit LED = P1^0; // LED灯
unsigned char count = 0; // 定时器1计数器
bit flag = 0; // 定时器2标志位
void timer1() interrupt 3 // 定时器1中断函数
{
TH1 = 0xFC; // 重新赋值,定时1ms
TL1 = 0x66;
count++; // 计数器加1
if(count >= 100) // 计数器计数到100,即1s
{
count = 0; // 计数器清零
LED = !LED; // LED翻转
}
}
void timer2() interrupt 5 // 定时器2中断函数
{
flag = 1; // 标志位置1
}
void main()
{
TMOD = 0x11; // 定时器1、2均为模式1
TH1 = 0xFC; // 定时1ms
TL1 = 0x66;
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
RCAP2H = 0x3C; // 定时1小时
RCAP2L = 0xAF;
ET2 = 1; // 允许定时器2中断
TR2 = 1; // 启动定时器2
EA = 1; // 打开总中断开关
while(1)
{
if(flag) // 定时器2标志位为真
{
TR1 = 0; // 关闭定时器1
LED = 0; // 熄灭LED
while(1); // 停止程序
}
}
}
```
以上代码实现了一个简单的定时1小时的功能,使用了定时器1来控制LED的闪烁,使用了定时器2来控制定时时间到的判断。在定时时间到时,关闭定时器1,熄灭LED,程序停止。
接下来,我们来实现PWM调光功能,需要修改定时器1中断函数:
```c
void timer1() interrupt 3 // 定时器1中断函数
{
TH1 = 0xFC; // 重新赋值,定时1ms
TL1 = 0x66;
count++; // 计数器加1
if(count >= 100) // 计数器计数到100,即1s
{
count = 0; // 计数器清零
LED = !LED; // LED翻转
}
if(count < duty_cycle) // 占空比内输出高电平
{
PWM = 1;
}
else // 占空比外输出低电平
{
PWM = 0;
}
}
```
在定时器1中断函数中增加了一个变量duty_cycle,用于表示PWM的占空比。在计数器计数到占空比时,输出高电平,否则输出低电平。
修改主函数如下:
```c
void main()
{
TMOD = 0x11; // 定时器1、2均为模式1
TH1 = 0xFC; // 定时1ms
TL1 = 0x66;
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
RCAP2H = 0x3C; // 定时1小时
RCAP2L = 0xAF;
ET2 = 1; // 允许定时器2中断
TR2 = 1; // 启动定时器2
EA = 1; // 打开总中断开关
while(1)
{
if(flag) // 定时器2标志位为真
{
TR1 = 0; // 关闭定时器1
PWM = 0; // 关闭PWM输出
while(1); // 停止程序
}
if(IR) // 红外遥控信号为真
{
duty_cycle += 10; // 占空比加10%
if(duty_cycle > 100) // 占空比最大为100%
{
duty_cycle = 100;
}
IR = 0; // 清除红外遥控信号
}
}
}
```
在主函数中增加了一个变量duty_cycle,表示PWM的占空比,使用红外遥控信号来改变占空比。当占空比达到100%时,不再增加。
完整代码如下:
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)