电子综合设计报告

  • 格式:doc
  • 大小:3.43 MB
  • 文档页数:22

电子综合设计红外传输设计指导老师:红外传输设计总结报告一.系统功能描述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 <string.h>#include <stdio.h>#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<<1);//sccode=(~sccode);//sccode=(~((~sccode)<<1));//行扫描码左移一位sccode=(sccode<<1)|0x01;}}}}else{return 0; //无键按下,返回0}}void main(void){volatile unsigned char key;volatile unsigned char mod;count = 0;OP = 0;P3_7 = 0;P3_0 = 1;P3_1 = 1;P3_3 = 1;EA = 1; //允许CPU中断TMOD = 0x21; //设定时器0和1为16位模式1ET0 = 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);//4break;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<endcount);//发送9ms的结果码endcount=768;count=0;P3_7=0;do{}while(count<endcount);for(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(count<endcount);endcount=45;count=0;P3_7=0;do{}while(count<endcount);}else{endcount=45;count=0;P3_7=1;do{}while(count<endcount);endcount=45;count=0;P3_7=0;do{}while(count<endcount);}}}void delay(){unsigned int i,j;for(i=0;i<26;i++){for(j=0;j<20;j++){_nop_();}}void delays(unsigned char c) {unsigned int i;for(i=0;i<c;i++)delay();}解码及LED程序#include<at89x52.h>#include<stdio.h>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<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"void delaylcd(){_nop_();_nop_();_nop_();}void write_com(unsigned char com){unsigned char i;set_sid();for(i=0;i<5;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();for(i=0;i<3;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}for(i=0;i<4;i++){if(com&(128>>i))set_sid();elseclr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();for(i=0;i<4;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}for(i=4;i<8;i++){if(com&(128>>i))set_sid();elseclr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();for(i=0;i<4;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}}void write_data(unsigned char datas){unsigned char i;set_sid();for(i=0;i<5;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();set_sid();set_sclk();delaylcd();clr_sclk();delaylcd();clr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();for(i=0;i<4;i++){if(datas&(128>>i)) set_sid();elseclr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();for(i=0;i<4;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}for(i=4;i<8;i++){if(datas&(128>>i)) set_sid();elseclr_sid();set_sclk();delaylcd();clr_sclk();delaylcd();}clr_sid();for(i=0;i<4;i++){set_sclk();delaylcd();clr_sclk();delaylcd();}}void qingping(){unsigned char i,j;write_com(0x34);write_com(0x36);for(i=0;i<32;i++){write_com(0x80|i);write_com(0x80);for(j=0;j<16;j++) {write_data(0x00);}}for(i=0;i<32;i++){write_com(0x80|i); write_com(0x88);for(j=0;j<16;j++) {write_data(0x00);}}write_com(0x30);}void init_lcd(){clr_rest();delaylcd();set_rest();set_cs();write_com(0x01);delaylcd();write_com(0x0c);write_com(0x30);write_com(0x38);write_com(0x0e);write_com(0x01);write_com(0x06);write_com(0x0c);delaylcd(); }。