1、集成电路原理与设计专题报告集成电路原理与设计专题报告关于单片机红外控制的研究 1、专题背景红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计家用电器的红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用
2、电器上普及红外线遥控提供了极大的方便。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。2、思路总结为了解红外遥控技术,我们选取单片机作为研究对象。我们以红外遥控控制单片机上一LED灯亮灭这一简单操作为目的,并以LED亮的不同时间来区分不同按键。所以这里我们需要做的主要是:掌握红外遥控原理和不同按键代码1、红外遥控原理红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。 当
3、某个按键按下时,系统首先发射一个完整的全码(示意图如下),一个完整的全码=引导码+用户码+用户码+数据码+数据反码。 其中,引导码由9ms的起始码和4.5ms的结果码组成;系统码8 位,数据码8 位,共32 位;其中前 16 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后 16 位为 8 位的操作码和 8 位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行什么动作的判断。连发代码是在持续按键时发送的码,如果键按下超过108ms 仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成,它告知接收端,某键是在被连续地按着。
4、全码示意图解码的关键是如何识别“0”和“1”。“0”、“1”均以 0.56ms的低电平开始,不同的是高电平的宽度不同。“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。2、如何知道遥控发射的不同代码这里我们用LCD屏来显示按键的代码(LDE显示
5、原理这里不做介绍),在得到每个按键的代码后,我们将代码写进程序,并用其来实现不同的操作。(具体程序见电子档附录)3、红外遥控的应用红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。由于其无法穿透墙壁,所以不同房间的家用电器可使用通用遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,
6、可进行多路遥控。现在红外遥控在家用电器、室内近距离遥控中 得到了广泛的应用。另外模块还可以用在其他红外遥控系统中,应用前景十分广阔。附录:LCD.H 头文件:#ifndef _LCD_H_#define _LCD_H_/*当使用的是4位数据传输的时候定义,使用8位取消这个定义*/#define LCD1602_4PINS/*包含头文件*/#include/-重定义关键词-/#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/*PIN口定义*/#define LCD1
7、602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P25;sbit LCD1602_RS=P26; /*函数声明*/*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); /误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/ void LcdInit(); #endifLCD.C 文件:* 输 出 : 无
8、* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。*/void Lcd1602_Delay1ms(uint c) /误差 0us uchar a,b; for (; c0; c-) for (b=199;b0;b-) for(a=1;a0;a-); /* 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无*/#ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令 LCD1602_E = 0; /使能 LCD1
9、602_RS = 0; /选择发送命令 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = com; /放入命令 Lcd1602_Delay1ms(1); /等待数据稳定 LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); /保持时间 LCD1602_E = 0;#else void LcdWriteCom(uchar com) /写入命令 LCD1602_E = 0; /使能清零 LCD1602_RS = 0; /选择写入命令 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = com; /由于4位的
10、接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;/ Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com 4; /发送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;#endif/* 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输
11、出 : 无*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) /写入数据 LCD1602_E = 0; /使能清零 LCD1602_RS = 1; /选择输入数据 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = dat; /写入数据 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); /保持时间 LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat) /写入数据 LCD1602_E = 0;
12、/使能清零 LCD1602_RS = 1; /选择写入数据 LCD1602_RW = 0; /选择写入 LCD1602_DATAPINS = dat; /由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = dat 4; /写入低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; /写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;#endif
13、/* 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*/ #ifndef LCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示 LcdWriteCom(0x0c); /开显示不显示光标 LcdWriteCom(0x06); /写一个指针加1 LcdWriteCom(0x01); /清屏 LcdWriteCom(0x80); /设置数据指针起点#elsevoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x32); /将8位总线转为4位总线 L
14、cdWriteCom(0x28); /在四位线下的初始化 LcdWriteCom(0x0c); /开显示不显示光标 LcdWriteCom(0x06); /写一个指针加1 LcdWriteCom(0x01); /清屏 LcdWriteCom(0x80); /设置数据指针起点#endif主函数:/* 实验名 : 1602显示红外线值实验* 使用的IO : 电机用P1口,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果 : LCD1602显示出读取到的红外线的值* 注意 :*/ #include#includelcd.h#define led_on led=0;#define led_o
15、ff led=1; sbit IRIN=P32;sbit led = P20;int key = 0;char key_flag=0;unsigned char val_1=0;unsigned char val_2=0;unsigned int Time;unsigned char code CDIS113= Red Control ;unsigned char code CDIS213= IR-CODE:-H ;unsigned char IrValue6;unsigned long counter;void IrInit();void DelayMs(unsigned int );voi
16、d Timer_0_Configuration();/* 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*/void main() unsigned char i; Timer_0_Configuration(); IrInit(); LcdInit(); LcdWriteCom(0x80); for(i=0;i13;i+) LcdWriteData(CDIS1i); LcdWriteCom(0x80+0x40); for(i=0;i4; /高位 IrValue5=IrValue2&0x0f; /低位 if(IrValue2!=0) val_1=IrValue4;
17、 val_2=IrValue5; if(val_19) LcdWriteCom(0xc0+0x09); /设置显示位置 LcdWriteData(0x37+val_1); /将数值转换为该显示的ASCII码 else LcdWriteCom(0xc0+0x09); LcdWriteData(val_1+0x30); /将数值转换为该显示的ASCII码 if(val_29) LcdWriteCom(0xc0+0x0a); LcdWriteData(val_2+0x37); /将数值转换为该显示的ASCII码 else LcdWriteCom(0xc0+0x0a); LcdWriteData(va
18、l_2+0x30); /将数值转换为该显示的ASCII码 key_flag = IrValue4 * 10 + IrValue5; if(key!=key_flag) key=key_flag; switch(key) /case 45: led_off; TR0 = 0; counter=0;IrValue2=0; break; /直接灭 case 44: led_on ; TR0 = 1; counter=0;IrValue2=0; break; /秒灭 case 7: led_on ; TR0 = 1; counter=0; break; /3分钟 case 16: led_on ; T
19、R0 = 1; counter=0; break; /5分钟 case 12: led_on ; TR0 = 1; counter=0; break; /10分钟 case 8: led_on ; TR0 = 1; counter=0; break; /20分钟 case 42: led_on ; TR0 = 1; counter=0; break; /30分钟 /case 90: led_on ; TR0 = 1; counter=0; break; /30分钟 default : led_off; TR0 = 0; counter=0;IrValue2=0; break; if(key=
20、7&counter=50 ) led_off; TR0 = 0; counter=0;IrValue2=0; if(key=16&counter=6000 ) led_off; TR0 = 0; counter=0;IrValue2=0; if(key=12&counter=12000) led_off; TR0 = 0; counter=0;IrValue2=0; if(key= 8&counter=24000) led_off; TR0 = 0; counter=0;IrValue2=0; if(key=42&counter=36000) led_off; TR0 = 0; counter
21、=0;IrValue2=0; /* 函数名 : DelayMs()* 函数功能 : 延时* 输入 : x* 输出 : 无*/void DelayMs(unsigned int x) /0.14ms误差 0us unsigned char i; while(x-) for (i = 0; i0) /等待前面9ms的低电平过去 DelayMs(1); err-; if(IRIN=1) /如果正确等到9ms低电平 err=500; while(IRIN=1)&(err0) /等待4.5ms的起始高电平过去 DelayMs(1); err-; for(k=0;k4;k+) /共有4组数据 for(j=0;j0)/等待信号前面的560us低电平过去/ while (!IRIN)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2