嵌入式系统作业.docx

上传人:b****6 文档编号:8018092 上传时间:2023-01-28 格式:DOCX 页数:11 大小:297.34KB
下载 相关 举报
嵌入式系统作业.docx_第1页
第1页 / 共11页
嵌入式系统作业.docx_第2页
第2页 / 共11页
嵌入式系统作业.docx_第3页
第3页 / 共11页
嵌入式系统作业.docx_第4页
第4页 / 共11页
嵌入式系统作业.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

嵌入式系统作业.docx

《嵌入式系统作业.docx》由会员分享,可在线阅读,更多相关《嵌入式系统作业.docx(11页珍藏版)》请在冰豆网上搜索。

嵌入式系统作业.docx

嵌入式系统作业

红外接收与发送系统设计

一、红外发送与接收系统硬件构成

红外遥感原理是利用红外线进行信息传递,波长范围:

0.76um~1.75um。

该系统总体框架图如图1所示,发射机、接收机和数码显示组成。

图1红外发送与接收系统框架图

1.红外发送系统模块

发射码是由引导码,用户码,键码和键码反码构成。

通过按键控制发射码的编辑与发送。

然后通过单片机8051的调制并通过通用I/O口的电平转换来控制红外LED的发光。

红外发送系统原理图如图2所示。

图2红外发送系统原理图

发射码的具体编码过程如图3所示。

图3发射机具体编码过程图

2.红外接收系统模块

红外接收模块主要是通过光敏三极管感受光照而控制三极管的导通与截止进而控制电平的转换,通过电平转换形成数字调制码。

通过8051对调制信号进行解调、解码。

接收系统仿真原理图如图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

#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;

while(!

TF1);

TF1=0;

TR1=0;

}

/*延时4.5ms*/

voidDelay_4500us(void)

{

TH1=239.8;

TL1=204.8;

TR1=1;

while(!

TF1);

TF1=0;

TR1=0;

}

/*系统初始化*/

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++)

{

while(!

IRIN);//等待高电平,开始解码

Delay_840us();//延时0.84ms

if(IRIN)//若仍然为高电平,则为1,否则为0

{

temp=(0x80|(temp>>1));//1

while(IRIN);//等待跳变成低电平

}

else{

temp=(0x00|(temp>>1));//0

}

}

returntemp;

}

/*数码管显示*/

voidLedDisp()

{

unsignedchari;

for(i=0;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&0xf0)>>4)&0x0f);

disbuf[3]=MaValue&0x0f;

LedDisp();

}

}

voidinterr_ir(void)interrupt0

{

/*用户码和机器码*/

unsignedcharaddrl,addrh,num1,num2;

EA=0;//先关闭外部中断0

Delay_9000us();//检测9ms开始码

if(IRIN){//检测是否为干扰信号

EA=1;//重新开启外部中断0

return;//退出解码

}

while(!

IRIN);//等待跳为高电平

Delay_4500us();//检测4.5ms结果码

if(IRIN){//检测是否为干扰信号

EA=1;//重新开启外部中断0

return;//退出解码

}

//读码

addrl=GetCode();//用户编码高位

addrh=GetCode();//用户编码低位

num1=GetCode();//机器码

num2=GetCode();//机器码反码

//校验是否为错码

if(num1!

=~num2)

{

KeyValue=14;

EA=1;

return;

}

KeyValue=num2;

MaValue=addrh;

EA=1;}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1