电子综合设计报告_综合电子设计报告
电子综合设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“综合电子设计报告”。
电子综合设计
红外传输设计
指导老师 :
红外传输设计总结报告
一.系统功能描述
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.1 AT89S52单片机介绍
原设计采用了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.2 STC89C52RC单片机介绍
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液晶屏使设计更加有意义。在这次设计中因为中途更换了题目了解了很多种芯片包括AT89C2051 AT89S52 STC89C52以及矩阵键盘、红外发射管、红外一体化接收头、LCD等的构造原理及使用方法。此次设计起初因为芯片选择出现问题,程序无法下载,之后因为元器件放置不当而损坏以及程序错误得不到理想波形,经过查询资料请教老师并对电路进行各级排查,在各测试点检测波形得到了正确的发射码字。
通过本次设计对单片机有了更深的了解,锻炼了编程能力以及硬件检错能力,加强了我们动手、思考和解决问题的能力,出现差错的随机应变能力,和与人合作的能力,今后的制作应该会更加更轻松。在整个设计过程中,我们通过这个方案包括设计了一套电路原理和PCB连接图,和芯片上的选择。由于粗心出现了很多基础性错误,也因此耗费了很多时间。做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。在制作PCB时,发现细心耐心,恒心一定要有才能做好事情,首先是线的布局上既要美观又要实用和走线简单,兼顾到方方面面去考虑是很需要的,否则只是一纸空话。其次我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。设计的过程可以说是困难重重,过程中发现了自己很多的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固遇到的很多专业知识问题,最后在老师的专业指导下,终于迎刃而解。对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
1、《单片机原理及接口技术》[M],高等教育出版社
2、《C语言控制与应用》[M],清华大学出版社
3、《高频电子线路》[M],高等教育出版社
4、《实用声光及无线电遥控电路300例》[M],中国电力出版社出版
5、《单片机典型模块设计实例导航》[M],人民邮电出版社 附录
键盘及发送程序 #include #include #include “lcd.h”
static bit OP;//红外发射管的亮灭
static unsigned int count;//延时计数器
static volatile unsigned int endcount;//终止延时计数 char iraddr1;//十六位地址的第一个字 节 char iraddr2;//十六位地址的第二个字节 typedef unsigned char uchar;
unsigned char datau,flagu=0;
uchar kbscan(void);
void SendIRdata(char p_irdata);void delay();void delays(unsigned char c);uchar kbscan(void){ uchar sccode,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
sccode=(sccode
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;} else if(key==0xdd){ mod=0;} if(mod==0){ if(flagu){ SendIRdata(datau);
flagu=0;}
write_com(0x80);write_data(0x43);
} else { switch(key){ case 0xed: SendIRdata(0x00);//0 break;case 0xDD:
SendIRdata(0x01);//1 break;case 0xBD:
SendIRdata(0x02);//2 P3_1=~P3_1;
break;case 0x7D: SendIRdata(0x03);//3
break;case 0xEB:
SendIRdata(0x04);//4
break;case 0xDB: SendIRdata(0x05);//5
break;case 0xBB: SendIRdata(0x06);//6
break;case 0xE7: P3_0=1;
break;case 0xD7: P3_1=1;
break;case 0xB7: P3_2=1;
break;default: break;} } }while(1);} //定时器0中断处理
void timeint(void)interrupt 1 { TH0=0xFF;TL0=241;//设定时值为38K 也就是每隔26us中断一次 count++;P3_3=~P3_3;}
void serial()interrupt 4 using 3 { if(RI){ RI=0;datau=SBUF;flagu=1;} }
void SendIRdata(unsigned char p_irdata){ char i;volatile unsigned char irdata;//发送4.5ms的起始码 endcount=351;count=0;P3_7=1;do{}while(count
for(i=0;i>i);if(p_irdata&irdata){ //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)endcount=123;count=0;P3_7=1;do{}while(count
void delay(){ unsigned int i,j;for(i=0;i
void delays(unsigned char c){ unsigned int i;for(i=0;i
#include #include
sfr p0=0x80;sfr p3=0xb0;
sbit p10=P1^0;
sbit p32=P3^2;sbit p00=P0^0;sbit p01=P0^1;sbit p02=P0^2;sbit p03=P0^3;sbit p04=P0^4;sbit p05=P0^5;sbit p06=P0^6;sbit p07=P0^7;
unsigned char led,dm,i,j,k;
void ds_9ms(void){ unsigned char j,k;for(j=180;j>0;j--)for(k=50;k>0;k--);}
void ds0_56ms(void){ unsigned char i,j;for(i=3;i>0;i--)for(j=184;j>0;j--);}
void ds4_5ms(void){ unsigned char i,j;for(i=90;i>0;i--)for(j=50;j>0;j--);}
void ds1_68ms(void){ unsigned char i,j;for(i=9;i>0;i--)for(j=184;j>0;j--);}
void ds0_1ms(void){ unsigned char i,j;for(i=9;i>0;i--)for(j=10;j>0;j--);}
void main(){ IT0=1;EX0=1;EA=1;dm=0;p0=0;p10=1;P2=0xff;while(1){ p10=~p10;ds0_1ms();} } /* void t0(void)interrupt 0 using 2// {
unsigned char tt,flag;EA=0;flag=1;for(tt=0;tt
while(p32);if(flag){ for(tt=0;tt
switch(led)
{
case 0x00:p00=0;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;break;case 0x01:p00=1;p01=0;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;break;case 0x02:p00=1;p01=1;p02=0;p03=1;p04=1;p05=1;p06=1;p07=1;break;case 0x03:p00=1;p01=1;p02=1;p03=0;p04=1;p05=1;p06=1;p07=1;break;
case 0x04:p00=1;p01=1;p02=1;p03=1;p04=0;p05=1;p06=1;p07=1;break;case 0x05:p00=1;p01=1;p02=1;p03=1;p04=1;p05=0;p06=1;p07=1;break;case 0x06:p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=0;p07=1;break;case 0x07: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”
{ _nop_();_nop_();_nop_();}
void write_com(unsigned char com){ unsigned char i;set_sid();for(i=0;i>i))set_sid();else clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();} clr_sid();for(i=0;i>i))set_sid();else clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();} clr_sid();for(i=0;i
void write_data(unsigned char datas){ unsigned char i;set_sid();for(i=0;i
set_sid();set_sclk();delaylcd();clr_sclk();delaylcd();clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();
for(i=0;i>i))set_sid();else clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();} clr_sid();for(i=0;i>i))set_sid();else clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();} clr_sid();for(i=0;i
void qingping(){ unsigned char i,j;write_com(0x34);write_com(0x36);for(i=0;i