(精品)基于51单片机的红外遥控器解码设计毕业论文 下载本文

图2-16 液晶1602时序图

图2-17 LCD1602显示电路图

图2-18 LCD1602显示效果图

第3章 红外解码程序设计

使用C语言编写程序,调用的库函数多,易于移植,编程简单。

第1节 红外接收电路主程序流程图

主程序是首先初始化红外接收端口,然后检测是否接收红外信号,如果接收到红外信号就调用接收子程序,然后就通过LCD1602显示当前按键的解码值,如图3-1所示。

图3-1 红外接收主程序流程图

第2节 红外接收电路子程序流程图

子程序是首先读取T0定时器的长度,如果是1.125ms就认为是“0”,将其存入缓冲区并且计数器加一,如果是2.25ms就认为是“1”,将其存入缓冲区并且计数器加一。如

果计数器值为32时,就接收结束标志位并且将计数器清0,如果计数器值不为32时,就认为是接收误码,计数器也将清0,此时重新等待读取红外信号。如图3-2所示。

图3-2 红外接收程序流程图

附录1

部分红外解码程序 #include

void irpros(void)数据处理函数 {

uchar k=1,i,j; uchar value;

for(j=0;j<4;j++) {

for(i=0;i<8;i++) { }

ircode[j]=value; }

value=value>>1; if(irdata[k]>6) {

value=value|0x80; } k++;

irprosok=1; }

void irwork(void)数据分离函数 {

display[0]=ircode[0]16; display[1]=ircode[0];

display[2]=ircode[1]16; display[3]=ircode[1]; display[4]=ircode[2]16; display[5]=ircode[2]; display[6]=ircode[3]16; display[7]=ircode[3]; }

void numzh(void)ASCII码转换函数 {

uchar i,j=8,a; for(i=0;i<8;i++)

{

switch(display[i]) { }

case 0 :a=48;break; case 1 :a=49;break; case 2 :a=50;break; case 3 :a=51;break; case 4 :a=52;break; case 5 :a=53;break; case 6 :a=54;break; case 7 :a=55;break; case 8 :a=56;break; case 9 :a=57;break; case 10:a=65;break; case 11:a=66;break; case 12:a=67;break; case 13:a=68;break; case 14:a=69;break; case 15:a=70;break;

table1[j]=a; j++;

} }

void main()主函数 {

timer0init(); int0init(); lcdinit(); play_1();

while(1) 循环检测处理 {

if (irreceok) {

irreceok=0; irpros();

}

if(irprosok) {

irprosok=0;

irwork(); numzh(); play_2();

} } }

void tinmer0() interrupt 1定时器0中断函数 {

irtime++; }

void int0() interrupt 0 外部中断0函数,数据接收