欢迎来到天天文库
浏览记录
ID:52780140
大小:24.00 KB
页数:5页
时间:2020-03-30
《程序流程图及代码.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于BS5104红外遥控器发射与接收设计制作学号:20100030101姓名:刘靖班级:T1003—1一.发射部分发射电路有BA5104等构成发射电路,详细见发射部分原理图,BA5104工作原理实验讲义、网上资料都有详细讲解,这里就不浪费篇幅做再一说明,二.接收解码部分接收采用一体化接收头加反相器,解码由单片机完成,外围有数码管、1602液晶、8个LED灯将接收码显示出来。详细见接收部分原理图。由于各个部分都相对较简单且讲义上都有详细说明,这里就不做赘述,仅将制作部分及解码程序贴出来。/***关于BA510
2、4红外编码51单片机解码程序***//***2013-12-11***//***MCU-STC89C52***//**晶振12MHZ**//**一体化接收头接收数据与发射数据相反,在电路中加一反相器**/#include#defineuintunsignedint#defineucharunsignedcharsbitIR_Data=P2^1;//定义一体化接收头数据位uintIR[3];//用于装取一次接受的多帧数据ucharK_Data;//装取正确键值uintmscount;void
3、init(){IR_Data=1;//释放数据线TMOD=0x10;//设置定时器1TH1=(65536-100)/256;//装初值TL1=(65536-100)%256;//ET1=1;//开定时器1中断EA=1;//开总中断mscount=0;}voiddelay_0_1ms(uintendcount){TR1=1;//开定时器1,开始计时while(mscount4、idtime1()interrupt3using3{TH1=(65536-100)/256;//0.1ms产生一次中断,mscount加一TL1=(65536-100)%256;//用定时写延时函数,时间较准确且易控制mscount++;}ucharIR_Receive_data(){uintdate;uchari,j,k;for(k=0;k<32;k++){delay_0_1ms(10);if(IR_Data==1)//若在32ms内出现高电平则认为是干扰视为无效信号,退出{k=32;break;}els5、eif(k==31)//若低电平持续了32ms{while(IR_Data==0);//等待低电平持续完for(i=0;i<3;i++)//对一帧数据读三次进行比较确保准确性{for(j=1;j<=12;j++)//读取12位数据{while(IR_Data==0);//等待上升沿delay_0_1ms(8);//0值高电平时间为0.4ms,1值高电平时间为1.2ms,取中间值0.8ms,if(IR_Data==1)//若0.8ms后仍为高电平则认为接收到为1{delay_0_1ms(8);//等待一位数据6、传输完毕date=date7、0x8000;//使数据最高位为1if(j<12)//在12位数据未接收完时date=date>>1;//将数据向右移一位(每次接收数据最高位)}else//若0.8ms后为低电平,则认为接收的为0;{delay_0_1ms(8);//等待一位数据传输完毕if(j<12)//date=date>>1;//右移一位最高位自动补0}}delay_0_1ms(64);//跳过4位间隔位IR[i]=date>>4;//取数据低12为date=0;}}}if((IR[0]==IR[1])&8、&(IR[0]==IR[2])&&(IR[1]=IR[2]))//K_Data=(IR[0]%256)&0x7f;//取低7位键值return(K_Data);}voidmain(){uchari,a;init();while(1){i=IR_Receive_data();switch(i){case0x01:a=1;break;//得到的a值即可认为是键码值,后面case0x02:a=2;break;//可以根据a的值进行其他操作。case0x04:a=3;break;//case0x08:a=4;bre9、ak;//case0x10:a=5;break;case0x20:a=6;break;case0x43:a=7;break;case0x46:a=8;break;default:break;}}}
4、idtime1()interrupt3using3{TH1=(65536-100)/256;//0.1ms产生一次中断,mscount加一TL1=(65536-100)%256;//用定时写延时函数,时间较准确且易控制mscount++;}ucharIR_Receive_data(){uintdate;uchari,j,k;for(k=0;k<32;k++){delay_0_1ms(10);if(IR_Data==1)//若在32ms内出现高电平则认为是干扰视为无效信号,退出{k=32;break;}els
5、eif(k==31)//若低电平持续了32ms{while(IR_Data==0);//等待低电平持续完for(i=0;i<3;i++)//对一帧数据读三次进行比较确保准确性{for(j=1;j<=12;j++)//读取12位数据{while(IR_Data==0);//等待上升沿delay_0_1ms(8);//0值高电平时间为0.4ms,1值高电平时间为1.2ms,取中间值0.8ms,if(IR_Data==1)//若0.8ms后仍为高电平则认为接收到为1{delay_0_1ms(8);//等待一位数据
6、传输完毕date=date
7、0x8000;//使数据最高位为1if(j<12)//在12位数据未接收完时date=date>>1;//将数据向右移一位(每次接收数据最高位)}else//若0.8ms后为低电平,则认为接收的为0;{delay_0_1ms(8);//等待一位数据传输完毕if(j<12)//date=date>>1;//右移一位最高位自动补0}}delay_0_1ms(64);//跳过4位间隔位IR[i]=date>>4;//取数据低12为date=0;}}}if((IR[0]==IR[1])&
8、&(IR[0]==IR[2])&&(IR[1]=IR[2]))//K_Data=(IR[0]%256)&0x7f;//取低7位键值return(K_Data);}voidmain(){uchari,a;init();while(1){i=IR_Receive_data();switch(i){case0x01:a=1;break;//得到的a值即可认为是键码值,后面case0x02:a=2;break;//可以根据a的值进行其他操作。case0x04:a=3;break;//case0x08:a=4;bre
9、ak;//case0x10:a=5;break;case0x20:a=6;break;case0x43:a=7;break;case0x46:a=8;break;default:break;}}}
此文档下载收益归作者所有