红外遥控收发机 红外遥控解码Word文档格式.docx
- 文档编号:22684325
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:28
- 大小:893.58KB
红外遥控收发机 红外遥控解码Word文档格式.docx
《红外遥控收发机 红外遥控解码Word文档格式.docx》由会员分享,可在线阅读,更多相关《红外遥控收发机 红外遥控解码Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
LED灯
LCD1602
51单片机
四、任务分解与计划
第一周将红外遥控收发机的设计方案写出来;
第二周在网上查找与课题相关的资料;
第三周进行原理图的绘制;
第四周进行PCB图的布置;
第五周在网上学习一些程序,并同时在Proteus上进行仿真实验;
第六周完成PCB板的印制并且将器件焊接;
第七周进行程序在PCB板上的调试与设计报告的撰写。
五、各部分电路设计
5.1单片机电路设计
STC89C52单片机由于其功耗低、体积较小和成本低等优点,在许多领域都有应用,而且抗干扰性能好。
STC89C52单片机算术运算功能也较强,软件编程灵活,可用软件编程实现各种算法和逻辑控制。
其中的系统要包括电源、复位、晶振,能让整个单片机运转成功。
这些都是单片机系统必不可少的部分了,最后可以通过进行扩展,让其实现比较复杂的功能。
5.2按键电路设计
采用38khzNEC协议遥控器,使用遥控器上的0-9键进行控制八路LED灯的亮灭情况。
按下0键:
P1口置为低电平,8路灯全灭;
按下1键:
P1.0电平取反;
按下2键:
P1.1电平取反;
按下3键:
P1.2电平取反;
按下4键:
P1.3电平取反;
按下5键:
P1.4电平取反;
按下6键:
P1.5电平取反;
按下7键:
P1.6电平取反;
按下8键:
P1.7电平取反;
按下9键:
P1口置为高电平,8路灯全亮;
5.3发送电路设计
直接使用成品38khz遥控器作为发射控制端。
5.4接收电路设计
用红外一体化接收头HS38BD进行红外遥控信号的接收,接收头的输出端接到单片机的P3.2int0管脚。
5.5显示电路设计
本系统采用LCD1602a液晶显示器作为解码显示器件,在单片机P0口接了10k上拉电阻的前提下分别将1602的D0~D7口与STC89C52RC单片机的P0.0~P0.7相接。
六、硬件设计结果-原理图与PCB
6.1原理图
6.2PCB设计
红外接收PCB:
七、软件设计
7.1主程序流程
7.2软件仿真过程与结果
仿真图形:
7.3主要实现代码
#include<
reg52.h>
#include"
1602.h"
delay.h"
#defineCHECK_BUSY
sbitRS=P2^4;
//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
sbitled0=P1^0;
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitled6=P1^6;
sbitled7=P1^7;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
intrins.h"
bitLCD_Check_Busy(void)
{
#ifdefCHECK_BUSY
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&
0x80);
#else
return0;
#endif
}
写入命令函数
voidLCD_Write_Com(unsignedcharcom)
//while(LCD_Check_Busy());
//忙则等待
DelayMs(5);
RW_CLR;
DataPort=com;
写入数据函数
voidLCD_Write_Data(unsignedcharData)
//while(LCD_Check_Busy());
RS_SET;
DataPort=Data;
清屏函数
voidLCD_Clear(void)
LCD_Write_Com(0x01);
写入字符串函数
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
if(y==0)
LCD_Write_Com(0x80+x);
//表示第一行
else
LCD_Write_Com(0xC0+x);
//表示第二行
}
while(*s)
LCD_Write_Data(*s);
s++;
写入字符函数
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
LCD_Write_Data(Data);
初始化函数
voidLCD_Init(void)
{
LCD_Write_Com(0x38);
/*显示模式设置*/
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
/*显示关闭*/
/*显示清屏*/
LCD_Write_Com(0x06);
/*显示光标移动设置*/
LCD_Write_Com(0x0C);
/*显示开及光标设置*/
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
voidDelayUs2x(unsignedchart)
while(--t);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
#include<
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"
sbitIR=P3^2;
//红外接口标志
charcodeTab[16]="
0123456789ABCDEF"
;
全局变量声明
unsignedcharirtime;
//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
unsignedcharirdata[33];
unsignedcharTempData[16];
函数声明
voidIr_work(void);
voidIrcordpro(void);
定时器0中断处理
voidtim0_isr(void)interrupt1using1
irtime++;
//用于计数2个下降沿之间的时间
外部中断0中断处理
voidEX0_ISR(void)interrupt0//外部中断0服务函数
staticunsignedchari;
//接收红外信号处理
staticbitstartflag;
//是否开始处理标志位
if(startflag)
if(irtime<
63&
&
irtime>
=33)//引导码TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;
//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
irok=1;
i=0;
else
startflag=1;
定时器0初始化
voidTIM0init(void)//定时器0初始化
TMOD=0x02;
//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;
//重载值
TL0=0x00;
//初始化值
ET0=1;
//开中断
TR0=1;
外部中断0初始化
voidEX0init(void)
IT0=1;
//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;
//使能外部中断
EA=1;
//开总中断
键值处理
voidIr_work(void)
TempData[0]=Tab[IRcord[0]/16];
//处理客户码
TempData[1]=Tab[IRcord[0]%16];
TempData[2]='
-'
TempData[3]=Tab[IRcord[1]/16];
TempData[4]=Tab[IRcord[1]%16];
TempData[5]='
TempData[6]=Tab[IRcord[2]/16];
//处理数据码
TempData[7]=Tab[IRcord[2]%16];
TempData[8]='
TempData[9]=Tab[IRcord[3]/16];
//处理数据反码
TempData[10]=Tab[IRcord[3]%16];
LCD_Write_String(5,1,TempData);
irpro_ok=0;
//处理完成标志
红外码值处理
voidIrcordpro(void)//红外码值处理函数
unsignedchari,j,k;
unsignedcharcord,value;
k=1;
for(i=0;
i<
4;
i++)//处理4个字节
for(j=1;
j<
=8;
j++)//处理1个字节8位
cord=irdata[k];
if(cord>
7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<
8)
value>
>
=1;
k++;
IRcord[i]=value;
value=0;
irpro_ok=1;
//处理完毕标志位置1
主函数
voidmain(void)
EX0init();
//初始化外部中断
TIM0init();
//初始化定时器
LCD_Init();
//初始化液晶
DelayMs(20);
//延时有助于稳定
LCD_Clear();
//清屏
LCD_Write_String(0,0,"
HongwaiJiema"
);
LCD_Write_String(0,1,"
Code:
"
while
(1)//主循环
if(irok)//如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok)//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
if(IRcord[2]==0x16)//P1口置0,led灯全灭
led0=0;
led1=0;
led2=0;
led3=0;
led4=0;
led5=0;
led6=0;
led7=0;
if(IRcord[2]==0x0C)//收到按键1,取反P1.0口电平
{
led0=~led0;
}
if(IRcord[2]==0x18)//收到按键2,取反P1.1口电平
led1=~led1;
if(IRcord[2]==0x5E)//收到按键3,取反P1.2口电平
led2=~led2;
if(IRcord[2]==0x08)//收到按键4,取反P1.3口电平
led3=~led3;
if(IRcord[2]==0x1C)//类推下去
led4=~led4;
if(IRcord[2]==0x5A)
led5=~led5;
if(IRcord[2]==0x42)
led6=~led6;
}
if(IRcord[2]==0x52)
led7=~led7;
if(IRcord[2]==0x4A)//按键9,全亮
{
led0=1;
led1=1;
led2=1;
led3=1;
led4=1;
led5=1;
led6=1;
led7=1;
}
八、器件清单
1、STC89C52R单片机DIP40*1
2、38khz红外遥控器*1
3、LED灯*9
4、自锁开关*2
5、红外一体化接收头HS38BD*1
6、10kΩ直插式排阻DIP9*1
7、10kΩ及1kΩ色环电阻各一个
8、晶振11.0592*1
9、16P单排插针
10、单片机母座*1
11、usb-a*1
12、瓷片电容器22pf*2
13、纸介电容器10uf*1
14、可变电阻器w203*1
15、LCD1602A*1
16、双面覆铜板*1
九、实物图、使用说明、软硬件调试问题与解决
1、实物图如下:
正面:
背面:
2、使用方法
(1):
在遥控板上有21个按键,按下不同的按键,LCD屏就会显示出相应的遥控器码值。
(2):
P1.0电平取反,灯亮或灭;
P1.1电平取反,灯亮或灭;
P1.2电平取反,灯亮或灭;
P1.3电平取反,灯亮或灭;
P1.4电平取反,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外遥控收发机 红外遥控解码 红外 遥控 收发 解码
![提示](https://static.bdocx.com/images/bang_tan.gif)