嵌入式系统作业Word文档格式.docx
《嵌入式系统作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统作业Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
接收系统仿真原理图如图4所示。
图4红外接收系统模块
3.LED数码显示系统模块
采用多位一体数码管显示,以发光二极管为组成单元的显示器件。
采用共阴极数码管工作模式:
阴极接在一起,低电平,阳极为高电平时,则对应的LED灯亮。
工作原理图如图5所示。
图5LED数码管工作原理图
系统红外接收LED数码显示模块Multisim原理图如图6所示。
图6数码显示模块原理图
二、软件设计模块
1.发送模块程序设计
通过按键来控制I/O口电平高低转换。
由I/O口电平转换,组成红外编码时序图,然后通过开关上移、下移、左移、右移按键控制响应功能程序,并实现红外编码的调制。
相应程序设计流程图如图7所示。
图7发送模块程序设计流程图
2.接收模块程序设计
(1)红外接收模块是通过中断的方式来接收红外的信号,具体接收流程图如图8所示。
图8中断接收流程图
(2)通过中断接收的红外调制信号,按照图9所示的解调和解码。
解码过程中,通过判读是否接收到引导码来判断接收的信号是否是用户码,然后并对用户码进行识别,确认键码后解码。
利用接收波形的下降沿使单片机产生中断,相邻两次中断(两个下降沿)的间隔时间由定时器计时
图9解码流程图
3.数码管显示程序设计
数码管显示模块,通过单片机识别解码数据,并根据数据十进制高地位进行显示,设定片选每一位的显示时间。
每次中断切换数码管,四次为一个周期,定时时间4ms。
已知三个数码管分别显示十位、个位和十分位,对解码后的程序首先进行十位判断,如果有值则进行零值判断,如果无值则进行个位判断,依次到十分位判断,三个有效位依次根据判断顺序进行查表,并通过单片机程序片选十位、个位和十分位数码管进行显示。
根据一个周期4ms,对数码管进行扫描显示,就形成了红外编码显示。
具体程序设计流程图如图10所示。
图10数码管显示程序设计流程图
8051源程序
#include
//函数原型
voidSystemInit(void);
voidDelay_840us(void);
voidDelay_2400us(void);
voidLedDisp();
unsignedcharGetCode(void);
//获得码
voiddelay(unsignedcharloop);
//位变量
sbitIRIN=P3^2;
sbitBEEP=P1^6;
sbitswch=P1^7;
//变量
unsignedcharKeyValue;
//机器码
unsignedcharMaValue;
//键值码;
unsignedchardisbuf[4];
//数码管显示缓冲
unsignedcharscan[4]={0x04,0x08,0x10,0x20};
//p2位选择
unsignedcharcodetable[16]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
/*延时*/
voiddelay(unsignedcharloop)
{
unsignedchari;
for(i=0;
i>
8);
TR1=1;
while(!
TF1);
TF1=0;
TR1=0;
}
/*延时9ms*/
voidDelay_9000us(void)
TL1=153.6;
TH1=223.6;
TR1=1;
TF1=0;
TR1=0;
/*延时4.5ms*/
voidDelay_4500us(void)
TH1=239.8;
TL1=204.8;
/*系统初始化*/
voidSystemInit(void)
IRIN=1;
IT0=1;
//INT0负跳变触发
TMOD=0x10;
//定时器1工作在方式1
EA=1;
EX0=1;
/*读码*/
unsignedcharGetCode()
unsignedcharn;
statictemp=0;
for(n=0;
n<
8;
n++)
{
IRIN);
//等待高电平,开始解码
Delay_840us();
//延时0.84ms
if(IRIN)//若仍然为高电平,则为1,否则为0
temp=(0x80|(temp>
>
1));
//1
while(IRIN);
//等待跳变成低电平
}
else{
temp=(0x00|(temp>
//0
}
returntemp;
/*数码管显示*/
voidLedDisp()
i<
4;
i++)
P0=table[disbuf[i]];
P2=scan[i];
delay(50);
P0=0x00;
voidmain(void)
SystemInit();
while
(1)
//以下是查表显示
disbuf[0]=(((KeyValue&
0xf0)>
4)&
0x0f);
disbuf[1]=KeyValue&
0x0f;
disbuf[2]=(((MaValue&
disbuf[3]=MaValue&
LedDisp();
voidinterr_ir(void)interrupt0
/*用户码和机器码*/
unsignedcharaddrl,addrh,num1,num2;
EA=0;
//先关闭外部中断0
Delay_9000us();
//检测9ms开始码
if(IRIN){//检测是否为干扰信号
//重新开启外部中断0
return;
//退出解码
//等待跳为高电平
Delay_4500us();
//检测4.5ms结果码
//读码
addrl=GetCode();
//用户编码高位
addrh=GetCode();
//用户编码低位
num1=GetCode();
//机器码
num2=GetCode();
//机器码反码
//校验是否为错码
if(num1!
=~num2)
KeyValue=14;
EA=1;
return;
KeyValue=num2;
MaValue=addrh;