1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
谢谢你们!小弟想做一个红外遥控系统,就是用单片机编码发射红外数据,用另一个单片机接收并解码。这边按下 key2,key3,key4,那边相应的灯1,灯2,灯3点亮。下面是小弟的程序,新手写的不好,调了几天没有现象,请哥哥姐姐们帮忙调试下。由于红外不能仿真,我用导线代替了发送和接收。
下边是程序
//*****************************红外发射*************************************************** #include #define uint unsigned int #define uchar unsigned char ***it ir=P1^4; ***it k1=P2^1; ***it k2=P2^2; ***it k3=P2^3; ***it k4=P2^4; ***it k5=P2^5; //备用 uint count,set_count; bit irflag,keyflag,irsendok; uchar irdata,ircode; void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void init() { EA=1; TMOD=0x02; //定时0 8位自动重装模式 ET0=1; TH0=0xe6; //定时13us,38K红外矩形波,晶振24M TL0=0xe6; count=0; irflag=0; ir=0; } void keyscan() { if(k1==0) { delay(10); if(k1==0) { keyflag=1; irdata=0x01; } } if(k2==0) { delay(10); if(k2==0) { keyflag=1; irdata=0x02; } } if(k3==0) { delay(10); if(k3==0) { keyflag=1; irdata=0x03; } } if(k4==0) { delay(10); if(k4==0) { keyflag=1; irdata=0x04; } } if(k5==0) { delay(10); if(k5==0) { keyflag=1; irdata=0x05; } } } void sendbyte() { uchar n; for(n=8;n>0;n--) { set_count=43; //发送编码中的0.56ms高电平 irflag=1; //启动红外发射二极管发射 count=0; //中断计数先清0 TR0=1; //开启定时器0 while(count if(ircode&0x01) set_count=130; //判断红外编码最低位,若为1则1.69ms的低电平 else set_count=43; //为0则0.565ms的低电平 irflag=0; //低电平则不发射 count=0; //中断计数清0 TR0=1; //开启定时器0 while(count ircode=ircode>>1; //将数据右移,即从低位到高位发送 } } void senddata() { set_count=346; //发送编码中的引导码(4.5ms高电平) irflag=1; //启动红外发射二极管发射 count=0; //中断计数清0 TR0=1; while(count set_count=346; //发送编码中的4.5ms低电平 irflag=0; //低电平则不发射 count=0; TR0=1; while(count ircode=irdata; //发送8位数据码 sendbyte(); ircode=~irdata; //发送8位数据反码 sendbyte(); irsendok=1; } void main() { init(); while(1) { keyscan(); //键值扫描 if(keyflag) //若有按键按下 { senddata(); //发送红外编码 if(irsendok==1) { keyflag=0; //按键标志清零 irsendok=0; } } } } void timer0() interrupt 1 //定时器0中断 { count++; if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波 else ir=0; //否则不发射,即相当于发射编码中的低电平 } //******************************红外接收*********************************************** #include //#define uint unsigned int #define uchar unsigned char ***it led1=P2^1; ***it led2=P2^2; ***it led3=P2^3; uchar irtime,startflag,irrecieveok; uchar bitnum; uchar irworkok; uchar irdata[17]; uchar ircode[2]; void display(); void irwork(); /*void delay50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } */ void init() { TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; IT0=1; EX0=1; EA=1; TR0=1; } void main() { init(); while(1) { if(irrecieveok==1) { irwork(); if(irworkok==1) display(); } } } void timer0() interrupt 1 { irtime++; } void int0() interrupt 0 { if(startflag) { if(irtime>32) { bitnum=0; irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==17) { bitnum=0; irrecieveok=1; } } } else { startflag=1; irtime=0; } } void irwork() { char k,j,i,value; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value|0x80; } k++; } ircode[j]=value; } irworkok=1; } void display() { if(ircode[0]==~ircode[1]) { //uchar m; switch(ircode[1]) { case 0x80: led1=1; led2=1; led3=1; break; case 0x40: led1=0; led2=1; led3=1; break; case 0xC0: led2=0; led1=1; led3=1; break; case 0x20: led3=0; led1=1; led2=1; break; //case 0xA0: 备用 } } } |
|
相关推荐
11个回答
|
|
学习了
|
|
|
|
22222
|
|
|
|
{:soso_e100:}
|
|
|
|
看着头大。
|
|
|
|
|
|
|
|
谢谢分享。
|
|
|
|
谢谢分享
|
|
|
|
真是帅呆了啊!!!
|
|
|
|
都有什么内容啊下下看再说
|
|
|
|
厉害?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
一个头两个大,看不懂。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:16 , Processed in 0.713018 second(s), Total 61, Slave 53 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号