基于单片机的红外传输的研究和设计.docx
《基于单片机的红外传输的研究和设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的红外传输的研究和设计.docx(29页珍藏版)》请在冰点文库上搜索。
基于单片机的红外传输的研究和设计
摘要:
1
1系统概述2
1.1红外线遥控系统2
1.2系统设计方案4
2各模块的设计方案与实现4
2.1STC89C52单片机功能概述4
2.2STC89C52单片机的引脚图(图3)5
2.3红外收/发模块的设计方案与实现6
2.4步进电机的介绍7
2.5步进电机的驱动模块的设计实现9
2.6LCD液晶显示模块的设计方案与实现10
3系统的软件设计10
4系统设计流程图(图8)25
5结论26
参考文献:
26
基于单片机的红外传输的研究和设计
杨荣指导教师:
阿依佐克拉·瓦依提
摘要:
本文介绍了一种基于STC89S52单片机的红外遥控步进电机的设计,系统分为红外遥控编解码、驱动步进电机和显示步进电机状态三个模块,设计的系统能通过红外遥控器发射不同的码值来控制步进电机的正反转,加速减速以及启动停止,本报告对该系统的工作原理、硬件电路和软件进行了详细介绍。
关键词:
单片机;步进电机;红外接收管;液晶显示器
ResearchandDesignofInfraredTransmissionBasedonSinglechipmicrocomputer
YangRongTutor:
Wayiti Ayizuo carats
Abstract:
ThispaperdescribesadesignofsteppermotorcontrolledbyinfraredremotebasedonSTC89S52-MCS.Itssystemisdividedintothreemodules:
infraredremotecodec,steppermotordriveranddisplayofsteppermotorstatus.Thesystemcontrolsthesteppermotor’sreversing,acceleration,deceleration,startandstopthroughtheinfraredremotecontroltransmittingdifferentcodevalues.Thisreport givesadetailedintroductiontothe workprinciple, thehardware circuitandsoftware.
Keywords:
SCM; Steppermotor; Infraredreceiver
随着我国工业化、信息化进程的高速发展,电子信息产业蓬勃发展,国内对单片机及其外围设备研究越来越深入,实用也越来越广泛。
无论是工业用品,还是民用产品,基本上都设计到单片机的设计和使用。
红外线的使用更是广泛,不但在普通家庭中的遥控器中,在工业中红外线以其抵抗化学、粉尘等优质特性起着无可替代的作用。
1系统概述
1.1 红外线遥控系统
红外线遥控系统就是指利用红外线来传递控制信号实现对控制对象的远距离控制的目的,具体来讲就是由发射器发出红外线指令信号,由接受器接受信号并对信号进行处理,最后实现对对象的各种功能的远距离控制。
红外线遥控系统一般由发射器和接受器两部分组成发射器包括指令、键指令信号产生、电路调制电路、驱动电路及红外线发射器件、接受器由红外线接受器件、前置放大电路解调电路、指令信号检出电路、记忆及驱动电路、执行电路等组成。
红外线遥控系统按照产生和区分控制指令的方式和特征来分类,常用的有频分制和码分制红外线遥控,频分制红外线遥控就是信号产生电路以不同频率的电信号代表不同的控制指令。
码分制红外线遥控是指信号产生电路以不同的脉冲编码代表不同的指令。
通用红外遥控系统由发射和接收两大部分组成(图1),应用编/解码专用集成电路芯片来进行控制操作,如图所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1通用红外遥控系统
遥控发射器及其编码:
遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以说明,现以3310组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms周期为2.25ms的组合表示二进制的“1”上述“0”和“1”组成的42位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射,
3310产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码用于核对数据是否接收准确。
当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。
解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右即可。
根据红外编码的格式,程序应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
接收器及解码
IC1838是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。
1.2 系统设计方案
系统利用1838红外线接收头从集成遥控器上接受红外信号,并且将信号传递给单片机进行解码、分析,然后驱动步LCD1602液晶显示屏显示当前按键,并且驱动步进电机工作模块使电机转动。
根据该系统设计要求,需要通过红外遥控器按下按键和显示器来改变步进电机的运动状态以及显示,只需要红外控制器中的6个按键就可以满足需求,外加8位LED数码显示管即可。
通过从键盘上输入正、反转命令、按键数值显示在液晶屏上,经键盘可完成启动、停止、正转、反转、速度设置等控制功能。
设计框图如图2。
图2设计框图
2各模块的设计方案与实现
根据系统要求设计各个模块。
本设计中控制芯片采用STC89C52单片机。
各个功能通过不同模块来实现,主要有:
红外接收模块、步进电机驱动和LCD显示模块。
2.1STC89C52单片机功能概述
1STC89C52是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可选。
[15、ISP下载接口(保留了并口ISP下载线或者其他的兼容ISP下载线,如果有并口的电脑可以对AT89S51AT89SS52单片机直接编程。
)
2.2STC89C52单片机的引脚图(图3)
图3STC89C52单片机的引脚图
2.3红外收/发模块的设计方案与实现
红外发射模块:
遥控发射器采用SC6121编码芯片进行红外遥控发射电路的搭建。
SC6121是一块用于红外遥控系统中的虹鳟用发射集成电路,采用COMS工艺制造,它可外接32个按键。
通过遥控器发射不同的码值,红外接收电路将收到的信号送给单片机的外部中断0,单片机接收到信号后通过解码程序对接收到的信号进行处理,使得和谐信号成为相应的码值。
经过处理后这些信号就可以去控制步进电机的正传反转,加速减速以及启动停止。
红外接收模块:
本系统采用的是IC1838红外接收头。
它是一颗集接收电路、调制解调电路、低通滤波、放大电路和控制电路为一体的集成接收头、一个有三个引脚输出,其中一个是电源,一个是接地,另一个则是输出,这样就大大方便了我们的使用。
IC1838的原理图如图4。
图4IC1838的原理图
由于IC1838内部集成了强大的信号处理功能,所以我们在本系统中使用时只需要在外部加一个滤波电路即可,这个RC滤波电路是为了滤除电源端的干扰信号。
图5为IC1838的应用电路。
图5IC1838的应用电路
2.4步进电机的介绍
步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器
虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。
它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
步进电机是一种将电脉冲转化为角位移的执行机构。
通俗一点讲:
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。
您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
种类划分:
步进电机分三种:
永磁式(PM)、反应式(VR)和混合式(HB)。
永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大,在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点,分为两相和五相,两相步进角一般为1.8度而五相步进角一般为0.72度,这种步进电机的应用最为广泛。
基本原理:
通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。
该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。
当定子的矢量磁场旋转一个角度。
转子也随着该磁场转一个角度。
每输入一个电脉冲,电动机转动一个角度前进一步。
它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。
改变绕组通电的顺序,电机就会反转。
所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。
电机固有步距角:
它表示控制系统每发一个步进脉冲信号,电机所转动的角度。
电机出厂时给出了一个步距角的值,如86BYG250A型电机给出的值为0.9°/1.8°(表示半步工作时为0.9°、整步工作时为1.8°),这个步距角可以称之为‘电机固有步距角’,它不一定是电机实际工作时的真正步距角,真正的步距角和驱动器有关。
通常步进电机步距角β的一般计算按下式计算。
β=360°/(Z·m·K)
式中β―步进电机的步距角;
Z―转子齿数;
m―步进电动机的相数;
K―控制系数,是拍数与相数的比例系数
步进电机的相数是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。
电机相数不同,其步距角也不同,一般二相电机的步距角为0.9°/1.8°、三相的为0.75°/1.5°、五相的为0.36°/0.72°。
在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。
如果使用细分驱动器,则‘相数’将变得没有意义,用户只需在驱动器上改变细分数,就可以改变步距角。
3 转矩
1、HOLDINGTORQUE(保持转矩)
是指步进电机通电但没有转动时,定子锁住转子的力矩。
它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近保持转矩。
由于步进电机的输出力矩随速度的增大而不断衰减,输出功率也随速度的增大而变化,所以保持转矩就成为了衡量步进电机最重要的参数之一。
比如,当人们说2N.m的步进电机,在没有特殊说明的情况下是指保持转矩为2N.m的步进电机。
2、DETENTTORQUE(无激磁保持转矩):
是指步进电机没有通电的情况下,定子锁住转子的力矩。
DETENTTORQUE在国内没有统一的翻译方式,容易使大家产生误解;由于反应式步进电机的转子不是永磁材料,所以它没有DETENTTORQUE。
2.5步进电机的驱动模块的设计实现
本系统采用额定电压5v,相数为四相步进电机。
一共6根线,其中两根的为电源线。
采用单极性直流电源供电。
只要对步进电机的各项绕组按合适的时序通电,就能使步进电机转动。
由于单片机p口电流比较弱不能驱动步进电机,所以要加一个ULN2003芯片来放大电流使之能驱动步进电机工作。
ULN2003是高耐压、大电流,由七个硅NPN达林顿管组成。
ULN2003的每一对达林顿管都串联一个ULN2003工作,电压高,工作电流大,灌电流可以达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。
步进电机驱动电路如图6:
图6步进电机驱动电路
2.6LCD液晶显示模块的设计方案与实现
在这个模块我们采用1602字符型液晶显示模块来显示步进电机的转速、起停以及正反转等步进电机的状态。
字符型液晶屏是专门用于显示字符、数字、符号等的点阵型液晶显示模块。
分为4位和8位数据传输方式。
提供5*7点阵+光标和5*10点阵+光标的显示模式。
可以显示两行,每行8个字符。
提供内部自动上电复位电路,+5V工作电压。
一共有16个引脚,其中一对电源引脚、一对LED背光电源引脚、LCD驱动电压引脚、一个模式选择引脚、一个读写操作引脚、一个使能引脚以及7个数据引脚。
其中LCD驱动电压V0可通过滑动变阻器进行调节,一般V0为零伏。
应用电路图如图7。
图7应用电路图
3系统的软件设计
本系统的软件设计分LCD显示子程序、红外解码判断子程序、步进电机控制程序和主程序组成。
这个系统采用C语言进行编写。
红外发射程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P3^3;
sbitkey2=P3^4;
sbitkey3=P3^5;
sbitLED=P1^0;//发射指示灯
sbitout=P3^7;
uchari,a,num1;
voidinit()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
voiddelay(ucharaa)
{
ucharbb,cc;
for(bb=aa;bb>0;bb--)
for(cc=200;cc>0;cc--);
}
voiddelayms(ucharaa)//延时程序
{
for(a=aa;a>0;a--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
voidkhz(ucharaa)//是发射38KHZ的程序
{
for(a=aa;a>0;a--)//这个for语句可以得到准确的26.3波特率
{
out=0;
i=7;//低了17us
while(i>0)i--;//38kHZ
out=1;
//高了9us17+9=26us比26.3快一点点
}
}
//khz(116);//3.028ms精确的时间
//khz(64);//2.006ms
//khz(40);//1.052ms
//delayms(125);//2.012ms这里是一些时间的介绍
//delayms(65);//1.054ms
//delayms(93);//1.5ms
voidfashu(ucharnum)
{
khz(116);//发射3ms38khz
delayms(125);
for(num1=8;num1>0;num1--)//原来用的是a后来出错,肯定在这里!
{
khz(40);
if(num&0x01)
delayms(93);//delay1.5ms
else
delayms(65);//delay1ms
num=num>>1;
}
khz(20);
}
voidtishi()
{
LED=0;
delay(50);
LED=1;
delay(50);
LED=0;
delay(50);
LED=1;
}
voidkeyscan()//按键扫描
{
if(key1==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key1==0)
{
while(!
key1);
fashu(0xf3);
tishi();
}
}
if(key2==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key2==0)
{
while(!
key2);
fashu(0x3f);
tishi();
}
}
if(key3==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key3==0)
{
while(!
key3);
fashu(0xf5);
tishi();
}
}
}
voidmain()
{
init();
while
(1)
{
keyscan();
}
}
红外接收程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitled1=P1^0;
sbitled2=P1^1;
sbitled3=P1^2;
sbitin=P3^2;
uchari,a,num;
bitfleg;
voidinit()
{
fleg=1;
in=1;
EA=1;
EX0=1;
IT0=1;
}
voiddelayms(ucharaa)
{
for(i=aa;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
voidmain()
{
init();
//delayms(45);//0.642ms
//delayms(35);//0.502ms
//delayms(115);//1.623ms
//delayms(72);//1.02ms
//delayms(84);//1.188ms
//delayms(31);//0.446ms
while
(1);
}
voidsieasdf()interrupt0
{
EX0=0;
for(a=5;a>0;a--)
{
delayms(35);//延时0.5ms判断5次5*0.5=2.5ms
if(in)fleg=0;
}
if(fleg)
{
delayms(72);//延时1ms判断是不是高电平了
if(in)
{
delayms(115);//延时让它超过2ms;2.5+1+1.623=5.123ms开始读数据
delayms(118);//若偏移一位,可以去掉。
for(a=8;a>0;a--)
{
while(!
in);
delayms(86);//延时1.188ms判断IO高低,从而得0或1
num=num>>1;
if(in)
{
num=num|0x80;
delayms(31);//延时0.6ms因为上面延时1.2ms+0.6刚好跳过1.5ms
}
}
P2=num;
}
}
fleg=1;
EX0=1;
}
LCD程序显示子程序
#include"reg52.h"
/********IO引脚定义***********************************************************/
sbitLCD_RS=P1^0;//定义引脚
sbitLCD_RW=P1^1;
sbitLCD_E=P1^2;
/********宏定义***********************************************************/
#defineLCD_DataP0
#defineBusy0x80//用于检测LCD状态字中的Busy标识
sbithwx=P3^3;
unsignedcharly_disdate[4]={0,0,0,0};//显示缓冲
unsignedcharly_lhj[4];//保存NEC的四个字节数据
bitly_flag=1;//成功接收标志
unsignedcharly_ct=0;
/********数据定义*************************************************************/
unsig