03910749姚福钦机制7班.docx
《03910749姚福钦机制7班.docx》由会员分享,可在线阅读,更多相关《03910749姚福钦机制7班.docx(21页珍藏版)》请在冰豆网上搜索。
![03910749姚福钦机制7班.docx](https://file1.bdocx.com/fileroot1/2023-1/26/718c3e14-106f-4f0e-bc2c-ab9b6431d511/718c3e14-106f-4f0e-bc2c-ab9b6431d5111.gif)
03910749姚福钦机制7班
课程设计报告
姓名 姚福钦
学号 201303910749
年级 2013
专业 机械设计制造及其自动化
系 (院) 机械工程学院
指导教师 吕剑
2014年4月30日
目录
摘要1
1引言1
2系统功能分析1
3总体设计方案确定及其原理图1
3.1遥控系统组成部分及结构框图1
3.2系统原理图1
3.2.1发射系统2
3.2.2接收系统3
3.2.3调制4
3.3硬件电路设计4
3.4红外发射与接收部分电路设计4
4软件程序设计5
5实验仿真5
6总结与展望7
7课程设计的心得体会7
参考文献8
附录9
基于单片机的红外遥控系统设计
摘要:
本文介绍了基于AT89C51和AT89C2051的红外遥控系统。
该系统的设计重点在于采用同一遥控器控制多个设备。
其中,硬件电路主要包含了以下几个模块:
红外发射电路和红外接收电路。
整个电路简单可靠、操作灵活、耗电量小、性价比较高,满足了现代生活,生产和科研的需要。
关键词:
8051单片机红外遥控系统红外发射电路红外接收电路
1引言
近年来随着计算机在社会各领域的渗透单片机的应用正在不断地走向深入同时也带动传统的控制、检测等工作日益更新。
传统的遥控器大多采用无线电遥控技术随着科技的进步红外线遥控技术的进一步成熟红外遥控也逐步成为了一种被广泛应用的通信和遥控手段。
为了方便实用传统的家庭电器逐渐采用红外线遥控。
工业设备中在高压、辐射、有毒气体、粉尘等有害环境下采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控的特点是不影响周边环境、不干扰其它电器设备。
由于其无法穿透墙壁故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰电路调试简单只要按给定电路连接无误一般不需任何调试即可投入工作编解码容易可进行多路遥控。
红外遥控虽然被广泛应用但各产商的遥控器不能相互兼容。
当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路但编程灵活性较低且产品多相互绑定不能复用故应用范围有限。
而本文采用单片机进行遥控系统的应用设计遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点因此采用单片机的红外遥控技术具有广阔的发展前景。
2系统功能分析
设计一套红外遥控系统,要求以8051单片机作为遥控发射和接收的主控制器,利用单片机内部定时和外部中断功能实现发射编码和接收解码,通过键盘按键启动发射,通过LED灯限时接收到的数据。
3总体设计方案确定及其原理图
3.1遥控系统组成部分及结构框图
图1红外遥控系统组成
3.2系统原理图
通用红外遥控系统由调制、发射和接收三大部分组成,本系统以AT80C51单片机作为红外发射编码和接收解码芯片,另外再以HS5104作为发射编码芯片,红外遥控系统如图2所示:
图2红外遥控系统
3.2.1发射系统
发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,它发出的是红外线而不是可见光。
图3简单驱动电路
图4射击输出驱动电路
如图3和图4是LED的驱动电路,图3是最简单电路,选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。
图3电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。
图4所示的射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。
红外发射二极管的接法如图5所示:
图5红外发射二极管连接原理图
3.2.2接收系统
红外信号接收系统的典型电路如下图图6所示。
图6红外线接收头内部电路
该电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。
红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
以上电路被集成在一个元件中,成为一体化红外线接收头,如图7所示:
图7红外线接收头
红外线接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。
根据发射端调制载波的不同应选用相应解调频率的接收头。
红外线接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。
有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
3.2.3调制
红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源功耗。
3.3硬件电路设计
红外遥控系统由发射端和接收端两大部分组成。
发射端由键盘电路、编码芯片、电源和红外发射电路组成。
接收端由红外接收电路、解码芯片、电源盒应用电路组成。
通常,为了使信号能更好地传输,发送端将基带二进制信号调制为脉冲串信号后,再通过红外发射管发射。
其实质是一种脉宽调制的串行通信。
红外线通信的发送部分主要是把待发送的数据转换成一定格式的脉冲,然后驱动红外发光管向外发送数据。
接受部分则是由户外接收头来完成红外线的接收、放大、解调,还原成与同步发射格式相同的脉冲信号,并输出TTL兼容电平。
最后通过解码把脉冲信号转换成数据,从而实现信号的传输。
红外遥控系统如图8所示,由8051单片机作为主控制器完成数据的编码和解码任务。
实际电路中,只要将IR引脚接上红外线发射/接收头之后,就可以实现遥控功能。
图8红外遥控系统电路
3.4红外发射与接收部分电路设计
红外遥控系统的串行数据格式如图9所以,包括引导码、用户码、数据码和数据反码。
引导码为9ms低电平加4.5ms高电平,用户码为16位,数据码和数据反码各为8位,数据反码主要用于判断接收的数据是否正确。
图9红外遥控系统的串行数据格式
用户码或数据码中的每一位可以是1,也可以是0,位0用0.56ms低电平加0.56ms高电平表示,位1用1.68ms低电平加0.56ms高电平表示,如图10所示。
图10数据格式中位0和位1的表示电平
输入键盘如下图图11所示,LED显示接收如图12所示。
图114*4键盘按键
图12LED灯接收数据灯
4软件程序设计
红外遥控系统程序设计包括编码程序和解码程序,编码程序按规定的数据格式,为键盘中每个按键设置相应的码值,解码程序则根据接收到的脉冲来还原键码,实现按键识别。
程序见附录。
5实验仿真
每当按键则LED灯显示不同的灯管亮(按二进制码所显示),说明已正确接收由发射系统发出的信号,并由接收端解码接收。
图13仿真初始图
当依次按下键盘上1,2,3,+,=,时LED灯如下图所示。
图14按键盘1后LED显示图15按键盘2后LED显示
图16按键盘3后LED显示图17按键+后LED显示
图18按键盘=后LED显示
6总结与展望
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
当然,红外遥控照明灯如果要投入大规模生产时,还需要对它不断的进行优化。
展望未来,家用电器信息化能够大大的提高人们的生活质量,并且在此基础上开发出能够统一控制这些家电的遥控器会越来越受到人们的欢迎,无限通信技术发展越来越快,同时,我们也应该注意到。
红外通信应用的局限性也越来越明显了,比如其通信距离以及通信数据率等原因。
现代生活中,局域网、GPRS等无限通讯技术将在家电信息化的过程中将代替它而起到更大的作用。
7课程设计的心得体会
本次课程设计研究的是利用AT89C51单片机芯片来控制一个红外遥控型系统,通过掌握其原理及控制过程,设计一个硬件电路,并通过查阅资料和咨询老师进行对硬件电路的相关软件设计来完成本次课程设计。
最终目的在于学会独立的查找资料选择方案,巩固所学知识设计单片机硬件电路,加强电子制作的动手能力。
实话,课程设计紧张的时候的确有点累,但是通过这几个星期的实践训练,我明白了许多,仔细回味这些日子以来的点点滴滴,一种少有的成功的喜悦,就如同在比赛者中胜了对手一样,虽然是小小的喜悦,却让我倦意顿消。
经过这次的课程设计,通过理论联系实践,我认为在以下几个方面我有了较大提高:
(1)能够熟练地查阅和运用有关资料,加深对专业理论知识的掌握,锻炼了对于电子、自动控制、单片机原理及应用、微机原理及应用等课程的应用能力,更好的了解了软硬件开发的程序和过程。
(2)能够提出和解决涉及中遇到的问题,并加以理性的分析,创造能力有了进一步的提高。
(3)锻炼了自己独立思考和独立工作的能力,提高了使用仿真软件技能以及设计能力。
通过本次可能设计我认识到自己在专业知识上的缺陷,所学专业知识在实际应用中还不能够得心应手,以后同时我也深刻体会到了,学习和实践是密不可分的,要用于动手积极实践才能深刻理解学到的知识。
在本次设计中我学到了很多很实用的技术,为以后的工作积累宝贵经验。
以后我会加强这方面的学习,在实际应用中多下工夫,提高自己的个人能力。
由于对理论知识的掌握的不够牢固,对有些知识的理解还是不够透彻,设计中总难免有不足之处,这些需要在以后的工作和学习中进一步学习和改善。
参考文献
[1]徐爱钧主编.单片机原理与应用.机械工业出版社,2011
[2]李光飞,楼然苗,胡佳文等.单片机课程设计实例指导.北京:
北京航空航天出版社.2004
[3]杨居义主编.单片机课程设计实例教程.清华大学出版社,2010
[4]苏长赞.红外线与超声波遥控.北京:
人民邮电出版社.1995
[5]张爱全.红外线遥控的基本原理和应用范围.山西电子技术.2003
附录:
1仿真电路图
2程序
遥控编码程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineuintlongunsignedlong
sbitp3_0=P3^0;
sbitp2_1=P2^1;
//sbitout=PSW^7;//位的等同方式
//sfrcy=PSW^7;
sbitp1_0=P1^0;
sbitp1_1=P1^1;
sbitp1_2=P1^2;
sbitp1_3=P1^3;
bitout;
uintkeyvalue=0x00,flag_key=0,value1,value2,keycount=0,i,j,flag_set=0,flag_press=0;
ucharcodekeycode[4]={0x7f,0xbf,0xdf,0xef};
ucharcodeportvalue[16]={0x07,0x08,0x09,0x0a,0x04,0x05,0x06,0x0b,0x01,0x02,0x03,0x0c,0x0d,0x00,0x0e,0x0f};
ucharcodewy[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//红外数据部分;
ucharuser1=0x00,user2=0x00;//用户码标志位0和1
uintcount=0,endcount=0;
uintirdata=0;
voiddeltime(void);
voidkey_scan(void);
voidsendirdata(void);
main(void)
{
EA=1;//允许CPU中断
TMOD=0x11;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
p3_0=1;
P1=0xff;
TH0=0xFF;
TL0=0xE4;//设定时值0为38K也就是每隔28us中断一次
TR0=0;
while
(1)
{key_scan();
if(flag_press==1)
{
flag_press=0;
TR0=1;
sendirdata();
}
}
}
voidkey_scan(void)
{
for(i=0;i<=3;i++)
{
P1=keycode[i];
if(p1_3==0)
{keycount=i*4+0;flag_key=1;break;}
if(p1_2==0)
{keycount=i*4+1;flag_key=1;break;}
if(p1_1==0)
{keycount=i*4+2;flag_key=1;break;}
if(p1_0==0)
{keycount=i*4+3;flag_key=1;break;}
}
if(flag_key==1)
{flag_key=0;
value1=P1;
deltime();
value2=P1;
if(value1==value2)
{keyvalue=portvalue[keycount];flag_set=1;flag_press=1;}
while(flag_set)
{value2=P1;
if(value1!
=value2)
flag_set=0;
}
}
}
voiddeltime(void)
{uintk;
for(k=0;k<=20;k++);
//{}
}
voidtime0int(void)interrupt1
{
TH0=0xFF;
TL0=0xE5;//设定时值为38K也就是每隔26us中断一次
count++;
}
voidsendirdata()
{
uchars=0,datapd=0;
//发送9ms起始码的低电平346通过接收端得测试得到的数据
endcount=346;
p3_0=0;
count=0;
do{}while(count//发送4.5ms的结果码高电平
endcount=173;//173通过接收端得测试得到的数据
count=0;
p3_0=1;
do{}while(count//发送用户码1由于已经设置了用户码分别为0和0所以这里直接发送,这里连发16个位0。
//如果用户码不一样,这里就要进行修改了。
for(s=0;s<=15;s++)
{
///下面发送0.56ms低电平和0.56ms高电平21和64为计算电平时间的数据
endcount=21;
count=0;
p3_0=0;
while(countendcount=21;
count=0;
p3_0=1;
do{}while(count}
//发送数据,21和64为计算电平时间的数据
irdata=keyvalue;
for(s=0;s<=7;s++)
{
datapd=irdata&wy[s];
if(datapd==0)
{endcount=21;count=0;}
else
{endcount=64;count=0;}
p3_0=0;
do{}while(count//发送公共的0.56ms高电平
endcount=21;count=0;
p3_0=1;
do{}while(count}
//发送数据反向
irdata=keyvalue;
for(s=0;s<=7;s++)
{
datapd=irdata&wy[s];
if(datapd==0)
{endcount=60;count=0;}
else
{endcount=20;count=0;}
p3_0=0;
do{}while(count//发送公共的0.56ms高电平
endcount=20;count=0;
p3_0=1;
do{}while(count}
TR0=0;
}
遥控解码程序:
COUNTEQU30H;定时计数数值
FLAG_USER1EQU45H;用户码位置1
FLAG_USER2EQU46H;用户码位置2
SAVEDATAEQU47H;数据保存位置
ORG0000H
LJMPMAIN
ORG0003H
LJMPEXTER0INT
ORG000BH
LJMPTIMER0INT
ORG1000H
MAIN:
MOVTMOD,#01H;定时器0模式1
MOVTH0,#0FFH;定时100us
MOVTL0,#9CH
SETBEA
SETBIT0;外部中断0边沿触发方式,负跳变有效
SETBET0
SETBEX0
MOVR0,52H;接收的数据8个一组所存放的起始位置
MOV52H,#00H;先进行清零
MOV53H,#00H
MOV54H,#00H
MOV55H,#00H
MOV51H,#00H;中间数据存储单元
MOVCOUNT,#00H
MOVR1,#08H;设定接收的数据8个一组
MOVR2,#02H;设定接收的数据组为4个。
CLRPSW.5;数据接收标志
CLRPSW.1;数据处理标志
MOVFLAG_USER1,#00H;设定用户码为0.
LOOP:
JNBPSW.1,$;判断是否进行数据处理。
为1则进行处理,反之等待
LCALLDATACHULI;数据处理。
主要进行用户码判断以及数据和数据反码的判断
;用户码判断,根据编码,用户码1和用户码2均为0,所以这里我们只判断用户码1和接受的用户码数据
CLRPSW.1;清零等待下一组数据的接收
MOVA,SAVEDATA
ENDLOOP:
LJMPLOOP
;外部中断0部分
EXTER0INT:
SETBTR0
MOV30H,#00H;30H为计数值
RETI
TIMER0INT:
MOVTH0,#0FFH;定时100us
MOVTL0,#9CH
INC30H;注意,count要在外部中断开始后设定初始值为0;
;起始码的判断,计数数值在85-95之间,采集端口是否发生变化,发生变化了,可以认为可以接受数据了
SETBP3.2
MOVC,P3.2
JBPSW.5,DATARECEIVEPD;如果为1,表明可以进入数据接收判断位置,否则还是引导码处的判断
JNCENDTIMER0INT
MOVA,30H;注在试验中了解到,COUNT=115为9ms的数值;0.56ms和1.68ms对应的count分别为6和16
CLRC
SUBBA,#90
JCENDTIMER0INT;如果C为1,说明不符合引导码的9ms,直接退出,否则符合引导时间,准备接受数据
SETBPSW.5;数据接收标志。
CLRTR0;以免接收数据
MOVR1,#08H;表示要接收的数据8个一组
MOV51H,#00H;中间数据存储清零
MOVR0,#52H
MOVR2,#04H;总共接收2组
LJMPENDTIMER0INT
DATARECEIVEPD:
JNCENDTIMER0INT;c为1,表明状态发生变化,可以对计数值进行判断接收的位是0还是1
CLRTR0
MOVA,30H
CLRTR0;首先关掉定时器0
SUBBA,#10;以8为分界线,小于8则为0,大于8我们认为接收的是1
JCORECEIVE;跳到接收位0处
SETBC
MOVA,51H;接收位1
RRCA
MOV51H,A
LJMPWENDPD
ORECEIVE:
CLRC
MOVA,51H
RRCA
MOV51H,A
WENDPD:
DJNZR1,ENDTIMER0INT
MOVR1,#08H
MOV@R0,51H;重点:
重复2次,确保值写到单元里
MOV@R0,51H
INCR0
MOV51H,#00H
DJNZR2,ENDTIMER0INT;若不为0说明4组数据还未接收完则跳转到终端结束
CLRPSW.5
SETBPSW.1
ENDTIMER0INT:
RETI
DATACHULI:
MOVA,52H
CLRC
SUBBA,FLAG_USER1
JNZENDDATACHULI;与用户码进行比较,本用户码设置的是0,当然也可以设置其他
MOVA,54H
ANLA,55H
JNZENDDATACHULI;判断数据接收的是否正确
MOVA,54H
MOVSAVEDATA,A;将数据保存起来
MOVP1,A
MOV52H,#00H;先进行清零
MOV53H,#00H
MOV54H,#00H
MOV55H,#00H
ENDDATACHULI:
RET
END