光电系统设计—实验报告实验名称:红外遥控的跑马灯和计数器姓名:谢雯学院:行知学院专业班级:光信息科学与技术111班学号: 11626105指导老师:钱惠国时间:2014.7.05红外遥控的跑马灯和计数器——设计部分摘要: 本设计是以红外技术为基础,可以实现无线遥控,摆脱了信息传递需要导线的性质,而且红外实现方式灵活,得到了广泛的应用。
特别是随着芯片技术的发展,红外集成芯片价格的降低,更加扩展了红外的应用范围。
本文简单地介绍了红外线遥控发射、接收系统的原理。
通过编码发射红外线,然后由通用红外接收芯片实现对红外的接收,同时通过红外遥控控制了跑马灯与计数器的显示。
本方案简洁可行。
充分利用现有的资源,取得了比较好的效果。
关键词:红外遥控;红外解码;计数器;跑马灯一、实验原理:红外发射与接收系统的设计方案: 1 发射电路信号发射电路如图2.11-2所示,在三极管PNP 的基极上加上数据编码的高低电平信号可以使红外发光二极管发出调制信号。
图2.11-2 信号发射电路红外LED1.1 PNP 型三极管结构三极管的基本结构是两个反向连结的pn 接面,如图1所示。
三个接出来的端点依序称为射极(emitter,E )、基极(base,B )和集极(collector,C ),名称来源和它们在三极管操作时的功能有关。
图中也显示出pnp 三极管的电路符号,射极特别被标出,箭号所指的极为n型半导体,和二极体的符号一致。
在没接外加偏压时,两个pn接面都会形成耗尽区,将中性的p型区和n型区隔开。
图12 红外接收模块SM0038的结构和使用接收模块SM0038的结构和常用使用电路如图2.11-3所示,其接收响应38KHz 的脉冲调制信号,当接收到38KHz的脉冲时输出低电平,否则输出高电平,如图2.11-4所示,其中(a)是接收信号,(b)是输出信号。
38KHz的调制脉冲可以由单片机的计数中断功能实现。
图2.11-3SM0038的结构与电路(a)(b)图2.11-4SM0038的接收与输出信号(c)3 数据的编码与数据帧的建立发送的数据需要转换成用“0”和“1”来表示的二进制码,最简单的是BCD编码,如果采用8位BCD编码,“2”可以编码成00000010。
其中“1”表示高电平,“0”表示低电平。
若使用SM0038模块进行接收,还需要对高电平进行38KHz 的脉冲调制,最终数据“2”的调制发射信号如图2.11-4(c)所示。
为了提高系统的可靠性,通常使发射系统发送的不是单个数据,而是数据帧。
本实验数据帧主要由引导码(同步码)、识别码(校验码)、数据码和结束码组成,其结构如图2.11-5所示。
其中,引导码包含时长为9ms的高电平和4.5ms的低电平;识别码包含识别数和识别数的取反,设识别数为0x80(10000000)则识别码用二进制表示为1000000001111111;数据码包含数据本身和数据取反;结束码包含0.65ms的高电平和40ms的低电平。
其中,识别码和数据码的二进制码采用脉宽调制,“0”用时长为0.65ms的高电平和1.6ms的低电平表示,“1”用时长为0.65ms的高电平和0.56ms的低电平表示。
若使用SM0038接收,同样还需要对高电平进行38KHz的脉冲调制。
图2.11-5发送数据帧的结构示意图4 发射与接收程序的流程图系统中数据信号的发射与接收都需要由单片机控制完成,发射系统的单片机程序设计流程图如图2.11-6所示,接收系统的单片机程序设计流程图如图2.11-7所示。
图2.11-6发射流程图图2.11-7接收流程图5 数据接收与解码需要注意的是,SM0038的输出信号与发射端的信号是反向的,即发射端信号是高电平则SM0038输出低电平。
数据接收过程中,先接收到引导码(其特征是一个9ms的低电平和一个4.5ms的高电平),这个引导码可以使程序知道后面开始接收数据。
接收数据最关键的是如何识别“0”和“1”。
从位的编码可以发现,接收信号中的“0”和“1”都是以0.65ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.6 ms,所以应该根据高电平的宽度辨别“0”和“1”。
从0.65 ms的低电平后,对高电平进行计时,直至读到低电平为止,若计时超过0.56 ms为“1”,反之则为“0”。
为可靠起见,计时的比较值一般比0.56 ms长些,但不能超过1.6 ms。
因为每个数据用8位二进制码表示,所以需用循环和移位的方法读取完整的数据。
6 跑马灯程序设计内容我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。
每次送出的数据是不同,具体的数据如下表1所示:7 计数器程序设置内容七段数码管字型代码与输入的关系如下表:三、实验原理图发射原理图接收原理图PCB原理图四.程序编码接收板:跑马灯程序Org 0000hMov A , 2000HAdd A ,#F0HMOV 2001H ,AMOV A ,2000HADD A , #0FHMOV 2002H , AMOV A , 2001HADD A , 2002HENDorg 0000hloop0:cjne r0 ,#01h,rel,loop0 ;判断开关打开情况ajmp start;跳转到程序开始org 0030h;定义起始汇编地址start: mov a,#0ffh ;clr c ;mov r2,#08h ;循环八次。
loop: rlc a ;带进位左移。
mov p0,a ;此时led灯开始有反映了。
call delay ;延时djnz r2,loop ;循环(djnz条件判断)mov r2,#07h ;loop1: rrc a ;带进位右移mov p0,a ;此时led灯开始有反映了call delay ;djnz r2,loop1 ;反复循环jump start ;回到程序的开头delay:movr3,#2d1: mov r4,#20 d2: mov r5,#248 djnz r5,$ djnz r4,d2ORG 0000H LJMP MAIN ORG 030HMAIN: MOV P0,#0DBH 化为2进制为11011011--0状态时led灯亮ACALL DELayMOV P0,#06DH 化为2进制为01101101 ACALL DELayMOV P0,#0B6H 化为2进制为10110110 ACALL DELay AJMP MAIN delay: mov r7,#255 d1: mov r6,#255 d2: djnz r6,d2 djnz r7,d1 retEnd七段数码管计数器显示程序library ieee;use ieee.std_logic_1164.all; entity decl7s isport(d:in std_logic_vector(3 downto 0);led:out std_logic_vector(6 downto 0));end;architecture a of decl7s is beginprocess(d) begin case d iswhen"0000"=>led<="0111111"; when"0001"=>led<="0000110"; when"0010"=>led<="1011011"; when"0011"=>led<="1001111"; when"0100"=>led<="1100110"; when"0101"=>led<="1101101" ; when"0110"=>led<="1111101"; when"0111"=>led<="0000111"; when"1000"=>led<="1111111" ; when"1001"=>led<="1101111"; when"1010"=>led<="1110111"; when"1011"=>led<="1111100" ; when"1100"=>led<="0111001"; when"1101"=>led<="1011110"; when"1110"=>led<="1111001" ; when"1111"=>led<="1110001"; when others=>null;end case;end process;end a;发射板程序:实现红外发射的C51程序原代码如下:[1]#include <REG51.h>[2]#define uchar unsigned char[3]#define uint unsigned int[4]#define SBM 0x80 //识别码[5]#define m9 (65536-9000) //约9mS[6]#define m4_5 (65536-4500) //约4.5mS[7]#define m1_6 (65536-1630) //约1.65mS[8]#define m_65 (65536-580) //约0.65mS[9]#define m_56 (65536-560) //约0.56mS[10]#define m40 (65536-40000)//约40mS[11]#define m56 (65536-56000)//56mS[12]#define m2_25 (65536-2250) //约2.25mS[13]sbit IR = P3^5;//定义发射引脚(接PNP三极管基极)[14]void delay(uchar time) //延时函数,约1ms[15]{uchar i,j;[16]for(i=0; i<time; i++)[17]for(j=0; j<110; j++);}[18]void TZ_38K(bit BT,uint x) /***38KHz脉冲调制函数,入口为脉冲,延时*****/[19]{TH0 = x>>8;//取高8位给TH0[20]TL0 = x; //低8位给TL0[21]TF0=0; //标志位清0[22]TR0=1; //启动定时器0[23]if(BT == 0) while(!TF0);//BT=1发射38KHz脉冲且延时;BT=0只延时;[24]else while(1) //38KHz脉冲,占空比5:26[25]{IR = 0;[26]if(TF0)break;[27]if(TF0)break;[28]IR = 1;[29]if(TF0)break;[30]if(TF0)break;[31]if(TF0)break;[32]if(TF0)break;[33]if(TF0)break;[34]if(TF0)break;[35]if(TF0)break;[36]if(TF0)break;[37]if(TF0)break;[38]if(TF0)break;}[39]TR0=0; //关闭定时器0[40]TF0=0; //标志位溢出则清0[41]IR =1;} //脉冲停止后,发射端口常态为高电平[42]void Send_SD(uchar temp)/***发送单个数据码函数,入口为单个发送数据*****/[43]{uchar v;[44]for (v=0;v<8;v++) //循环8次移位[45]{TZ_38K(1,m_65); //高电平0.65ms[46]if(temp&0x01) TZ_38K(0,m1_6); //最低位为1,低电平1.6ms[47]else TZ_38K(0,m_56);[48]temp >>= 1;}} //右移一位[49]uchar KEY(void)/*******按键函数,返回键值********************/[50]{uchar H=0,L=0; //行值,列值[51]P1=0xF0; //将键盘端口行值设为1,列值设为0[52]if(P1!=0xF0) //检测是否有按键按下,如果有则P1必不为0x0F[53]{delay(10); //按键去抖动,延时10毫秒[54]if(P1!=0xF0) //确实有按键按下[55]{H=P1&0xF0; //按键后得到按键的行标志位[56]P1=0x0F; //翻转键盘接口输出[57]L=P1&0x0F;} //得到列标志位[58]return (H+L);}[59]return 0;}[60]void Send(uchar x)/*******发送函数,入口为按键值**************/[61]{TZ_38K(1,m9);//发送开始码:高电平9mS,低电平4.5ms[62]TZ_38K(0,m4_5);[63]Send_SD(SBM); //发送识别码[64]Send_SD(~SBM);[65]Send_SD(x); //发送按键响应数据[66]Send_SD(~x);[67]TZ_38K(1,m_65);//发送结束码:高电平0.65ms,低电平40ms[68]TZ_38K(0,m40);[69]while(KEY()) //重复码,无效[70]{TZ_38K(1,m9);[71]TZ_38K(0,m2_25);[72]TZ_38K(1,m_56);[73]TZ_38K(0,m40);[74]TZ_38K(0,m56);}}[75]/*********************************************************/[76]void main(void) /*****************主函数*****************/[77]{uchar k;[78]TMOD = 0x01; //T0 16位工作方式[79]IR=1; //发射端口常态为高电平[80]while(1)[81]{k=KEY();[82]switch(k)[83]{case 0xEE:Send(0x01);k=0;break; //key1响应[84]case 0xED:Send(0x02);k=0;break; //key2响应[85]case 0xEB:Send(0x03);k=0;break; //key3响应[86]default:k=0;}}}电子工艺—实验报告实验名称:红外遥控的跑马灯和计数器姓名:谢雯学院:行知学院专业班级:光信息科学与技术111班学号: 11626105指导老师:钱惠国时间: 2014.7.05红外遥控的跑马灯和计数器——操作部分一、实验目的通过自己动手,实际操作,熟悉并掌握PCB制版的主要工艺流程,并培养自己独立思考的能力,加强动手操作能力。