#define uint unsigned int
#define uchar unsigned char #define keyrow P0 #define keyline P2
uchar code keyv[8]={1,2,4,8}; uchar keyscan(void) {
uchar keyval,i; keyval=0; keyrow=0xfe; if(keyline!=0xff) for(i=0;i<4;i++)
if(~keyline==keyv[i])
keyrow=0xfd; if(keyline!=0xff) for(i=0;i<4;i++)
if(~keyline==keyv[i])
keyrow=0xfb; if(keyline!=0xff) for(i=0;i<4;i++)
if(~keyline==keyv[i])
keyrow=0xf7; if(keyline!=0xff) for(i=0;i<4;i++)
if(~keyline==keyv[i]) while(keyline!=0xff); return(keyval); }
keyval=i+5; keyval=i+9; keyval=i+1; keyval=i+13; 4.1.2遥控码发射程序流程图
红外信号发射过程:
该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲,为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控码数据帧间隔大于10ms 。当某个被控电器的电源开关被按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz方波由红外线发光管发身出去。
相应的遥控码发射程序如下:
sbit remoteout=P3^5; extern void delay1ms(uint time); /*************初始化函数***********/ void init(void) {
remoteout=0; IE=0x00; IP=0x08;
TMOD=0x22; TH1=0xf3; TL1=0xf3;
EA=1; }
/*****************发射函数***********/ void send_infrared(uchar keyval) {
uchar m;
ET1=1;TR1=1;delay1ms(3);ET1=0;TR1=0;remoteout=0;
for(m=keyval;m>0;m--) {
delay1ms(1); ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; }
delay1ms(10); }
/******************40KHZ发生器************/ void time_intt1(void) interrupt 3 { remoteout=~remoteout; }
4.1.3遥控发射主程序流程图
遥控发射的主程序流程图:首先初始化程序,然后调用键扫描程序。相应的发射主程序如下:
#include#define uint unsigned int
#define uchar unsigned char extern uchar keyscan(void); extern void init(void);
extern void send_infrared(uchar keyval); void delay1ms(uint time) { uint i,j;
for(i=0;i