基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx

上传人:b****3 文档编号:16850110 上传时间:2022-11-26 格式:DOCX 页数:12 大小:84.58KB
下载 相关 举报
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx_第1页
第1页 / 共12页
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx_第2页
第2页 / 共12页
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx_第3页
第3页 / 共12页
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx_第4页
第4页 / 共12页
基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx

《基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。

基于单片机AT89C的红外遥控设计软硬件都有Word格式文档下载.docx

但是经试验发现供电电压为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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1