电子系统设计创新与实践实验报告.docx
《电子系统设计创新与实践实验报告.docx》由会员分享,可在线阅读,更多相关《电子系统设计创新与实践实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
电子系统设计创新与实践实验报告
电子系统设计创新与实践报告
—简易红外遥控系统
班级:
通信09-1
姓名:
何探
学号:
3090731126
指导老师:
李新
1任务
设计并制作红外遥控发射机和接收机。
2要求
(1)自制红外无线收、发器,可以上电工作。
(2)调制方式:
自选编码调制方式。
(3)遥控对象:
4个,被控设备用LED分别代替,LED发光表示工作。
(4)接收机距离发射机不小于1m。
(5)具有红外信号学习功能。
3系统方案
设计框图如下:
红外遥控有发送和接收两个组成部分:
发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。
红外接收端普遍采用价格便宜,性能可靠的一体化红外接收头(如HSOO38,它接收红外信号频率为38KHz,周期约26US)接收红外信号,它同时对信号进行放大、检波、整形,得到相应电平的编码信号,再送给单片机,经单片机解码并执行,去控制相关对象。
(1)二进制信号的编码
本设计采用不同的脉宽宽度来实现二进制信号的编码,可由发送单片机来完成。
用图2-2(a)表示二制信号中的高电平‘1’,其特征是脉冲中低电平的宽度等于0.26ms,相当于10个26us的宽度,高电平的宽度等于0.52ms,相当于20个26us的宽度;用图2-2(b)表示二进制信号中的低电平‘0’,其特征是脉冲中高电平的宽度等于0.26mS,而低电平的宽度是高电平的二倍,等于0.52ms,相当于20个26us的宽度。
上述10个和20个脉冲宽度还可适当调整,以适应不同数据传输速度的需要。
(2)二进制信号的调制
二进制信号的调制仍由发送单片机来完成,它把编码后的二进制信号调制成频率为38KHz的间断脉冲串,相当于用二进制信号的编码乘以频率为38KHz的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。
如图2-3所示,A是二进制信号的编码波形,B是频率为38KHz(周期为26uS)的连续脉冲串,c是经调制后的间断脉冲串(相当于C=A*B),用于红外发射二极管发送的波形。
图2-3中,待发送的二进制数据为10。
(3)二进制信号的解调
二进制信号的解调由一体化红外接收头HSOO38来完成,它把收到的红外信号(图2-4中波形D,也是图2-3中波形(C)经内部处理并解调复原,输出图2-4中波形E(正好是对图2-3中波形A的取反),HS0038的解调可理解为:
在输入有脉冲串时,输出端输出低电平,否则输出高电平。
二进制信号的解码由接收单片机来完成的它把红外接收头送来的二进制编码波形通过解码,还原出发送端发送的数据。
如图2-4,把波形E解码后还原成数据信息101。
(4)基于字节传输的红外遥控数据格式
在发送字节的开始先通过单片机发送20个脉冲宽度(每个脉冲周期26uS)的高电平作为传输开始,接着发送8位数据(字节高位在前,低位在后),最后发送10个脉冲宽度的低电平作为传输结束,如图2-5所示。
4理论分析与硬件电路设计
4.1主要器件介绍
4.1.1芯片STC89C52
(1)芯片介绍
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
引脚标注
(2)相关特性
STC89C52RC单片机:
8K字节程序存储空间;
512字节数据存储空间;
内带2K字节EEPROM存储空间;
可直接使用串口下载;
AT89S52单片机:
8K字节程序存储空间;
256字节数据存储空间;
没有内带EEPROM存储空间;
(3)相关参数
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4.用户应用程序空间为8K字节
5.片上集成512字节RAM
6.通用I/O口(32个),复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片
8.具有EEPROM功能
9.共3个16位定时器/计数器。
即定时器T0、T1、T2
10.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
11.通用异步串行口(UART),还可用定时器软件实现多个UART
12.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
13.PDIP封装
4.1.2集成电路74LS21
74LS21是由四输入与门构成,74LS21集成电路的引脚分布图如图3-3所示
图3-374LS21集成电路的引脚分布图
4.1.3接收器HS0038
一体化红外接收头HSOO38的外部结构如图3-4所示,1脚GND接电源地,2脚VCC接十SV,3脚OUT为数据输出端(TTL电平,反相输出),可直接与单片机相联。
实际所用的H38B3V型号的红外接收头的管脚为管脚1是VCC,管脚2是GND,管脚3是OUT,一开始接错了,后面通过询问别人和查资料才知道。
各个基本电路图的设计
(1)发射接收电路如图3-7所示:
图3-7(a)接收电路图3-7(b)发射电路
(2)键盘扫描:
采用4*4键盘,键盘扫描采用低电平扫描,中断定时扫描方式。
电路图如3-8所示,其公共端连接VCC,初始时,令P2=F0H,无论哪个按键被按下,都将产生中断,开启定时器10ms,扫描键盘。
开始进行扫描时,P2.0—P2.3点均保持高电平。
P2.4—P2.7只能有一个为低电平。
程序流程图如图4-1所示。
图3-8键盘扫描电路
(3)控制电路:
采用小灯的亮灭来模拟实际应用中的电路,电路如图3-9所示。
图3-9小灯控制电路
5主要电路设计
(1)发射电路原理图如图所示:
(2)接收电路原理图如图所示:
6软件程序设计
(1)发射程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitIR=P1^0;//发射引脚(接NPN三极管基极)
#definesam0x80//用户识别码
unsignedcharIRCOM[7];
#definem9(65536-9000)//9mS
#definem4_5(65536-4500)//4.5mS
#definem1_6(65536-1650)//1.65mS
#definem_56(65536-560)//0.56mS
#definem40(65536-40000)//40mS
#definem56(65536-56000)//56mS
#definem2_25(65536-2250)//2.25mS
voidSendDat(unsignedintValue);//NEC编码发送程序
voidZ0(unsignedinttemp);//单帧(8位数据)发送程序
voidTT0(bitBT,unsignedintx);//38KHz载波发射+延时程序
voidKEY();
voiddelay(unsignedintcount)
{
unsignedinti,j;
for(i=0;ifor(j=0;j<110;j++);
}
voidmain(void)
{
TMOD=0x01;//T016位工作方式
IR=0;//发射端口常态为低电平
P2=0xf0;
while
(1)
{
KEY();
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:
NEC编码发送程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
voidSendDat(unsignedintValue)
{
TT0(1,m9);//高电平9mS
TT0(0,m4_5);//低电平4.5mS
/*┈发送4帧数据┈*/
Z0(sam);//用户码
Z0(sam);//用户码
Z0(Value);//操作码
Z0(~Value);//操作码反码
/*┈┈结束码┈┈*/
TT0(1,m_56);
TT0(0,m40);
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:
单帧(8位数据)发送程序
入口:
temp
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
voidZ0(unsignedinttemp)
{
unsignedintv;
for(v=0;v<8;v++)
{
TT0(1,m_56);//高电平0.65mS
if(temp&0x01)
TT0(0,m1_6);//发送最低位
else
TT0(0,m_56);
temp>>=1;//右移一位
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:
38KHz载波发射+延时程序
入口:
(是否发射载波,延时约x(uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
voidTT0(bitBT,unsignedintx)
{
TH0=x>>8;//输入定时值
TL0=x;
TF0=0;//溢出标志位清0
TR0=1;//启动定时器0
if(BT==0)while(!
TF0);//BT=0时,不发射38KHz载波只延时;
else
while
(1)//BT=1时,发射38KHz脉冲+延时;38KHz载波(低电平)占空比5:
26
{
IR=1;
if(TF0)
break;
if(TF0)
break;
IR=0;
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
IR=0;//载波停止后,发射端口常态为低
}
voidKEY()
{
uchartemp;
P2=0xf7;//第一行键盘扫描
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(7);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x77:
SendDat(0x01);break;
case0xb7:
SendDat(0x02);break;
case0xd7:
SendDat(0x03);break;
case0xe7:
SendDat(0x04);break;
}
}
}
P2=0xfb;//第二行键盘扫描
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(7);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7b:
SendDat(0x05);break;
case0xbb:
SendDat(0x06);break;
case0xdb:
SendDat(0x07);break;
case0xeb:
SendDat(0x08);break;
}
}
}
P2=0xfd;//第三行键盘扫描
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(7);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7d:
SendDat(0x09);break;
case0xbd:
SendDat(0x10);break;
case0xdd:
SendDat(0x11);break;
case0xed:
SendDat(0x12);break;
}
}
}
P2=0xfe;//第四行键盘扫描
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(7);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7e:
SendDat(0x13);break;
case0xbe:
SendDat(0x14);break;
case0xde:
SendDat(0x15);break;
case0xee:
SendDat(0x16);break;
}
}
}
}
(2)接收程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardistemp=100;
voiddelay(ucharx);//x*0.14MS
voiddelay1(intms);
sbitIRIN=P3^3;//红外接收器数据线
sbitLED0=P0^0;
sbitLED1=P0^1;
sbitLED2=P0^2;
sbitLED3=P0^3;
sbitLED4=P0^4;
sbitLED5=P0^5;
sbitLED6=P0^6;
sbitLED7=P0^7;
sbitLED8=P2^0;
sbitLED9=P2^1;
sbitLED10=P2^2;
sbitLED11=P2^3;
sbitLED12=P2^4;
sbitLED13=P2^5;
sbitLED14=P2^6;
sbitLED15=P2^7;
ucharIRCOM[7];
/*******************************************************************/
voidmain()
{
IE=0x84;//允许总中断中断,使能INT1外部中断
TCON=0x04;//触发方式为脉冲负边沿触发
IRIN=1;//I/O口初始化
LED0=1;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
LED13=1;
LED14=1;
LED15=1;
delay1(10);//延时
while
(1)
{
switch(distemp)
{
case0:
LED0=0;delay(200);LED0=1;break;
case1:
LED1=0;delay(200);LED1=1;break;
case2:
LED2=0;delay(200);LED2=1;break;
case3:
LED3=0;delay(200);LED3=1;break;
case4:
LED4=0;delay(200);LED4=1;break;
case5:
LED5=0;delay(200);LED5=1;break;
case6:
LED6=0;delay(200);LED6=1;break;
case7:
LED7=0;delay(200);LED7=1;break;
case8:
LED8=0;delay(200);LED8=1;break;
case9:
LED9=0;delay(200);LED9=1;break;
case10:
LED10=0;delay(200);LED10=1;break;
case11:
LED11=0;delay(200);LED11=1;break;
case12:
LED12=0;delay(200);LED12=1;break;
case13:
LED13=0;delay(200);LED13=1;break;
case14:
LED14=0;delay(200);LED14=1;break;
case15:
LED15=0;delay(200);LED15=1;break;
}
delay(20);
}
}//endmain
/**********************************************************/
voidIR_IN()interrupt2using0
{
unsignedcharj,k,N=0;
EX1=0;
delay(15);
if(IRIN==1)
{EX1=1;
return;
}
//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay
(1);}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{delay
(1);}
while(!
IRIN)//等IR变为高电平
{delay
(1);}
while(IRIN)//计算IR高电平时长
{
delay
(1);
N++;
if(N>=30)
{EX1=1;
return;}//0.14ms计数过长自动离开。
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
if(IRCOM[2]!
=~IRCOM[3])
{EX1=1;
return;}
switch(IRCOM[2])
{
case0x01:
distemp=0;
break;
case0x02:
distemp=1;
break;
case0x03:
distemp=2;
break;
case0x04:
distemp=3;
break;
case0x05:
distemp=4;
break;
case0x06:
distemp=5;
break;
case0x07:
distemp=6;
break;
case0x08:
distemp=7;
break;
case0x09:
distemp=8;
break;
case0x10:
distemp=9;
break;
case0x11:
distemp=10;
break;
case0x12:
distemp=11;
break;
case0x13:
distemp=12;
break;
case0x14:
distemp=13;
break;
case0x15:
distemp=14;
break;
case0x16:
distemp=15;
break;
}
EX1=1;
}
/**********************************************************/
voiddelay(unsignedcharx)//x*0.14MS
{
unsignedchari;
while(x--)
{
for(i=0;i<13;i++){}
}
}
/**********************************************************/
voiddelay1(