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