南昌航空大学 学士学位论文
void keyscan() //按键扫描 {
if(k1==0)
{ delay(10); if(k1==0)
{ keyflag=1;
while(!k1); IRdata=0x11; } }
if(k2==0) {
delay(10); if(k2==0)
{
keyflag=1;
while(!k2); IRdata=0x22; } }
if(k3==0) {
delay(10); if(k3==0)
{ keyflag=1; while(!k3); IRdata=0x33; } }
if(k4==0) {
delay(10); if(k4==0)
{
keyflag=1; while(!k4); IRdata=0x44; }
31
南昌航空大学 学士学位论文
}
if(k5==0) {
delay(10); if(k5==0) {
keyflag=1; while(!k5); IRdata=0x55; } } }
void IR_sendbyte() //红外发送一个字节数据 { unsigned char i;
for(i=0;i<8;i++) //发送8位数据
{ set_count=35; //发送编码中的0.56ms高电平 IRflag=1; // 启动红外发射二极管发射 count=0; //中断计数先清零 TR0=1; //开启定时器0
while(count if(IRcode&0x01) set_count=130; //判断最低位,若为1则1.69ms的低电平 else set_count=35; //为0则0.565ms的低电平 IRflag=0; //低电平则不发射 count=0; //中断计数清零 TR0=1; //开启定时器0 while(count IRcode=IRcode>>1; //将数据右移,即从低位到高位发送 } } void IR_send() { set_count=672; //发送编码中的引导码(9ms高电平+4.5ms低电平) IRflag=1; //启动红外发射二极管发射 count=0; //中断计数清零 TR0=1; while(count set_count=336; //发送编码中的4.5ms低电平 32 南昌航空大学 学士学位论文 IRflag=0; count=0; TR0=1; while(count IRcode=IRsys[0]; //发送16位用户码的前8位 IR_sendbyte(); IRcode=IRsys[1]; //发送16位用户码的后8位 IR_sendbyte(); IRcode=IRdata; //发送8位数据码 IR_sendbyte(); IRcode=~IRdata; //发送8位数据反码 IR_sendbyte(); set_count=35; //发送编码中的0.56ms高电平 IRflag=1; count=0; TR0=1; while(count delay(23); //延时23ms(编码中的23ms低电平) set_count=670; //发送编码中的引导码(9ms高电平+4.5ms低电平) IRflag=1; count=0; TR0=1; while(count set_count=336; //发送编码中的4.5ms低电平 IRflag=0; count=0; TR0=1; while(count set_count=35; //发送编码中的0.56ms高电平 IRflag=1; count=0; TR0=1; while(count void timer0_init() //定时器初始化 { 33 南昌航空大学 学士学位论文 EA=1; TMOD=0x02; //定时0 8位自动重装模式 ET0=1; TH0=0xF3; //定时26us,38K红外矩形波 TL0=0xE6; } void main() { timer0_init(); //初始化定时器 count=0; //中断清0 IR=0; IRflag=0; //红外标志位设置为0 while(1) { keyscan(); //键盘扫描 if(keyflag) //判断是否完成按键操作 { delay(10); IR_send(); //发送红外编码指令 delay(500); keyflag=0; //将按键标志位设置为0 delay(100); } } } void timer0() interrupt 1 { count++; if(IRflag==1) //假如开始发射红外编码指令 IR=~IR; //有发射标志,则发射38khz的矩形波 else IR=0; } 34 南昌航空大学 学士学位论文 附录3:接收部分软件 #include #define uint unsigned int sbit IR=P3^2; //红外接口标志 sbit led1=P1^5; //第一个led是和P1^0口连接的。 sbit led2=P1^6; sbit led3=P1^7; sbit RS = P1^0 ; sbit RW = P1^1 ; sbit EN = P2^5 ; sbit STA7 = P0^7; typedef unsigned char uint8; unsigned char code word1[]={\ //对应5个按键的五个显示 unsigned char code word2[]={%unsigned char code word3[]={%unsigned char code word4[]={%unsigned char code word5[]={%unsigned char code word6[]={\/*------------------------------------------------0 00 全局变量声明 ------------------------------------------------*/ unsigned char IRtime;//红外用全局变量 bit IRpro_ok,IRok; unsigned char IRcord[4]; unsigned char IRdata[33]; /*----------------------------------------------- -------------lcdxianshi-----------------------*/ /** * 等待繁忙标志 */ void wait(void) { P0 = 0xFF; do { RS = 0; RW = 1; EN = 0; EN = 1; 35