📄 saa3010t_driver.c
字号:
//功能实现对p1口八个发光二级管控制,程序中设置了串行口来查看遥控器的发送的编码IRCode[2]
//8路红外遥控开关控制器,程序只对SAA3010T的后12位判定 //(SAA3010T电视遥控器)
//只用八路时可以用AT89C2051代替AT89C51 //一体化接收头输出端拉P3.2(int0),P1为控制输出端。 //可以扩展到32路或更多 //输出为低电平有效
#include <AT89x51.h>
static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT=0;
unsigned char i=0;
void main(void)
{
unsigned int de;
TMOD = 0x21; //定时器0方式1
EA = 1; //允许CPU中断
IT0 = 1; //INT0下降沿有效
EX0 = 1; //开INT0中断;
TI=0; // ;设置串行发送中断产生标志
SCON=0x50; //;设置串行口工作于模式1,允许接收数据
//MOV TMOD,#20H // ;设置定时器1工作于模式2(具有自动加载初值功能)
TH1=0xF3; // 设置波特率为9600 bps FD
TL1=0xf3;
do
{
for (de=0; de<10000; de++)P3_6 = 1;
for (de=0; de<10000; de++)P3_6 = 0;
if (DT)
{
for (de=0; de<50000; de++) P3_6 = 1;//这里起到按键值正确后会有一个延时,防止重复按键
for (de=0; de<50000; de++)P3_6 = 0;
DT = 0;
}
EX0 = 1;
}
while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1 using 2
{
TR1=0; // ;激活定时器1,以产生波特率时钟
//IT0=1; // ;设定INT0的触发方式为脉冲负边沿触发
//EX0=1; // ;打开INT0中断请求
TH0=0xFD; //定时738us
TL0=0x1E; //设定时值为800us
if (IRCON<3)
{
if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON]|P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
}
else
{
IRCON++; //填满一个字节,指向下一个变量
IRCON2=0; //计数清零
}
}
else
{
TR1=1;
TR0 = 0; //关闭定时器
ET0 = 0; //定时器0中断关闭
if(TI==0)
SBUF=IRCode[1];//测试遥控器的编码,也可以测试IRCode[1]
else
TI=0;
if ((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
{ DT=1;
if (IRCode[1]==0xfe)
{
switch (IRCode[2])
{
case 0xfe: //1-8键控制
P0_0 =~P0_0;
DT = 1;
break;
case 0xAC:
P0_1 =~P0_1;
DT = 1;
break;
case 0xAD:
P0_2 = ~P0_2;
DT = 1;
break;
case 0xB2:
P0_3 = ~P0_3;
DT = 1;
break;
case 0xB3:
P0_4 = ~P0_4;
DT = 1;
break;
case 0xB4:
P0_5 = ~P0_5;
DT = 1;
break;
case 0xB5:
P0_6 = ~P0_6;
DT = 1;
break;
case 0xCA:
P0_7 = ~P0_7;
DT = 1;
break;
case 0xD2: //按关闭电源键,关闭所有继电器
P0 = 0x00;
DT = 1;
break;
}
}
}
}
}
//INT0中断
void INT0Fun(void) interrupt 0 using 2
{
EX0 = 0; //外部中断0关闭
ET0 = 1; //定时器0中断打开
TH0=0xFD;
TL0=0x1E; //设定时值为800us
/*
TH0=0xfc;
TL0=0xe0;
*/
for (IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //计数清零
TR0 = 1;//开始计数
//EX0=1;
}
//遥控器编码
/*
95D3 95d2
AB AC AD B2
B3 B4 B5 CA
CB AA 2A CC
D4 2B 2C
D5 35 32
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -