完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
stc8单片机通过红外模拟成空调遥控器
文章分为红外遥控原理和单片机实现两个部分 1 红外遥控原理 通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。 再看看这个图 这个图的意思是说:发射端要发送38KHZ的信号,这个时间是0.56ms然后不发送这个38KHZ的载波信号,那么发射端要是想传送信号0或者1就是靠这个不发38Khz载波的间隔来决定的。间隔时间长的1.125ms就是表示的1,间隔0.56ms就是表示的0. 接收端把碰到的载波信号认为是低电平,或者也可以说是接收到载波信号之后把接收端的输出引脚拉低了,没有接收到载波信号就会持续为1.这样一来就完成了传送和接收的整个过程。 2 单片机实现 首先是先用定时器定时13us的时间 void hwsend_init() //13us 11.0592 { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x70; //设置定时初值 TH0 = 0xFF; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //定时器0中断允许 EA = 1; //允许CPU中断 iraddr1=0; iraddr2=0; count = 0; sflag = 0; OP = 0; Infr = 1; } 然后就是发送空调码了,美的的空调码格式是先发送4.5ms的载波,然后发4.5ms(非载波),再加上6个字节的空调遥控码再加上4.5ms的开始载波信号,再发送5.2ms的连接码(非载波)然后把6个字节的空调遥控吗再次发送最后加上4.5ms的载波信号,以上是开启空调的格式,关闭的格式也是一样的。下面贴上代码 好void SendIRdataOpen() //发送开启空调码 { unsigned char irdata; unsigned char dw,sw; endcount=60; //发送4.5ms的起始码 692 sflag=1; hwcount=0; while(hwcount《endcount); endcount=60; //发送4.5ms的结果码 346 sflag=0; hwcount=0; while(hwcount《endcount); //发送十六位地址的前八位 //开始发送那6个字节的数据 for(dw=0; dw《6; dw++) { irdata=irdataOpen[dw]; for(sw=0; sw《8; sw++) { endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平) sflag=1; count=0; while(count《endcount); //停止发送红外信号(即编码中的高电平) if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0 { endcount=130; //1为宽的高电平 低电平时间为1.69ms } else { endcount=44; //0为窄的高电平 低电平时间为0.56ms } sflag=0; count=0; while(count《endcount); irdata=irdata》》1; } //发送十六位地址的后八位 } //发送结束码 endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平) sflag=1; count=0; while(count《endcount); //停止发送红外信号(即编码中的高电平) //发送连接码 endcount=80; //发送5.2ms的连接码 sflag=0; hwcount=0; while(hwcount《endcount); //再发一遍 endcount=60; //发送4.5ms的起始码 692 sflag=1; hwcount=0; while(hwcount《endcount); endcount=60; //发送4.5ms的结果码 346 sflag=0; hwcount=0; while(hwcount《endcount); //发送十六位地址的前八位 for(dw=0; dw《6; dw++) { irdata=irdataOpen[dw]; for(sw=0; sw《8; sw++) { endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平) sflag=1; count=0; while(count《endcount); //停止发送红外信号(即编码中的高电平) if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0 { endcount=130; //1为宽的高电平 低电平时间为1.69ms } else { endcount=44; //0为窄的高电平 低电平时间为0.56ms } sflag=0; count=0; while(count《endcount); irdata=irdata》》1; } //发送十六位地址的后八位 } //发送结束码 endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平) sflag=1; count=0; while(count《endcount); sflag=0; } 空调遥控的核心的知识就是这些,我没有提到接收的部分,接收的部分其实就用外部中断来统计高电平的时间就可以了。这是全部的代码,点击这里,进行查看. |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:55 , Processed in 1.094225 second(s), Total 49, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号