设计一个基于单片机的嵌入式系统,要求具备以下功能:
红外数据的接收及解码,红外发色电路
数码管的显示驱动控制
将接收到的红外数据进行实时显示(限于动态扫描方法)
请根据以上功能要求,进行硬件系统设计,编写软件程序并画出流程图。
利用单片机进行遥控系统的应用设计,相较于市面上遥控集成电路受功能键数及应用范围限制,具有编程灵活多样、操作码个数可随意设定的优点。本设计利用AT89C52制作红外遥控系统,使用Keil软件编写程序,在Proteus软件中采用IRLINK模块用于接收并解调红外信号,进行程序的仿真。设计中,矩阵键盘充当遥控器,当我们按下某一个键时,经单片机识别,CPU向接有红外发射管的端口发射一定频率的脉冲,该脉冲与38KHz左右的载波脉冲进行调制,然后将已调制的脉冲进行缓冲放大,激励红外发光二极管将电能转化为光能,使得红外发光二极管发射出一定频率的红外线,当接收控制系统接收到该红外光后,由单片机内定时/计数器得到该红外光的频率,然后将该频率送往CPU,由CPU对该信号进行反编码,识别出控制信号,控制LED灯亮,蜂鸣器发声,并从数码管显示出按键值,同时示波器显示红外发射及接受端的脉冲波形,实现红外数据的接收解码与动态显示。
以下为发射程序,接收见附件。信号波形解码显示都没问题,LED灯和蜂鸣器设计是有点问题的,可以删掉不用不影响。
自动的是压缩包里第二个文件的程序,其他包里有额外的参考资料,可借鉴。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
红外波形图:
单片机源程序如下:
- #include <REG51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SBM 0xFF //用户识别码
- #define m9 (65536-9000) //约9mS
- #define m4_5 (65536-4500) //约4.5mS
- #define m1_6 (65536-1630) //约1.65mS
- #define m_65 (65536-580) //约0.65mS
- #define m_56 (65536-560) //约0.56mS
- #define m40 (65536-40000) //约40mS
- #define m56 (65536-56000) //56mS
- #define m2_25 (65536-2250) //约2.25mS
- sbit IR = P3^6; //定义发射引脚(接PNP三极管基极)
- sbit LED = P3^7; //发射指示灯
- uchar KEY(void);
- void SanZhuan(void);
- void ZZ(uchar x);
- void Z0(uchar temp);
- void TT0(bit BT,uint x);
- void YS(uchar time);
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数功能:主函数
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void main(void)
- {
- TMOD = 0x01; //T0 16位工作方式
- IR=1; //发射端口常态为高电平
- while(1)
- {
- SanZhuan();
- }
- }
- /***************************************************************
- 函数功能: 4×4矩阵键盘
- 键值
- P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
- │ │ │ │ │ │ │ │ ┃
- │ │ │ └────13 14 15 16 ┃
- │ │ └─────────9 10 11 12 ┃
- │ └──────────────5 6 7 8 ┃
- └────────────────────1 2 3 4 ┃
- ***************************************************************/
- uchar KEY(void)
- {
- uchar H,L; //行值,列值
- H=0;
- L=0;
- P1 = 0xf0; //将键盘端口行值设为1,列值设为0
- if(P1!= 0xf0) //检测是否有按键按下,如果有则hangval必不为0x0f
- {
- YS(10); //按键去抖动,延时10毫秒
- if(P1!=0xf0) //确实有按键按下
- {
- H = P1&0xf0; //按键后得到按键的行标志位,将行标志位赋值给hangval
- P1 = 0x0f; //翻转键盘接口输出
- L = P1&0x0f; //得到列标志位
- }
- return (H+L);
- }
- return 0;
- }
- /***************************************************************
- 函数功能:散转程序
- ***************************************************************/
- void SanZhuan(void)
- {
- uchar v;
- v = KEY();
-
- switch(v)
- {
- case 0x77:ZZ(0x01);v=0;break; //" "
- case 0xb7:ZZ(0x02);v=0;break; //" "
- case 0xd7:ZZ(0x03);v=0;break; //" "
- case 0xe7:ZZ(0x04);v=0;break; //" "
- case 0x7b:ZZ(0x05);v=0;break; //" "
- case 0xbb:ZZ(0x06);v=0;break; //" "
- case 0xdb:ZZ(0x07);v=0;break; //" "
- case 0xeb:ZZ(0x08);v=0;break; //" "
- case 0x7d:ZZ(0x09);v=0;break; //" "
- case 0xbd:ZZ(0x10);v=0;break; //" "
- case 0xdd:ZZ(0x11);v=0;break; //" "
- case 0xed:ZZ(0x12);v=0;break; //" "
- case 0x7e:ZZ(0x13);v=0;break; //" "
- case 0xbe:ZZ(0x14);v=0;break; //" "
- case 0xde:ZZ(0x15);v=0;break; //" "
- case 0xee:ZZ(0x16);v=0;break; //" "
- default:v=0;
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数功能:发送主程序
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void ZZ(uchar x)
- {
- TT0(1,m9); //高电平9mS
- TT0(0,m4_5); //低电平4.5mS
- /*┈ 发送4帧数据 ┈*/
- Z0(SBM);
- Z0(~SBM);
- Z0(x);
- Z0(~x);
- /*┈┈ 结束码 ┈┈*/
- TT0(1,m_65);
- TT0(0,m40);
- /*┈┈ 重复码 ┈┈*/
- while(KEY())
- {
- TT0(1,m9);
- TT0(0,m2_25);
- TT0(1,m_56);
- TT0(0,m40);
- TT0(0,m56);
-
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数功能:单帧发送程序
- 入口参数:1帧数据
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Z0(uchar temp)
- {
- uchar v;
- for (v=0;v<8;v++) //循环8次移位
- {
- TT0(1,m_65); //高电平0.65mS
- if(temp&0x01) TT0(0,m1_6); //发送最低位
- else TT0(0,m_56);
- temp >>= 1; //右移一位
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数功能:38KHz脉冲发射 + 延时程序
- 入口参数:(是否发射脉冲,延时约 x (uS))
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void TT0(bit BT,uint x)
- {
- TH0 = x>>8; //输入T0初始值
- TL0 = x;
- TF0=0; //清0
- TR0=1; //启动定时器0
- if(BT == 0) while(!TF0); //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
- else while(1) //38KHz脉冲,占空比5:26
- {
- IR = 0;
- if(TF0)break;
- if(TF0)break;
- IR = 1;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- }
- TR0=0; //关闭定时器0
- TF0=0; //标志位溢出则清0
- IR =1; //脉冲停止后,发射端口常态为高电平
- }
- /***************************************************************
- 函数功能:按键消抖 延时程序
- 入口参数:1ms×time (晶振=12MHz)
- ***************************************************************/
- void YS(uchar time)
- {
- uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
复制代码
全部资料51hei下载地址:
红外遥控带原理图.rar
(2.78 MB, 下载次数: 219)
|