[原创]发个32按键的红外键盘,只占用一个I/O口,附原理图,keil工程,红外编码资料,有实
上图:(这是红外键盘的实物图.)http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263592.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263593.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263904.JPG
(原文件名:1.JPG)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263905.JPG
(原文件名:2.JPG)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263906.JPG
(原文件名:3.JPG)
这是去年做的一个东东,由于在系统中I/O严重不够用,所以想到这个方法:红外键盘
通常我们在51单片机系统中,要用到多个按键时,差不多都是采用的矩阵键盘,这是种比较浪费IO的做法;
这里的红外键盘,32个按键却只占用一个I/O口,(这个I/O可以是中断引脚,也可以是一般IO,不过实际验证中发现:接中断管脚时,解码比较可靠,基本不会出错)
当然,更换我电路中采用的编码芯片后,可以扩展至64个按键.
解码效果很好,由于我的红外发射管没有用什么东西遮挡,所以红外键盘即使背向红外接收头,也能正确解码.
具体操作时,使用红外键盘发般红外信号,同一个一体化红外接收头将接收到的信号送至单片机中断引脚,由单片机完成软件解码
解出按键值(单片机部分只接了一个红外一体化,图就不画了,呵呵),同时单片机将解出的按键值通过串口发送,
如果你的单片机串口接PC了的话,可用串口软件在电脑上观察按键值.
解码都没有问题时,就可以在这个红外键盘的基础上扩展其它功能了,呵呵
另:刚开始准备这个红外键盘时,采用的是采用专门的编码解码芯片的,然后有一个振荡器产生载波,将信号调制再发射,
可是实验N次,效果都不理想,而且电路太死板,没有可玩性.
后来在一个很旧的功放机上发现了这个芯片,查得资料,所以有了这个设计.
如果在单片机的IO上加上三极管,驱动继电器,即可构成32路红外遥控了
这是电路中的红外编码芯片的编码波形:
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263600.jpg
(原文件名:PT2221编码波形.jpg)
下面是在示波器上实测的红外编码波形:
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263601.jpg
(原文件名:红外pt2221.jpg)
这是原理图(PDF)
点击此处下载 ourdev_263596.pdf(文件大小:23K) (原文件名:IR.pdf)
这是用51单片机对该红外键盘解码的keil工程
汇编的:
点击此处下载 ourdev_263597.rar(文件大小:15K) (原文件名:红外--PT2221--asm--V1.0.rar)
C的:
点击此处下载 ourdev_263598.rar(文件大小:25K) (原文件名:红外--PT2221--c--1.rar)
个人感觉有点用途,发出来,欢迎大家拍砖~/\~ 还有一点要说明的是:
红外编解码,关键是延时要控制好,精确到uS才可以,我当时调这个程序时,汇编一天就搞定了(大家不要笑,比较笨),C的话,两天才搞定,
主要问题就是那个延时没处理好.
红外解码要求有精确的延时,上面的程序中我给出了两种精确延时的方法,都是用keil仿真得出的,算是比较精确了.
一.用 for 循环和 _nop_ 配合实现的精确延时
//****************882us********************
void delay882us(void)
{
uchar i;
for(i=0;i<202;i++)
{
_nop_();
}
}
//****************4740us*******************
void delay4740us(void)
{
uint j;
for(j=0;j<670;j++)
{
_nop_();
}
}
//*************1000us**********************
void delay1000us(void)
{
uchar k;
for(k=0;k<230;k++)
{
_nop_();
}
}
二.用 while(--i) 实现的精确延时
//******************************************
void delay16(unsigned int i)
{
while(--i);
}
//******************************************
void delay882us(void)
{
delay16(100);
}
//******************************************
void delay1000us(void)
{
delay16(115);
}
//******************************************
void delay4740us(void)
{
delay16(546);
}
实际使用时,任意一个均可成功解码.
电路中还设置了用户加密,就是图中最左边的双排针,跳线冒跳到不同的位置表示不同的用户,接收端解码时,
要知道相应的加密信息才可以成功解码.
这个用户加密的校验有8位,所以同一个房间里,可同时有256个这种红外键盘工作而不会相互影响... NND,太不给面子了,无人问津...让人心寒啦 顶一下~呵呵~不知道楼主买的那个HT6221多少钱一片? 回3楼,6221和2221是完全兼容的,这个IC在比较老点的功放等电器上都有,
我我是在旧电器上拆的,呵呵
如果你没有这样的旧电器可以拆,可以到电子市场去买,我在电子市场问过,
很便宜,就两三块钱而以,还是很化算的... 呵呵,东西发在这一般人都比较少,帮你顶一下 如果是这样不如就直接用个遥控器更加方便 TO:6楼
这个和遥控器是一个原理
直接用遥控器的话,如果你不知道遥控器的编码芯片是什么样的?(现在的遥控器通常用黑胶封装,看不到型号)
这样是比较麻烦的,解码有困难.
这个红外键盘的话,重点不是这个键盘的电路设计,你完全可以用一个遥控器代替,重点是与大家分享红外解码的程序, 顶一下! 顶一下
下次估计有人自己做遥控了 不错啊 已更新主楼照片,把用红外键盘时的效果也加上了,昨晚拍的.
现帖上部分源码(全部源码主楼已上传),程序的注释再详细不过了...
一.主程序:
***********************************************************************************************/
#include<PT2221.h>
//************************主程序***********************************
void main (void)
{
uint di;
InitCom(); //初始化串口
EA=1;
EX0=1; // 设定接受INT0的中断
IT0=1;
ComOutChar(1); //向串口发送 1 ,表示串口正常工作
do
{
P37=~P37; //工作指示灯,这个LED闪烁表示主程序在运行
for(di=0;di<1000;di++)
{
delay1000us();
}
}while(1);
}
//*******************外部中断0 红外解码程序****************************************
static void decode(void) interrupt 0 using 2
{
unsigned char IRCode={0,0,0,0};
unsigned char count0,count1,count2;
unsigned char m;
EX0 = 0; //外部中断0关闭
for(count0=0;count0<10;count0++) //起始码前9ms的低电平
{
delay882us();
if(P32) goto exit; //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
}
if(!P32) //低电平没完
{
delay4740us(); //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
for(count1=0;count1<4;count1++) //开始读数据,4个字节,32位
{
for(count2=0;count2<8;count2++) //每个字节8位
{
while(!P32); //等待高电平到来
delay882us();
if(P32) //延时882us后,若P32还是高电平,则为 位1
{
IRCode=IRCode>>1;
IRCode=IRCode|0x80;
delay1000us(); //延时1000us,结束高电平
}
else //延时882us后,若P32为低电平,则为 位0
{
IRCode=IRCode>>1;
IRCode=IRCode|0x00;
}
}
} //到这里已读完所有32位数据
if ((IRCode==0x00)&&(IRCode==0xff)) //判断用户码和用户反码是否正确
{
if (IRCode==~IRCode) //数据校验
{
//ComOutChar(IRCode);
//ComOutChar(IRCode);
ComOutChar(IRCode); //串口发送数据码
//ComOutChar(IRCode);
P36=0; //解码成功后led闪烁一次
for(m=0;m<100;m++)
{
delay1000us();
}
P36=1;
if(IRCode==0x01)
{
P35=~P35; //这里可加入控制命令,比如这里的当解码为01时取反P35
for(m=0;m<100;m++)
{
delay1000us();
}
}
}
}
}
exit:
EX0 = 1;
}
二.
//****************************************
// 红外解码的配置文件
//****************************************
#include<reg51.h>
#include<intrins.h>
//*****************************************
#define uchar unsigned char
#define uint unsigned int
//************函数申明*********************
void InitCom(void); //串口初始化
void ComOutChar(unsigned char OutData); //从串口输出一个字符
void delay882us(void); //精确延时882us
void delay4740us(void); //精确延时4740us
void delay1000us(void); //精确延时1000us
//*************用到的I/O口定义**************
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2; //INT0,红外信号输入
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
三.nop延时
#include<PT2221.h>
//*****************************************
// 用 for 循环和 _nop_ 配合实现的精确延时
//*****************************************
//****************882us********************
void delay882us(void)
{
uchar i;
for(i=0;i<202;i++)
{
_nop_();
}
}
//****************4740us*******************
void delay4740us(void)
{
uint j;
for(j=0;j<670;j++)
{
_nop_();
}
}
//*************1000us**********************
void delay1000us(void)
{
uchar k;
for(k=0;k<230;k++)
{
_nop_();
}
}
四.while延时
#include<PT2221.h>
/*
//******************************************
// 用 while(--i) 实现的精确延时
//******************************************
//******************************************
void delay16(unsigned int i)
{
while(--i);
}
//******************************************
void delay882us(void)
{
delay16(100);
}
//******************************************
void delay1000us(void)
{
delay16(115);
}
//******************************************
void delay4740us(void)
{
delay16(546);
}
*/
五.串口发送解码结果到PC
#include<PT2221.h>
//***************************************************************
//向串口输出一个字符(非中断方式)
//***************************************************************
void ComOutChar(unsigned char OutData)
{
SBUF = OutData; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
}
//****************************************************************
//串口初始化 晶振为11.0592M 方式1 波特率9600
//****************************************************************
void InitCom(void)
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
TH1 = 0xFd; //设波特率为9600
TL1 = 0xFd;
PCON = 0x00; //波特率不加倍控制,SMOD为0
RI = 0; //清收发标志
TI = 0;
TR1 = 1; //启动定时器
} http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263911.JPG
(原文件名:11.JPG)
解码的话以前照着别人做了这样个东西.还是蛮好用的.连上电脑对着电脑一照就好了.. TO:【12楼】 litchiate 草真多
这个东西是磁动力上发布的吧?我以前也做过,不过一直不成功,采集不到编码的波形
所以后来直接用示波器测的波形,测出脉冲的时间,然后解的码,太麻烦了... Mark 呵呵,东西发在这一般人都比较少,帮你顶一下 很好,顶! TO:【15楼】 yjs86903
东西放在这里确实不引人注意,
即使有照片,有原理图,有源代码... 其实,,,你的程序很多人都会看,,,很有帮助,,只是大部分人,,,没有留言吧,,,
不过这对你不是很重要吧,,,重要的是你可以让别人学到不少东东呕,,,, 呵呵,好象你们忽略了一点:红外有红外的2262-IR,有38K载波的.
有了载波,一体接收头才能收到信号. 谢谢 楼主啊,太感谢你了。正在考虑这个问题呢。。。 非常感谢楼主,下载学习。 其实用avr的脉冲捕捉引脚更好做,直接能得出脉宽,不用软件延时 顶一下 支持,学习 TO:【19楼】 wxws
红外确实有2262_IR,我当时还考虑过这样做,不过市场上卖的一般都是普通的2262,不能作为红外发射之用 顶一下,以后会用得着的 顶~~~~~~~~~~~ 顶贴,这个是NEC 协议是吧,我还没搞过红外
楼主程序精辟,思路清晰,结构明了,连我这个从未玩过红外的菜到晕也看明白了,楼主是个人才,望楼主今后多出些精品,说不定哪天莫老大也给你开个专栏 我喜欢,mark here 【29楼】 lionliu
过奖了,我写程序,为了方便以后使用,一般都有详细的注释,这样比较容易读一些... 不错,很感兴趣。 支持下 很不错 看看,我也要做个单片机红外通信,可以参考下 6221这片子难买不???
楼主有没测过工作电流和静态电流有多大?? 【36楼】 pcwinner
HT6221和PT2221完全兼容,在卖红外的地方有卖
工作电流和静态电流没测过,这个电路去掉3.3V的稳压芯片,直接用两节干电池供电时,
和家用遥控器效果是一样的,很省电的. 很好。谢谢楼主提供如此好的设计。 很不错,顶一下,学学!! 比较棒,谢谢分享!! to 【13楼】 xingzhang 阿兴
恩,就是那里找来的。用了下就成功了。 红外到现在还没怎么用过了,除了刚刚完成解码时,把简单钟的调试给做了下。 好东西!谢谢LZ! 非常感谢!辛苦了!顶 非常感谢楼主! 好贴,严重顶一下。楼主还有其它好东西要分享的吗 【45楼】 rifjft 吝啬
东西还有蛮多,不过都是几年前的作品,最近没什么作品
如果大家喜欢,稍后也发上来 另:由于以前主要玩51,作品主要以51为主,楼主位的图即用的philip的P89V51RD2
64K的flash,1K RAM 酷,以前也做过一点点的红外,不过很简单,没有用到编码的 !
一直没有时间接着往下做 楼主真的好强啊,佩服啊,你qq是多少,想向你学习 我的是362737683 【49楼】 manniuniu
积分:2
派别:
等级:------
来自:
楼主真的好强啊,佩服啊,你qq是多少,想向你学习
积分2,不是故意注册个ID拿我开涮吧?
这个东西微不足道,坛子里强人一大把一大把的,我只是菜鸟级别而以,
要想真学到东西最好跟他们混吧 非常好!狂顶一下! 红外的编码规则是什么呢?单片机读出信号脉冲后怎么计算出相应的码值呢? 好!这个东东很好!多谢楼主。 mark 楼主有QQ吗?
我是一个什么都不懂的
很想学就是没人教
有些东西看了半天都不知道
我想有人说一下会很快懂的 帮顶.. 不错,顶,学习了不少 P89V51RD2 ,以前也用过,不过好像比较贵。32k的吧,或者我记错了,不过用keil 51好像很省程序空间。 不错,有创意! 【59楼】 R28FA
64K的 程序架构有待改进
有兴趣的话,可以去看看傻孩子的一些帖子
进一步可以看51分时系统的书 你这个红外接收解码这部分抗干扰怎么样。发现红外干扰问题比较突出。容易出现解码错误。 【62楼】 dvhome
程序架构方面,我没有刻意注意过,目前采用这种方式我比较习惯而已
当然也得不断学习,来改进
【63楼】 mahui625
搞干扰不错,在红外接收头的电源上加退耦电容效果更好,基本不会出现解码错误 太牛啦,谢谢分享!! “积分2,不是故意注册个ID拿我开涮吧?”
支持下开源。我的积分够你满意不?要实在不行,得阿莫来他的积分绝对不“开涮”。 呵呵,喜欢开源,喜欢原创 支持楼主开源。到是楼主为了这个专门做了pcb啊,羡慕啊! 挺好的东西啊,,顶了。。 一个字。“顶” 哈哈 弄了好久的红外解码 还稀里糊涂的 终于在您这找到希望啦 “电路中还设置了用户加密,就是图中最左边的双排针,跳线冒跳到不同的位置表示不同的用户,接收端解码时,
要知道相应的加密信息才可以成功解码.
这个用户加密的校验有8位,所以同一个房间里,可同时有256个这种红外键盘工作而不会相互影响...”
不好意思,我是初学单片机的,你这里的双排排针是怎么接线的?我有点疑问,能帮我解答下吗? 再问一个问题JP1中的1和2可以直接相连的吧??
8个二极管连出来的C1到C8和矩阵键盘连出来的C1到C8都是连到PT2221上的C1到C8的,是这样吗??? 我查了一下pt2221的引脚图和upd6121是一样的,应该可以互换的吧?
还有就是,你的原理图上的jp2中的连线怎么连的???还是直接不连的,用到时候可以用杜邦线来连接??但是这样的话,AIN就一条线接出去就没用了....谁能给我解释下,不胜感激啊。。。。。 【74楼】 xb_crazyman
JP1为电源接线端;
JP2一般情况下不接,用到时用跳线帽选择要用的跳,它的主要作用就是设置用户加密位,所以AIN脚并不是没用 顶,正准备搞红外编码 xingzhang 阿兴
呵呵,弄懂了,谢谢哦。。。。。 留个记号吧! 顶上 这篇文章应该置顶的。。。。。。。。。。。 这的确是个很好的方案。 好东东,顶顶顶 看了 收获很大 暑假电子竞赛的时候 再仔细看 不明白楼主干吗不用现成的红外遥控器?
用示波器测试一体化接收头很容易捕捉编码信息的。
从成本上说,还不如扩展I/O来做按键,这样成本低开发更容易。 【84楼】 gx_huang
从成本上来说,买个MP3那么便宜,为什么还要自已做MP3呢?看来你不懂! 顶顶 To 85楼:
成本当然重要了,如果是学习的话可以这么做。
其实99年的时候我就用AVR8515+MP3解码芯片(型号忘了)+DAC+NAND做过MP3。
可是这玩意无法上市卖呀,价格贵、耗电大。哪有现在方便,单芯片就实现了,耗电小。
举例你用专门高精度ADC+MCU来采样温度信号,这个电路谁都会设计。
但是市场上的温控仪表很少这么做,人家即不用ADC芯片,也不用内置ADC的MCU,用普通的MCU就实现了。
那才是技术人员追求的目标。 呵呵,原来85楼是楼主,失礼了!
想起来了MP3芯片好像是STA013的。 楼主再接再厉! 顶!!!!!!!!!! 正在关注红外线解码这部分.多谢 IR
Mark 有创意,建议置顶,目的就是要交流和学习。 貌似我已经顶过贴了,但是还想顶一下,正在做一个单片机读ps2键盘数据,然后红外发射给另一个单片机,另一个单片机模拟ps2键盘,嘎嘎,主要是想实现红外无线键盘,效果如何不知道,刚刚12买了一个ps2的键盘,学习了他人的ps2读键盘,正好可以借鉴借鉴你的红外的程序,完成发射接受,嘎嘎。 顶你一下 参考 真是好东西.多谢楼主的奉献 东西放在这里确实不引人注意,
即使有照片,有原理图,有源代码... 以前做过红外转发的东西,用485总线可以互传红外信号啊!
哈哈!
有兴趣可以一试哦! 好东西,学习一下很好