使用kiel c程序和89c51芯片或89c52芯片帮我写一份单片机红外控制1个灯亮灭的程序,要求按一下按键亮,按一下另一按键灭。
时间: 2024-02-12 20:04:27 浏览: 55
基于51单片机的按键控制继电器实现灯亮灭(仿真+程序)
好的,以下是基于Keil C和89C52单片机的红外控制1个灯亮灭的程序:
```c
#include <reg52.h>
#define IR_IN P3_2 // 红外接收器数据输入端口
#define LED P1_0 // 控制灯的输出端口
bit led_status = 0; // 记录灯的状态,0为灭,1为亮
void delay_us(unsigned int us) // 微秒级延时函数
{
while (us--) {
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) // 毫秒级延时函数
{
while (ms--) {
delay_us(1000);
}
}
void init_IR() // 红外接收器初始化
{
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 开启外部中断0
EA = 1; // 全局中断开启
}
void IR_int() interrupt 0 // 红外接收器中断函数
{
unsigned char i;
unsigned int code = 0;
delay_us(200); // 延时200us等待红外信号
if (IR_IN == 0) { // 判断是否真正收到红外信号
while (!IR_IN); // 等待红外信号结束
for (i = 0; i < 16; i++) { // 循环接收16位红外编码
delay_us(12); // 每个红外编码位的持续时间为1.2ms
if (IR_IN) { // 如果为高电平,则说明这一位为1
code |= 1 << i;
}
else { // 如果为低电平,则说明这一位为0
code &= ~(1 << i);
}
delay_us(12); // 等待下一位编码的到来
}
if (code == 0x18E7) { // 判断是否为亮灯的红外编码
LED = 1; // 灯亮
led_status = 1;
}
else if (code == 0x5EA1) { // 判断是否为灭灯的红外编码
LED = 0; // 灯灭
led_status = 0;
}
}
}
void main()
{
init_IR(); // 红外接收器初始化
while (1) {
// 主循环中可以添加其他功能
}
}
```
以上程序中使用外部中断0来接收红外信号,并通过判断红外编码来控制灯的亮灭。在主循环中可以添加其他功能。
阅读全文