基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx
- 文档编号:16850110
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:12
- 大小:84.58KB
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx
《基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
但是经试验发现供电电压为3V时,整个电路可以工作,但是发射距离会大打折扣。
下图是接收部分电路原理图
单片机通过中断程序,处理HS0038B输出信号,进行解码。
注:
此电路中省略了MAX232。
数据由单片机接收之后经串口传给电脑。
红外接收头HS0038B引脚如下图所示
编码程序:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
longTIME[8];
//定义一个数组,用于储存不同时间
sbitP34=P3^4;
sbitP35=P3^5;
sbitP32=P3^2;
sbitP33=P3^3;
sbitP30=P3^0;
sbitP10=P1^0;
bitendflag=0;
longcount1;
longcount;
bitj=0;
intm=0;
into;
intmykeynumber=101;
intkeynumber;
voidGET_TIME(unsignedcharDATA)//把一个字节,按位分解,时间按"
1"
"
0"
装入TIME[]中
{unsignedcharDATAI;
unsignedchari;
for(i=0;
i<
8;
i++)
{
DATAI=DATA&
0x01;
DATA=DATA>
>
1;
if(DATAI==1)
{
TIME[i]=3000;
}
if(DATAI==0)
{TIME[i]=1000;
}
voidinti()//初始化程序
{TMOD=0x11;
TH0=(65535-9000)/256;
TL0=(65535-9000)%256;
endflag=0;
EA=1;
ET0=1;
ET1=1;
EX0=1;
IT0=1;
P30=0;
}
ucharkeyscan(void);
voiddelay(uintii);
voidkeynum()
{ucharkey;
keynumber=100;
while(keynumber==100)
if(P32==0)
{delay(100);
{P2=1;
keynumber=17;
}
if(P33==0)
if(P33==0)
{keynumber=18;
if(P34==0)
if(P34==0)
{keynumber=19;
if(P35==0)
if(P35==0)
{keynumber=20;
if(keynumber==100)
key=keyscan();
switch(key)
{
case0x7e:
keynumber=1;
break;
//0
case0x7d:
keynumber=2;
//1
case0x7b:
keynumber=3;
//2
case0x77:
keynumber=4;
//3
case0xbe:
keynumber=5;
//4
case0xbd:
keynumber=6;
//5
case0xbb:
keynumber=7;
//6
case0xb7:
keynumber=8;
//7
case0xde:
keynumber=9;
//8
case0xdd:
keynumber=10;
//9
case0xdb:
keynumber=11;
//10
case0xd7:
keynumber=12;
//11
case0xee:
keynumber=13;
//12
case0xed:
keynumber=14;
//13
case0xeb:
keynumber=15;
//14
case0xe7:
keynumber=16;
//15
default:
voidmain()//主函数
keynum();
inti();
GET_TIME(keynumber);
TR1=1;
while(endflag==0)
{}
voidt1()interrupt3//定时器1中断
TR1=0;
TH1=(65535-2000)/256;
TL1=(65535-2000)%256;
TR0=1;
m++;
P30=1;
}voidt0()interrupt1//定时器0中断
{
TR0=0;
switch(m)
{case1:
count=TIME[0];
case2:
count=TIME[1];
case3:
count=TIME[2];
case4:
count=TIME[3];
case5:
count=TIME[4];
case6:
count=TIME[5];
case7:
count=TIME[6];
case8:
count=TIME[7];
default:
endflag=1;
if(endflag)
{TR1=0;
TH0=(65535-count)/256;
TL0=(65535-count)%256;
ucharkeyscan(void)//键盘扫秒,并返回键值的程序
ucharcord_h,cord_l;
P1=0x0f;
cord_h=P1&
0x0f;
if(cord_h!
=0x0f)
delay(100);
=0x0f)
cord_h=P1&
P1=cord_h|0xf0;
cord_l=P1&
0xf0;
return(cord_h+cord_l);
}return(0xff);
voiddelay(uintii)//延时程序
while(ii--);
解码程序:
unsignedcharMYDATA=0;
//接受到得数据
intj=0;
longm=0;
//定义外部中断0引脚
//接收结束标志
bitstartflag=0;
//开始接收数据标志
inti=0;
longirtime;
//临时储存检测到地电平的时间
longtime[8];
voidGET_MYDATA()//把存在数组中存放的1和0,组成一字节
MYDATA=MYDATA&
0xfe;
MYDATA=MYDATA|time[7];
MYDATA=MYDATA<
<
MYDATA=MYDATA|time[6];
MYDATA=MYDATA|time[5];
MYDATA=MYDATA|time[4];
MYDATA=MYDATA|time[3];
MYDATA=MYDATA|time[2];
MYDATA=MYDATA|time[1];
MYDATA=MYDATA|time[0];
{SCON=0x50;
//串行通信设置寄存器
TH1=0xFD;
//波特率9600
TL1=0xFD;
PCON=0x00;
//波特率不加倍
//启动定时器1,波特率发生
TMOD=0x21;
//定时器工作方式设置
TH0=0;
//定时器0处置设置,用于计时
TL0=0;
//允许总中断
//允许外部中断0
//外部中断0出发方式为下降沿出发
while
(1)
{TR0=0;
//关闭定时器0
//赋初值
while(endflag==0)//等待。
直到接收结束
GET_MYDATA();
//把数组中存放的数组成16进制数
switch(MYDATA)//点亮LED(实验用,可加可不加)
{case17:
P1=0x80;
case18:
P1=0x10;
case19:
P1=0x02;
P1=0;
startflag=0;
SBUF=MYDATA;
//接收到的数据传给通过串口通信传给上位机PC
while(TI==0)
{TI=0;
voidzhongduan0()interrupt0//外部中断程序,用于接收数据,下降沿触发
//进入中断先启动定时器,开始计时
while(P32==0)//低电平时一直计时
//高点平停止,即低电平结束,就停止计时
irtime=TH0*256+TL0;
//把计时的结果村到IRTIME中(低电平时间)
if(startflag==0)
if((irtime>
8500)&
&
(irtime<
9500))//如果存在低电平时间在8500到9500uS之间,说明接收到引导码
startflag=1;
}//把开始标志置1
if(startflag==1)//接收到有效引导码会执行此程序段
800)&
1200))//如果接收到低电平时间大于800小于1200,则为0
time[i-1]=0;
}//把0存入time[]数组的第i-1位中
2800)&
3200))//如果接收到低电平时间大于2800小于3200,则为1
{time[i-1]=1;
}//把1存入time[]数组的第i-1位中
i++;
//每进一次外部中断0都会加1
if(i==8)//如果进了8次中断,结束标志置1
{i=0;
endflag=1;
}
irtime=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 AT89C 红外 遥控 设计 软硬件