图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函数,数据接收