电子综合设计报告.docx
《电子综合设计报告.docx》由会员分享,可在线阅读,更多相关《电子综合设计报告.docx(29页珍藏版)》请在冰点文库上搜索。
电子综合设计报告
电子综合设计
红外传输设计
指导老师:
红外传输设计总结报告
一.系统功能描述
1.1实现的基本功能
原设计主要研究并设计一个基于单片机的红外传输系统,并实现对八路开关的控制。
控制系统主要是由51和52系列单片机、红外发射电路、红外接收电路、等部分组成,单片机编码发射遥控信号经红外接收处理传送给单片机,单片机根据不同的信息码控制八路LED发光二极管各个状态,并完成相应的状态指示
修改后设计有电脑软件设置发送字符,红外发送接收后显示在LCD屏幕上。
1.2系统的工作原理
红外通信是利用950nm近红外波段的红外线作为传递信息的媒体,即通信信道。
发送端采用脉时调制(PPM)方式,将二进制数字信号调制成某一频率的脉冲序列,并驱动红外发射管以光脉冲的形式发送出去,接收端将收到的光脉冲转换成电信号,再经过放大、滤波处理后送给解调电路进行解调,还原为二进制数字信号后输出。
换句话说,红外通信的实质就是对二进制数字信号进行调制和解调,以便利用红外进行传输。
1.3系统组成
原设计系统硬件由以下几部分组成:
键盘采用矩阵键盘,4×4矩阵键盘中P1.0-P1.3为采集数据入口,P1.4-P1.7采集数据出口,红外数据发射电路,红外接收电路,继电器电路。
软件部分包括AT89S52单片机,STC89C52单片机
修改后设计硬件包括发射电路,接收电路,LCD
二.实际各部分电路的电路图和设计方案
2.1硬件电路
2.1.1AT89S52单片机介绍
原设计采用了AT89C2051,它是由ATMEL公司推出的一种小型单片机。
其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,其程序的电可擦写特性,使得开发与试验比较容易。
但此芯片需要独特的下载方法,不便使用,故本设计换为AT89S52。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.1.2STC89C52RC单片机介绍
STC89C52RC系列单片机是有超强抗干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟机器周期和6时钟机器周期可任意选择,最新的D版本内部集成MAX810专用复位电路。
2.1.3时钟电路及RC复位电路
STC89C52RC芯片内部有一高增益反相放大器,用于构成振荡器.反相放大器的输入端为XTAL1,输出端为XTAL2。
在XTAL1、XTAL2(第19、18引脚)两端跨接一个石英晶体振荡器,和两个电容就构成了稳定自激谐振电路。
晶振频率为11.0592MHz。
C12,C13是两个瓷片电容,与晶振Y2构成了自激谐振电路。
其电容的作用主要是对频率进行微调,一般取30-45PF左右。
使用该电路可产生稳定的11.0592MHZ频率,受外界的环境的干扰影响非常小。
其接法如图3-2所示:
图2-2晶振电路图2-3复位电路图
2.2单片机红外发射器的电路设计
原设计
2.2.1矩阵键盘电路
(1)4×4矩阵键盘的工作原理:
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
行线接P1.4-P1.7,列线接P1.0-P1.3,如图2-4所示。
图2-4矩阵键盘电路图
(2)按键功能说明:
设备1-3是用电器件的选择按键,按下时则相应的用电器件被选中,如果长按下超过5秒钟,则会关断对应的用电器件;S1-12是用电器件的功能选择按键;OFF是LED指示灯和所有用电器件的总关断按键,OFF按键按下时会使LED指示灭二达到节能的目的,如果长按超过5秒钟,则会关掉所有的用电器件。
修改后设计采用电脑发送字符。
2.2.2红外发射电路
(1)红外线遥控制系统的原理:
将指令脉冲编码信号调制在载波振荡器产生的载波上(也称脉码调制),然后用这脉码调制信号去驱动红外发光二极管,以发出经过调制的红外光波。
(2)红外编码原理:
通常,红外遥控器将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。
二进制脉冲码的形式有多种,其中最为常用的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码)。
本课题是以PPM码(脉冲位置调制码及遥控编码中的NEC码)对红外数据的发送进行论证。
如图2-5示
图2-5指令脉冲图
编码脉冲信号由引导码、系统码、系统反码、功能码、功能反码等信号组成。
引导码也叫起始码,由宽度为9ms的高电平和宽度为4.5ms的低电平组成,用来标志遥控编码脉冲信号的开始。
如图2-6所示
图2-6信号引导码图
脉冲位置表示的“0”和“1”组成的32位二进制码前16位控制指令,控制不同的红外遥控设备。
而不同的红外家用电器又有不同的脉冲调控方式,后16位分别是8位的功能码和8位的功能反码。
串行数据码时序图如2-7所示
图2-7串行数据码时序图
将要发送的指令脉冲编码信号调制在38KHz的载波上,可以增加信号的抗干扰能力,提高信号传输效率。
(3)红外数据发射电路的设计:
在红外数据发射过程中,由于发送信号时的最大平均电流需几十mA,所以需要三极管放大后去驱动红外光发射二极管。
软件编程将数据从P30将数据输出。
T0定时产生38KHz载波信号,与门采用了74LS08。
红外数据射发射电路图如2-8所示。
图2-8红外数据发射电路
2.3单片机红外接收器的电路设计
2.3.1红外接收电路
LT0038是用于红外遥控接收的小型一体化接收头,集成红外线的接收、放大、解调,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输,中心频率38.0kHz。
红外接收电路连接图如图2-9所示。
图2-9红外接收电路图
原设计采用八路LED显示
2.3.2八路LED开关电路
八路开关电路的实现是本次设计的重点,通过八路开关的功能演示来体现本次多功能红外遥控器的设计思想,其电路图2-10所示。
图2-10八路LED开关电路
修改后采用LCD屏幕显示发射的字符电路如图2-11
图2-11接收及显示电路
三.实际各部分电路的调试过程遇到的问题及解决方案
原设计首先对矩阵键盘进行了测试,发现出现了短路,及按键损坏,下载程序后测量晶振正常起振频率为11.0592正弦波,按下按键测量发射脚P30为38K正常,P37脚发射波形持续时间不对,对程序中的时间进行调整,仍得不到正确波形,检查后发现线性关系错误,修改后得到了正确的波形,紧接着测量与门输出正确为38K和发射波形相乘结果。
接收电路经测量复位电路并联电容出现了短路,修改后得到了正确的结果。
四.测试结果
原设计实物图
修改后设计实物图
原设计虽未在硬件上实现但得到了正确的仿真结果如下
五.成功经验和失败原因:
收获和不足
初次设计发送采用了AT89C51,此单片机是精简的AT89C51,但程序下载较困难,需要特殊下载电路,因此耽误了设计的进度。
修改后设计发送采用较常用的AT89S系列,晶振为24M,采用电脑做为发射信号源消除了键盘发射的复杂性,但在显示上采用了LCD12864液晶屏使设计更加有意义。
在这次设计中因为中途更换了题目了解了很多种芯片包括AT89C2051AT89S52STC89C52以及矩阵键盘、红外发射管、红外一体化接收头、LCD等的构造原理及使用方法。
此次设计起初因为芯片选择出现问题,程序无法下载,之后因为元器件放置不当而损坏以及程序错误得不到理想波形,经过查询资料请教老师并对电路进行各级排查,在各测试点检测波形得到了正确的发射码字。
通过本次设计对单片机有了更深的了解,锻炼了编程能力以及硬件检错能力,加强了我们动手、思考和解决问题的能力,出现差错的随机应变能力,和与人合作的能力,今后的制作应该会更加更轻松。
在整个设计过程中,我们通过这个方案包括设计了一套电路原理和PCB连接图,和芯片上的选择。
由于粗心出现了很多基础性错误,也因此耗费了很多时间。
做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。
在制作PCB时,发现细心耐心,恒心一定要有才能做好事情,首先是线的布局上既要美观又要实用和走线简单,兼顾到方方面面去考虑是很需要的,否则只是一纸空话。
其次我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
设计的过程可以说是困难重重,过程中发现了自己很多的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固遇到的很多专业知识问题,最后在老师的专业指导下,终于迎刃而解。
对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
1、《单片机原理及接口技术》[M],高等教育出版社
2、《C语言控制与应用》[M],清华大学出版社
3、《高频电子线路》[M],高等教育出版社
4、《实用声光及无线电遥控电路300例》[M],中国电力出版社出版
5、《单片机典型模块设计实例导航》[M],人民邮电出版社
附录
键盘及发送程序
#include
#include
#include"lcd.h"
staticbitOP;//红外发射管的亮灭
staticunsignedintcount;//延时计数器
staticvolatileunsignedintendcount;//终止延时计数
chariraddr1;//十六位地址的第一个字节
chariraddr2;//十六位地址的第二个字节
typedefunsignedcharuchar;
unsignedchardatau,flagu=0;
ucharkbscan(void);
voidSendIRdata(charp_irdata);
voiddelay();
voiddelays(unsignedcharc);
ucharkbscan(void)
{
ucharsccode,recode;
P1=0x0f;
//置所有行为低电平,列扫描,列线输入
if((P1&0xf0)!
=0xf0)//判断是否有有键按下,有往下执行
{
delay();//延时去抖动(10ms)
if((P1&0xf0)!
=0xf0)//再次判断列中是否是干扰信号,不是则向下执行
{
sccode=0xFE;//逐行扫描初值(即先扫描第1行)
while((sccode&0x10)!
=0)//行扫描完成时停止while程序
{
P1=sccode;//输出行扫描码
if((P1&0xf0)!
=0xf0)//本行有键按下
{
recode=(P1&0xf0)|0x0f;//列
return(sccode&recode);//返回行和列
}
else//所扫描的行没有键按下,则扫描下一行{
//sccode=(~sccode);
//sccode=(sccode<<1);
//sccode=(~sccode);
//sccode=(~((~sccode)<<1));//行扫描码左移一位
sccode=(sccode<<1)|0x01;
}
}
}
}
else
{
return0;//无键按下,返回0
}
}
voidmain(void)
{
volatileunsignedcharkey;
volatileunsignedcharmod;
count=0;
OP=0;
P3_7=0;
P3_0=1;
P3_1=1;
P3_3=1;
EA=1;//允许CPU中断
TMOD=0x21;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
TH0=0xFF;
TL0=0xE8;//设定时值0为38K也就是每隔26us中断一次
TR0=1;//开始计数
SCON=0X50;
TH1=230;
TL1=230;
TR1=1;
IE|=0X90;
iraddr1=0xff;
iraddr2=0xff;
init_lcd();
qingping();
do{
key=kbscan();
delays
(2);
if(key==0xed)
{
mod=1;
}
elseif(key==0xdd)
{
mod=0;
}
if(mod==0)
{
if(flagu)
{
SendIRdata(datau);
flagu=0;
}
write_com(0x80);
write_data(0x43);
}
else
{
switch(key)
{
case0xed:
SendIRdata(0x00);//0
break;
case0xDD:
SendIRdata(0x01);//1
break;
case0xBD:
SendIRdata(0x02);//2
P3_1=~P3_1;
break;
case0x7D:
SendIRdata(0x03);//3
break;
case0xEB:
SendIRdata(0x04);//4
break;
case0xDB:
SendIRdata(0x05);//5
break;
case0xBB:
SendIRdata(0x06);//6
break;
case0xE7:
P3_0=1;
break;
case0xD7:
P3_1=1;
break;
case0xB7:
P3_2=1;
break;
default:
break;
}
}
}while
(1);
}
//定时器0中断处理
voidtimeint(void)interrupt1
{
TH0=0xFF;
TL0=241;//设定时值为38K也就是每隔26us中断一次
count++;
P3_3=~P3_3;
}
voidserial()interrupt4using3
{
if(RI)
{
RI=0;
datau=SBUF;
flagu=1;
}
}
voidSendIRdata(unsignedcharp_irdata)
{
chari;
volatileunsignedcharirdata;
//发送4.5ms的起始码
endcount=351;
count=0;
P3_7=1;
do{}while(count//发送9ms的结果码
endcount=768;
count=0;
P3_7=0;
do{}while(countfor(i=0;i<8;i++)
{
irdata=(0X80>>i);
if(p_irdata&irdata)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=123;
count=0;
P3_7=1;
do{}while(countendcount=45;
count=0;
P3_7=0;
do{}while(count}
else
{
endcount=45;
count=0;
P3_7=1;
do{}while(countendcount=45;
count=0;
P3_7=0;
do{}while(count}
}
}
voiddelay()
{
unsignedinti,j;
for(i=0;i<26;i++)
{
for(j=0;j<20;j++)
{
_nop_();
}
}
}
voiddelays(unsignedcharc)
{
unsignedinti;
for(i=0;idelay();
}
解码及LED程序
#include
#include
sfrp0=0x80;
sfrp3=0xb0;
sbitp10=P1^0;
sbitp32=P3^2;
sbitp00=P0^0;
sbitp01=P0^1;
sbitp02=P0^2;
sbitp03=P0^3;
sbitp04=P0^4;
sbitp05=P0^5;
sbitp06=P0^6;
sbitp07=P0^7;
unsignedcharled,dm,i,j,k;
voidds_9ms(void)
{
unsignedcharj,k;
for(j=180;j>0;j--)
for(k=50;k>0;k--);
}
voidds0_56ms(void)
{
unsignedchari,j;
for(i=3;i>0;i--)
for(j=184;j>0;j--);
}
voidds4_5ms(void)
{
unsignedchari,j;
for(i=90;i>0;i--)
for(j=50;j>0;j--);
}
voidds1_68ms(void)
{
unsignedchari,j;
for(i=9;i>0;i--)
for(j=184;j>0;j--);
}
voidds0_1ms(void)
{
unsignedchari,j;
for(i=9;i>0;i--)
for(j=10;j>0;j--);
}
voidmain()
{
IT0=1;
EX0=1;
EA=1;
dm=0;
p0=0;
p10=1;
P2=0xff;
while
(1)
{
p10=~p10;
ds0_1ms();
}
}
/*
voidt0(void)interrupt0using2//
{
unsignedchartt,flag;
EA=0;
flag=1;
for(tt=0;tt<40;tt++)
{
if(p32==0)
{
flag=0;
break;
}
ds0_1ms();
}
while(!
p32);
if(flag)
{
for(tt=0;tt<85;tt++)
{
if(p32==1)
{
flag=0;
break;
}
ds0_1ms();
}
}
while(p32);
if(flag)
{
for(tt=0;tt<85;tt++)
{
if(p32==1)
{
flag=0;
break;
}
ds0_1ms();
}
}
while(!
p32);
if(flag)
{
for(tt=0;tt<85;tt++)
{
if(p32==1)
{
flag=0;
break;
}
ds0_1ms();
}
}
switch(led)
{
case0x00:
p00=0;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;break;
case0x01:
p00=1;p01=0;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;break;
case0x02:
p00=1;p01=1;p02=0;p03=1;p04=1;p05=1;p06=1;p07=1;break;
case0x03:
p00=1;p01=1;p02=1;p03=0;p04=1;p05=1;p06=1;p07=1;break;
case0x04:
p00=1;p01=1;p02=1;p03=1;p04=0;p05=1;p06=1;p07=1;break;
case0x05:
p00=1;p01=1;p02=1;p03=1;p04=1;p05=0;p06=1;p07=1;break;
case0x06:
p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=0;p07=1;break;
case0x07:
p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=0;break;
default:
p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;
}
}
}
LCD显示程序
#include"lcd.h"
voiddelaylcd()
{
_nop_();_nop_();_nop_();
}
voidwrite_com(unsignedcharcom)
{
unsignedchari;
set_sid();
for(i=0;i<5;i+