标题:
红外遥控码值测试
[打印本页]
作者:
benbens
时间:
2015-7-15 00:18
标题:
红外遥控码值测试
本帖最后由 benbens 于 2015-7-15 00:19 编辑
前不久迷上了红外遥控解码,虽然自己在学校时曾经研究过,但一直没有搞清楚。温故而知新,加上得到一大神指点,让我茅塞顿开。
当一个红外遥控器的按键按下去时,共有四组数据发送出去了,第一组是低8位用户码, 第二组是高8位用户码,第三组是数据码, 第四组是数据反码。 用户码也叫引导码,用来区别不同的遥控器,数据码也叫按键码,用来区别不同的按键。数据反码就是数据码取反之后,用来进行数据校验的。
自己手头的有一块0802的液晶显示模块,刚好利用起来,做一个红外遥控码值测试的工具。 主控芯片用的是STC89C52RC单片机, 用它主要是因为这片单片机一直闲置在这里,大家也可以把程序移植到其它型号的单片机上(移植时注意延时函数)。想到只用来测试红外遥控码值太可惜这片单片机和0802液晶显示屏了,何不加上其它功能?手上有DS1302时钟芯片,用来做一个万年历在合适不过了,再用一个拨动开关来切换码值测试功能和时钟功能(拨动开关后要重启一下)。STC89C52RC有好多IO口,索性再加蜂鸣器和LED。
码值测试功能:
当解码出四组数据后蜂鸣器滴一声,LED闪烁一下。
时钟功能:1.
当按键按下蜂鸣器滴一声 2.每当到整点的时候,蜂鸣器滴一声(整点报时)。
以下是实物效果图:
依次是 年 月 日 星期 时 分
照片名称:红外解码-1
所属相册:电子DIY
首次开机,没有接收到红外信号时显示
照片名称:红外解码-3
所属相册:电子DIY
接收到红外信号并成功解码时
引导码:
0x00ff
按键码:0x01 按键反码:0xfe
照片名称:红外解码-2
所属相册:电子DIY
整体效果图
照片名称:红外解码-4
所属相册:电子DIY
供电电源采取USB供电,直接插电脑或者手机充电器就行了。。。。
我是直接现场发挥,没有画电路图,大家也可以从我的程序里看出电路的连接,鉴于我菜鸟般的编程能力,我就不全部把程序公布出来,只给出关键程序。需要的童鞋也可以留下邮箱,我可以发给你。
1. IO接口定义
unsigned char IR_code[4] = {0,0,0,0};//存放四组数据
sbit fmq=P1^0;//蜂鸣器接口
sbit RS=P1^1;
sbit RW=P1^2;
sbit EN=P1^3;
sbit mode=P1^4;//模式选择接口
sbit IR_Out = P3^2; // 此口为红外信号输入MCU口
sbit led=P3^7;
sbit mos_key=P1^6;
sbit up_key=P1^5;
sbit down_key=P3^6;
sbit CE=P2^5; //DS1302片选口
sbit IO=P2^6; //DS1302数据口
sbit SCLK=P2^7; //DS1302时钟口
2. 0802液晶驱动程序
void write_com(unsigned char com) //写指令
{
RW=0;
RS=0;
EN=0;
P0=com;
EN=1;
delayms(5);
EN=0;
}
void write_dat(unsigned char dat)//写数据
{
RW=0;
RS=1;
EN=0;
P0=dat;
EN=1;
delayms(5);
EN=0;
}
void lcdIR_init()
{
EA = 1; // CPU准许中断
delayms(400);
write_com(0x3c); //8位数据总线,两行显示模式,5*10点阵
write_com(0x01); //清显示
write_com(0x0c); // 开显示,关闭光标,关闭闪烁
write_com(0x80);
write_dat('B');
write_dat('C');
write_dat(':');
write_com(0x80+5);
write_dat('-');
write_com(0xc0);
write_dat('K');
write_dat('C');
write_dat(':');
write_com(0xc0+5);
write_dat('-');
}
void lcdtime_init()
{
EA = 0; // CPU不准许中断
delayms(400);
write_com(0x3c); //8位数据总线,两行显示模式,5*10点阵
write_com(0x01); //清显示
write_com(0x0c); // 开显示,关闭光标,关闭闪烁
write_com(0x80);
write_dat(' ');
write_dat(' ');
write_dat('-');
write_dat(' ');
write_dat(' ');
write_dat('-');
write_dat(' ');
write_dat(' ');
}
3. 红外解码程序
/*------------------------------------------------------------*-
函数名称:Int0()
函数输入:无(容许中断时,外部触发)
函数输出:无
函数说明:外部中断0中断处理
-*------------------------------------------------------------*/
void Int0() interrupt 0
{
unsigned char i,j;
EX0 = 0; // 关闭外部中断0
i = 10; // 0.793ms延时,运行10次
while( --i )
{
// 定时0.793ms,延时0.793ms*10=7.93ms
Delay793us();
// 这7.93ms期间只要IR_Out变高电平,就非合法的红外信号,跳出
if( IR_Out )
{
EX0 = 1; // 准许中断
return ;
}
}
// 程序进行到这里,表明是合法的红外信号(利用9ms判断)
while( !IR_Out ); // 等待9ms低电平过去
// 程序进行到这里,表明经过9ms低电平
Delay2305us(); // 延时2.305ms
// IR_Out 为低表明是连发码,不予理睬,跳出
if( !IR_Out )
{
EX0=1;
return;
}
// 程序进行到这里,表明是引导码,等待4.5ms高电平的过去
while( IR_Out );
// 开始接收四组数据
for(i=0; i<4; i++)
{
for(j=0; j<8; j++)
{
while( !IR_Out ); // 等待低电平过去
IR_code[ i] >>= 1; // 把上次的数据位右移一位
Delay793us(); //延时0.793ms
// 若为数据"1",则延时后IR_Out为高电平
if( IR_Out )
{
IR_code[ i] |= 0x80; // 所有数据位1放最高位
while( IR_Out ); // 等待高电平过去
}
}
}
//IR_code[0]低8位用户码,IR_code[1]高8位用户码,IR_code[2]为数据码,IR_code[3]为数据反码----dat为二进制
if (IR_code[2]!=~IR_code[3]) //数据码校验
{
EX0=1;
return;
}
fmq=led=0;
diaplay_IRcode(0,0x80+3);
diaplay_IRcode(1,0x80+6);
diaplay_IRcode(2,0xc0+3);
diaplay_IRcode(3,0xc0+6);
EX0=1; // 开中断
return;
}
4. 主函数
void main()
{
IR_Out = 1; // 此口为MCU输入口,故需要置1
IT0 = 1; // 外部中断0,下降沿触发
EX0 = 1; // 准许外部中断
while(1)
{
while(mode==1)
{
lcdIR_init();
while(1)
fmq=led=1;
}
while(mode==0)
{
lcdtime_init();
while(1)
display_settime();
}
}
}
作者:
bhjyqjs
时间:
2015-7-16 16:22
思路清晰,好程序
作者:
wgw020
时间:
2015-9-25 10:36
能把电路图和程序发给我学习吗
作者:
HEIZI555
时间:
2015-11-17 15:14
写得不错,把完事程序发与我吧,邮箱
185478492@qq.com
作者:
robter
时间:
2016-6-30 11:45
很好很好,也想做一个,我的邮箱:
912503475@qq.com
,谢谢
作者:
robter
时间:
2016-6-30 14:21
做工不错,找时间也做一下
作者:
张明明
时间:
2016-9-11 10:18
1430969765@qq.com
谢谢啦
作者:
dxa572862121
时间:
2016-9-20 16:21
搞懂了挺简单的。
作者:
lzydtj
时间:
2016-9-27 14:32
很好!也想做一个,我的邮箱:
158916715@qq.com
,谢谢
作者:
at87c573
时间:
2016-10-11 13:42
能否发一份给我参考一下,正需要这样的东西来测试编码,是否所有的编码都能解出?请发
160222849@qq.com
,谢谢!
作者:
梦想家1314
时间:
2016-10-12 19:05
楼主,你这只是NEC协议的,你试一下空调100多位杂乱的编码试试看能不能显示!欢迎讨论
作者:
lanyue51hei
时间:
2017-8-1 11:28
程序解释很详细,学习了
作者:
不要加香菜
时间:
2017-8-1 15:51
我也想学习一下
1101769421@qq.com
谢谢啦
作者:
@小二
时间:
2017-8-6 11:54
谢谢楼主分享!给我发一下好吗?
821267649@qq.com
作者:
licu
时间:
2017-8-9 00:59
謝謝樓主分享!給我發一下好嗎
licuoo@yahoo.com.tw
作者:
licu
时间:
2017-8-9 01:46
謝謝樓主分享!給我發一下好嗎?
licuoo@yahoo.com.tw
謝謝
作者:
jjj12345
时间:
2017-8-11 06:31
写的很好,不错
作者:
topzjm
时间:
2017-8-11 10:34
好程序啊
作者:
sgq657785
时间:
2017-9-5 09:48
很好啊,很容易看懂的程序,大神发给我学习一下,1107572536@qq .com 谢谢!
作者:
raymondau
时间:
2017-9-5 12:27
楼主能附上相关电路图吗?谢谢!
作者:
232046
时间:
2017-9-24 13:00
1339294327@qq.com谢谢麻烦给张电路图
作者:
gpdt3209
时间:
2018-4-10 16:05
好东西呀!能否发我一份程序?邮箱
gpdt3209@126.com
谢谢
作者:
lele88888
时间:
2018-7-7 16:50
思路清晰,好程序
作者:
茹谷涵今
时间:
2018-7-13 17:06
楼主可以把程序发我下吗?
1131103911@qq.com
作者:
hslcac
时间:
2018-8-5 21:25
程序解释很详细,学习了
作者:
Mr.zhangz
时间:
2018-8-19 15:44
谢谢分享,学习一下我邮箱292785968@qq.com
作者:
suneve
时间:
2019-1-23 22:13
这位朋友,你好!麻烦你把红外遥控测码器的全部源程序发给我,谢谢!我的邮箱是:
394162308@qq.com
再次表示最真诚地感谢!!!
作者:
suneve
时间:
2019-1-23 22:36
楼主你好!麻烦把完整程序发给我好吗?邮箱:
394162308@qq.com
谢谢!!!
作者:
TAPASMONK
时间:
2019-6-7 11:10
学习了 ,楼主你好,可以把完整程序我发吗 ?
316487650@qq.com
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1