基于单片机红外线遥控控制led灯显示系统设计与制作课程设计Word文档下载推荐.docx
《基于单片机红外线遥控控制led灯显示系统设计与制作课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机红外线遥控控制led灯显示系统设计与制作课程设计Word文档下载推荐.docx(33页珍藏版)》请在冰豆网上搜索。
![基于单片机红外线遥控控制led灯显示系统设计与制作课程设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/8/abac9af3-0875-4434-9d8c-1242184d3a1c/abac9af3-0875-4434-9d8c-1242184d3a1c1.gif)
110803025姓名:
课程论文题目:
基于单片机红外线遥控控制LED灯显示系统设计与制作
第一章设计要求
主要功能是实现利用单片机AT89C51结合红外线收发模块实现控制指定的LED灯亮灭。
第二章硬件系统设计
2.1基于单片机红外线遥控控制LED灯显示系统框架图
1.系统晶振采用11.0592MHZ
2.系统框架图如下:
图2-1系统的设计总框图
2.2单片机控制系统及其基本电路
2.2.1单片机最小系统
单片机晶振电路:
对于MSC-51一般的晶振频率可以在1.2MHz—12MHz之间选择,这是电容C可以对应的选择10pF—30pF。
当使用89C55时晶振频率可以提高到24MHZ。
对于本设计的电容C用30pF,晶振选用11.0592MHz。
晶振电路如下图3-1所示,一条引脚接在XTAL1,另一条接在XTAL2。
单片机的复位电路:
为了防止程序执行过程中失步或运行紊乱,此处采用了上电复位及手动复位电路,电路图如下图2-1所示:
图2-2-1单片机最小系统图
2.2.2时钟电路
单片机必须要有时钟信号才能正常工作,因为它是一种时序电路[3]。
单片机芯片的18脚(X2)、19脚(X1)分别为片内反向放大器的输出端和输入端,只要在18脚(X2)和19脚(X1)之间接上一个晶振(本控制系统采用频率为12MHz),同时两个脚分别串联上一个30PF的电容即可构成单片机所需的
时时钟电路。
钟电路如2-2所示。
图2-2-2时钟电路模块图
2.2.3复位电路
单片机芯片的第9脚RST(Reset)是复位信号输入端。
单片机系统在开机时或在工作过程中因某种干扰而使程序失去控制,或工作中程序处于某种死循环状态等情况下都需要进行复位。
AT系列单片机的复位一般靠外部电路来实现,信号高电有效,由RST引脚输入,当引脚保持高电平2个周期机器才正常复位[4]。
复位目的是使单片机以及其他所有功能都图2-3所示。
在本设计中为简化了的模型,直接将RST脚拉低,只实现开机复位。
恢复到一个原始状态,并从这个状态开始执行其他的任务。
AT89C52单片机复位电路如下图2-3:
图2-2-3复位电路模块图
2.3基于单片机红外遥控控制LED系统的设计原理
2.3.1单片机红外遥控控制LED显示系统原理
红外遥控是指令信号产生电路以不同的脉冲编码代表不同的指令。
如图4。
当不同的指令键被按下时,指令信号产生电路将产生不同脉冲编码的指令信号,也就是进行编码,然后经调制电路调制,变为编码脉冲调制信号,再由驱动电路驱动红外发射器件发射红外光信号。
图2-3-1码分制红外遥控系统图
接收器接收下来的信号经过前置放大后,送入解调电路,对调制信号进行解调,再经指令信号检出电路检出指令信号。
这里的指令信号检出电路是与发射器中编码电路相对应的译码电路,通过它将指令信号译出。
2.3.2单片机红外遥控控制LED系统码分制原理
红外线遥控系统中的指令产生及检出电路,在频分制中由多频振荡电路及频率选择电路构成;
在码分制系统中则由编码电路及译码电路构成,这是频分制与码分制红外线遥控系统的分别。
在码分制中,因为码分制系统编码脉冲频率极低,为超低频,如果不用调制与解调电路,外界突然的光线变化可能会对接收电路造成干扰,产生误动作,系统的抗干扰能力及可靠性就难以保证。
所以本系统将用码分制遥控。
遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲。
为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控数据帧间隔大于10ms,如图5所示。
在遥控码的发射中,当某个操作键按下时,单片机先读出该键值,然后根据键值设定的遥控脉冲个数,再调制成38KHz的方波由红外线发射管发射出去。
P3.7端口的输出调制波如图2-3-2.1所示。
图2-3-2.1调光命令码
当红外线接收器输出脉冲帧数据时,第一位码的低电平将启动中断程序,实时接收数据帧。
在数据接收时,先对第一位(起始位)码的码宽进行验证。
若第一位低电平码的脉宽小于2ms,将作为错误码处理;
否则认为是起始码,累加器A加1。
当间隔位的高电平大于3ms时,结束接收,然后根据累加器A中的脉冲个数,执行相应的输出操作。
图2-3-2.2为红外线接收器输出的一帧遥控码波形图。
图2-3-2.2一帧遥控码波形图
2.4红外遥控发射系统电路设计
2.4.1指令按键电路
本设计中通过单片机的P2口外接按键,对外部按键进行扫描,通过按键产生外部中断,并把按键的指令发送只单片机内,经单片机对各个按键进行编码后经信号指令发送至红外发射管,单片机与按键连接电路如下:
图2-4-1指令按键电路图
2.4.2发射电路
本设计中利用一体化红外收发二极管作为作为红外线的收发接口;
红外线发射电路中,单片机将已编码完成的指令通过P3.7连接红外线发射机二极管发射出去,单片机与红外二极管接线图如下:
图2-4-2发射电路连接图
2.4.3显示模块
发射电路设计中增加了一个数码管对发送的按键键码进行显示,进一步加强发射电路的功能。
单片机将已接收到的按键键码值,通过IO口P00-P03发送到七段译码器CD4511,再通过七段译码器CD4511对按键码进行解码,并显示到一位7段数码管。
CD4511是一个用于驱动共阴极LED(数码管)显示器的BCD码—七段码译码器,具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流;
可直接驱动LED显示器。
CD4511驱动数码管显示原理:
CD4511是一片CMOSBCD—锁存/7段译码/驱动器,引脚排列如图2所示。
其中abcd为BCD码输入,a为最低位。
LT为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。
BI为消隐功能端,低电平时使所有笔段均消隐,正常显示时,B1端应加高电平。
另外CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。
LE是锁存控制端,高电平时锁存,低电平时传输数据。
a~g是7段输出,可驱动共阴LED数码管。
另外,CD4511显示数“6”时,a段消隐;
显示数“9”时,d段消隐,所以显示6、9这两个数时,字形不太美观图3是CD4511和CD4518配合而成一位计数显示电路,若要多位计数,只需将计数器级联,每级输出接一只CD4511和LED数码管即可。
所谓共阴LED数码管是指7段LED的阴极是连在一起的,在应用中应接地。
限流电阻要根据电源电压来选取,电源电压5V时可使用300Ω的限流电阻。
图2-4-3CD4511
2.5红外遥控接收系统电路设计
2.5.1接收电路
本设计中通过单片机的P3.2口外接一体化红外线收发二极管的红外线接收二极管,并把红外线接收二极管接收到的指令信号送入单片机内进行解码等处理。
红外接收二极管与单片机接线图如下:
2.5.2LED灯显示电路
LED灯通过与单片机P1口进行连接,单片机根据接收到不同的按键码,通过控制P1口的电平,把相应的LED灯点亮或者熄灭,连接图如下:
图2-5-2LED灯显示电路
2.6硬件原理图
硬件原理图如图所示:
图2-6硬件原理图
第三章软件系统设计
3.1红外线发射电路程序流程图设计
说明:
当单片机上电的时候程序开始执行,首先进行初始化工作,然后开启中断,接着单片机对接有按键的引脚电平进行扫描,当发现有按键被按下的时候,将该按键的按键码发送到单片机内部,按键码经单片机进行处理,并进行编码,编码完成后将该编码经由单片机的P3.7发送到红外线发送二极管进行信号发射:
图3-1红外线发射电路流程图
3.2红外线接收电路程序流程图设计
当单片机上电的时候程序开始执行,首先进行初始化工作,然后开启中断;
此时单片机对连接红外线接收二极管的P3.2端口进行扫描;
当红外接收二极管接收到信号的时候,经该信号进行解码还原,并点亮指令的LED灯:
图3-2红外线接收电路流程图
第四章系统测试与分析
4.1利用Proteus和keil进行仿真调试
应用系统设计完成之后,要进行硬件调试和软件调试。
软件调试可以利用开发及仿真系统进行。
1.先排除硬件电路故障,包括设计性错误和工艺性故障。
一般原则是先静态后动态。
(1)利用万用表或逻辑测试仪器,检查电路中的各元件以及引脚是否连接正确,是否有短路故障。
(2)先要将单片机AT89C51芯片取下,对电路板进行通电检查,通过观察看是否有异常,然后用万用表测试各电源电压,若这些都没问题,则直接上仿真机进行联机调试观察各接口线路是否异常。
2.软件调试
软件调试是利用仿真工具Proteus和keil进行在线仿真调试,不但可以发现和解决程序错误外,而且可以发现硬件中存在的问题.
单片机AT89C51是系统的核心,利用万用表检测单片机电源VCC是否为(40脚)+5V、晶振是否正常工作(可用示波器测试,也可以用万用表检测,两引脚电压一般为1.8~2.3V之间)、复位引脚RST(复位时为高电平,单片机工作时为低电平)、EA是否为高电平,这样一来单片机就能工作了,再结合电路图,检测故障就很容易了。
4.2仿真图
4.2.1按下第一个键
4.2.2按下第二个键
4.2.3.按下第三个键
4.2.4再次按下第二个键
第五章总结
通过这次课程设计,提升了我的自学能力,通过不断的查阅资料,通过与同学的交流,来解决其中遇到的困难,比如如何解决无线通信问题,如何解决控制问题等。
我在设计中改变了比较传统的固定式开关元件,利用单片机无线遥控控制室内灯光取得了良好的效果,为人们提供了很大的方便,在社会生活越来越现代化的同时,我认为灯具电器等家具实现智能化控制是一个很大的趋势,同时也应总结经验,逐步完善室内灯光智能控制,例如可以增加室内灯具的自动巡检与电脑联网功能,灯具故障即可自动发出报修信号,灯具的各种使我们第一时间得知灯具的工作状况,还可以对灯具加入很多的场景模式等。
在设计中也体会到我的知识面还是很狭窄,作为电子系学生,在学好本专业的基础前提下,还要不断的学习其他领域的科学技术知识,拓宽自己的知识面,才能胜任新设备、新技术的工作,更好发挥本专业的作用。
附录一发射器程序
#include<
at89c51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#define_BV(bit)(1<
<
(bit))
sbitk1=P2^0;
sbitk2=P2^1;
sbitk3=P2^2;
sbitk4=P2^3;
sbitk5=P2^4;
sbitk6=P2^5;
sbitk7=P2^6;
sbitk8=P2^7;
sbitout=P3^7;
staticbitOP;
//红外发射管的亮灭
staticunsignedintcount;
//延时计数器
staticunsignedintendcount;
//终止延时计数
staticunsignedcharFlag;
//红外发送标志
chariraddr1;
//十六位地址的第一个字节
chariraddr2;
//十六位地址的第二个字节
voidSendIRdata(charp_irdata);
uchart=16;
ucharCODE=0Xff;
voiddelay_LCM(uint);
//LCD延时子程序
/*********延时K*1ms,12.000mhz**********/
voiddelay_LCM(uintk)
{
uinti,j;
for(i=0;
i<
k;
i++)
{
for(j=0;
j<
60;
j++)
{;
}
}
voidkey()
if(k1==0)//开
delay_LCM(5);
if(k1==0)
SendIRdata
(1);
P0=1;
while(k1==0);
if(k2==0)//开
if(k2==0)
SendIRdata
(2);
P0=2;
while(k2==0);
if(k3==0)//开
if(k3==0)
SendIRdata(3);
P0=3;
while(k3==0);
if(k4==0)//开
if(k4==0)
SendIRdata(4);
P0=4;
while(k4==0);
if(k5==0)//开
if(k5==0)
SendIRdata(5);
P0=5;
while(k5==0);
if(k6==0)//开
if(k6==0)
SendIRdata(6);
P0=6;
while(k6==0);
if(k7==0)//开
if(k7==0)
SendIRdata(7);
P0=7;
while(k7==0);
if(k8==0)//开
if(k8==0)
SendIRdata(8);
P0=8;
while(k8==0);
}//定时器0中断处理
voidtimeint(void)interrupt1
{
TH0=0xFF;
TL0=0xe6;
//设定时值为38K也就是每隔26us中断一次
count++;
}//定时器1中断处理
voidtime1(void)interrupt3
out=!
out;
}
voidSendIRdata(charp_irdata)
inti;
charirdata=p_irdata;
//发送9ms的起始码
endcount=74;
Flag=1;
count=0;
out=0;
TR1=1;
do{}while(count<
endcount);
TR1=0;
out=1;
//发送4.5ms的结果码
//endcount=117;
//Flag=0;
//count=0;
//out=1;
//do{}while(count<
endcount=25;
//TR1=1;
//发送八位数据
//irdata=~p_irdata;
irdata;
endcount=25;
TR1=1;
TR1=0;
out=1;
//TR1=1;
}
main()
count=0;
Flag=0;
OP=0;
out=1;
EA=1;
//允许CPU中断
TMOD=0x21;
//设定时器0和1为16位模式1
ET0=1;
//定时器0中断允许
P1=0xff;
TH0=0xFF;
TL0=0xE6;
//设定时值0为38K也就是每隔26us中断一次
TR0=1;
//开始计数
TH1=256-13;
TL1=256-13;
ET1=1;
//定时器1中断允许
//TR1=1;
iraddr1=0x00;
iraddr2=0x00;
while
(1)
key();
//P2=CODE=P1;
//delay_LCM(100);
//SendIRdata(CODE);
附录二接收器程序
#include<
AT89X51.h>
uchardataIRcode[4];
//定义一个4字节的数组用来存储代码
ucharCodeTemp;
//编码字节缓存变量
uchari,j,k;
//延时用的循环变量
uchardat=0;
ucharnum;
uinttime;
sbitled1=P1^0;
sbitled2=P1^1;
sbitled3=P1^2;
sbitled4=P1^3;
sbitled5=P1^4;
sbitled6=P1^5;
sbitled7=P1^6;
sbitled8=P1^7;
sbitIRsignal=P3^2;
//HS0038接收头OUT端直接连P3.2(INT0)
voiddelay(uintz);
voiddelay(uintz)
uinta,b;
for(a=z;
a>
0;
a--)
for(b=120;
b>
b--);
/**************************延时0.9ms子程序**********************/
voidDelay0_9ms(void)
{ucharj,k;
for(j=18;
j>
j--)
for(k=20;
k>
k--);
/***************************延时1ms子程序**********************/
voidDelay1ms(void)
{uchari,j;
for(i=2;
i>
i--)
for(j=230;
j--);
/***************************延时4.5ms子程序**********************/
voidDelay4_5ms(void)
for(i=10;
for(j=225;
/****************************延时子程序************************/
/************************中断0解码服务子程序**********************/
voidint0(void)interrupt0using2
EX0=0;
P3_0=!
P3_0;
num=0;
for(k=0;
k<
4;
k++)
Delay0_9ms();
if(IRsignal==1)//如果0.9ms后IRsignal=1,说明不是引导码
k=4;
break;
//P0=0XFF;
}
elseif(k==2)//如果持续了3×
0.9ms=9ms的低电平,说明是引导码
//P0=0;
time=0;
num=0;
while(IRsignal==0);
//if(IRsignal==0)
//num+=1;
//P1=num;
//while(IRsignal==0);
while(time<
100)
time++;
Delay0_9ms();
//跳过持续1ms的高电平
Delay0_9ms();
if(IRsignal==0)
P0=num;
num+=1;
//P1=num;
while(IRsignal==0);
if(num==1)
led1=!
led1;
if(num==2)
led2=!
led2;
if(num==3)
led3=!
led3;
if(num==4)
led4=!
led4;
if(num==5)
led5=!
led5;
if(num==6)
led6=!
led6;