无线遥控升降旗系统.docx
《无线遥控升降旗系统.docx》由会员分享,可在线阅读,更多相关《无线遥控升降旗系统.docx(20页珍藏版)》请在冰豆网上搜索。
无线遥控升降旗系统
HEFEIUNIVERSITY
“爱默尔”杯合肥学院
第六届电子设计大赛设计报告
题目无线遥控升降旗系统(C题)
成员张辉自动化1班0705073002
成员徐善龙电子信息工程1班0705072019
成员徐建建自动化1班0705072036
2010年5月10日
无线遥控升降旗系统(C题)
摘要
基于80C51单片机为控制器,设计并实现了一个无线遥控升降旗系统,。
本系统实现升国旗与唱国歌的同步进行,通过无线遥控可以实现红旗的准确升降和高度以及升旗速度的设置。
同时升降国旗的各种状态由12864同步显示。
实现了升降国旗的无线自动化。
各项指标完全满足题设要求。
关键词:
无线遥控自动化80C51
1引言
随着自动化技术的发展,自动化的程度越来越高,人们对生活的自动化的要求。
本系统通过80C51单片机实现升旗、降旗的无线遥控,进而实现升旗,降旗自动化。
本次设计完成的无线遥控升降旗满足如下要求:
(1)、按下上升按键后,国旗匀速上升,同时流畅地演奏国歌;上升到最高端时自动停止上升,国歌演奏停止;按下下降按键后,国旗匀速下降,降旗的时间不放国歌,下降到最低端时自动停止。
(2)、为避免误动作,国旗在最高端时,按上升键不起作用;国旗在最低端时,按下降键不起作用。
(3)、升降国旗的时间均为43秒钟,与国歌的演奏时间相等,同时,旗从旗杆的最下端上升到顶端。
降旗不演奏国歌,同时,旗从旗杆的最上端下降到底端。
(4)、对于一般旗帜升旗高度可以自己设定,能在指定的位置上自动停止,此种工作方式下不放国歌。
(5)、半旗状态,升旗时,按上升键,奏国歌,国旗从最低端上升到最高端之后,国歌停奏,然后自动下降到总高度的2/3高度处停止;降旗时,国歌停奏,按下降键,国旗先从2/3高度处上升到最高端,再自动从最高端下降到底之后自动停止。
(6)、不论旗帜是处于什么位置,关断电源之后重新合上电源,旗帜所在的高度数据显示不变,并且恢复断电之前的动作继续运行。
(7)、要求升降旗的速度可调整,旗杆高度不变的情况下,升降旗时间的调整范围是30—120秒钟,步进1秒,调整速度后升旗状态国歌停奏。
2方案设计
2.1设计思路
本设计实现无线遥控控制红旗升降,主要是通过无线红外与单片机的通信和单片机对步进电机精确的控制。
完成各种逻辑状态的判断,这是本设计的重点所在。
2.2方案比较与选择
通过以上的分析我们拟定以下方案:
方案一:
运用无线发射模块,实现单片机与单片机的通信,然后通过被控单片机控制步进电机的动作和语音模块,以及12864液晶屏的显示。
最终实现单片机准确控制红旗的升降。
图1:
无线模块
方案二:
运用红外对管实现主单片机与从单片机的无线通信,进而控制步进电机和其他的一些外围电路。
图2:
串口通信
方案三:
运用红外遥控器通过解码来直接控制单片机,然后单片机再对下面的各个模块进行相应的控制。
图3:
红外遥控
方案一中无线发射模块价格很贵,并且实现起来较为复杂,增加系统的设计难度。
方案二中的红外对管,由于受到发光管的发送功率限制,只能实现短距离的无线通信,并且以上两者是单片机与单片机之间的通信,操作起来较为复杂。
在方案三中使用普通的万能遥控器,通过解码电路实现对单片机的控制,实现起来较为简单。
所以通过比较选择方案三来实现本系统。
2.3硬件模块设计
2.3.1语音电路
语音电路采用的是华邦公司的语音芯片ISD1700,该芯片内部包含有自动增益控制,麦克风前置扩大器,扬声器驱动线路,振荡器与内存等全方位整合系统功能。
ISD1700的独立按键工作模式录放电路很简单,不仅有录,放功能,还有快进,擦除,音量控制,直放录音和复位等功能。
在按键模式工作时,芯片可以通过/LED管脚给出信号开提示芯片的工作状态,并且伴随提示音,用户也可自定义4种提示音效。
录音操作:
按下REC,/REC管脚点评变低后开始录音,直到松开按键使电平拉高或者芯片录满时结束。
录音结束后,录音指针自动移向下一个有效地址,而放音指针则指向刚刚录完的那段语音地址。
放音操作:
放音操作有两种模式,分别是边沿触发和电平触发,都由/PLAY管脚触发。
本电路采用的是边沿触发。
擦除操作:
擦除操作有单个擦出和全体擦出,这本电路录音好后就限制使用该项操作。
防止擦出芯片内部的语音片段。
在下图语音电路中R24的大小决定着语音芯片内部存储语音的大小。
语音电路录好音接入本系统,在PLAY下降沿到来时,开始放音。
当再次下降沿到来时停止放音。
在本系统中43秒的国歌通过录音电路已经录入芯片内部。
图4:
ISD1760
2.3.2EEPROM-24C02存储电路
在本系统中,其中的要求:
不论旗帜是处于什么位置,关断电源之后重新合上电源,旗帜所在的高度数据显示不变,并且恢复断电之前的动作继续运行。
这就要求在断电之前把单片机的一些状态值和参数保存起来,在上电时把各个状态参数读出来,恢复到掉电之前的状态。
其中24C02是IIC总线器件,内存是2k,完全可以完成掉电存储的功能。
SDA为串行数据,SCL为串行时钟,WP为写保护。
A0,A1,A2用于器件地址选择。
只有一个24C02被总线寻址时,A0,A1,A2接高电平或者悬空。
IIC总线协议定义如下:
(1)只有在总线空闲时才允许启动数据传送。
(2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态不允许有跳变时,钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
起始信号:
时钟线保持高电平期间,数据线电平从高到低的跳变作为IIC总线的起始信号。
停止信号:
时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C总线的停止信号。
图5总线时序
图6写周期时序图
图7起始/停止时序
本系统的存储电路:
图8:
24C02
2.3.3红外-发射接收电路
红外发射采用的是普通遥控器,通过遥控器发出来的一系列脉冲,每一个信号由前导码,地址码,数据码组成。
前导码表示开始发送数据,地址码用于识别。
数据码表示遥控器按键的全部信息。
图9:
红外波码
从上图可以看出,红外发射出的码通过38K载波,一体化接收头信号端输出的码同伙内部电路解调并调整,输出的是数据波形。
利用这种性能可以做红外遥控解码。
图10:
红外发射—接收电路
2.3.4驱动电路
驱动电路采用的是LM297,LM298来驱动步进电机。
电路图如下:
图11:
驱动电路
2.3.5电源模块
本系统步进电机采用12V开关电源供电,单片机、液晶屏,语音电路的5V电源由12V电源通过三端稳压芯片2940得到。
100uf电解电容、0.01uf瓷片电容起滤除纹波作用.
图12:
电源电路
2.3.6显示模块
方案一:
采用LED数码管显示,由于要求显示设定值和测量值,需要显示的值比较多,采用LED数码管需要用动态扫描,占用资源比较多。
整个显示界面不太友好。
方案二:
采用LCD液晶显示器显示,采用128*64点阵LCD液晶显示,可视面积大,画面效果好,抗干扰能力强,调用方便简单,而且可以节省了软件中断资源。
其缺点在于显示内容需要存储字模信息,需要一定存储空间。
由于作为控制器的单片机SPCE061A有32K字的Flash,有足够的存储空间,存储字模数据绰绰有余。
鉴于上面分析,本设计采用方案二。
2.4系统软件设计
软件方框图如下:
图13:
软件流程图
3设计实现
1、无线遥控器控制单片机
红外遥控器主要是发射红外波码,而红外波码是一系列的脉冲组合,触发单片机的外部中断口,单片机接收到红外波码后,通过定时器记录红外波码的电平宽度对其进行分辨,本次设计采用的是8位红外解码程序,所以单片机总共可以解出255个编码,对于本次控制来说绰绰有余,对于不同的红外编码,单片机记录其码值后进行相应的散转控制,从而达到红外遥控器作为控制工具的自动化系统。
2、单片机对步进电机的控制
本次步进电机驱动采用是常用的L297,L298组合电路,此种电路非常实用和简单,给驱动电路供电后,只需接单片机两个控制端口就可电机实行控制,两个端口分别是CW、CLOCK,CW主要是控制电机转向,而CLOCK主要是给电机脉冲,控制电机运行,对于不同频率的脉冲,电机的转速是不同的,所以本次设计中,开启的单片机的定时器0,用于给电机脉冲,实现对脉冲频率的可调。
4系统测试
4.1测试条件和测试仪器设备
序号
名称、型号、规格
数量
备注
1
直尺
1
无
2
秒表
1
无
4.2测试结果
(1)、按下上升按键后,国旗匀速上升,同时流畅地演奏国歌;上升到最高端时自动停止上升,国歌演奏停止;按下下降按键后,国旗匀速下降,降旗的时间不放国歌,下降到最低端时自动停止。
(2)、升降国旗的时间均为43秒钟,与国歌的演奏时间相等,同时,旗从旗杆的最下端上升到顶端。
降旗不演奏国歌,同时,旗从旗杆的最上端下降到底端。
(3)、旗帜升旗高度可以自己设定,能在指定的位置上自动停止,此种工作方式下不放国歌。
(4)、半旗状态,升旗时,按上升键,奏国歌,国旗从最低端上升到最高端之后,国歌停奏,然后自动下降到总高度的2/3高度处停止;降旗时,国歌停奏,按下降键,国旗先从2/3高度处上升到最高端,再自动从最高端下降到底之后自动停止。
(5)、不论旗帜是处于什么位置,关断电源之后重新合上电源,旗帜所在的高度数据显示不变,并且恢复断电之前的动作继续运行。
(6)、升降旗的速度可调整,旗杆高度不变的情况下,升降旗时间的调整范围是30—120秒钟,步进1秒,调整速度后升旗状态国歌停奏。
5结论
经过四天三夜的努力,我们成功的设计并制作完成了无线遥控升降旗系统。
综合测试证明,本系统能完成赛题要求的所有任务。
并且我们对无线遥控进行了扩展。
通过红外对管实现单片机与单片机单向通信实现了无线的控制,但是由于红外发光管的发射功率的限制,只能完成短距离的无线控制。
利用激光对管可以提高无线的控制距离。
通过参加此次合肥学院电子设计竞赛,我们学到了很多知识,明白了团队合作的重要性。
更重要的是,本次参赛经历让我们明白了基础理论知识的重要性,这为我们今后的努力指明了方向。
参考文献
[1]张毅刚,彭喜元.单片机原理与应用设计.北京:
电子工业出版社,2008年.
[2]谢自美.电子线路设计-实验—测试.武汉:
华中科技大学出版社,2008年.
[3]彭伟,单片机C语言程序设计实训100例—基于8051+Protues仿真.北京:
电子工业出版社,2009年.
[4]赵亮,侯国锐.单片机C语言编程与实例.北京:
人民邮电出版社,2004年.
[5]黄智伟,王彦.全国大学生电子设计竞赛训练教程.北京:
电子工业出版社,2005年.
附录1:
单片机最小系统原理图
附录2:
液晶屏显示
附录3:
实物总体图
附录4:
系统部分主程序清单
无线红外遥控程序
#include
#include
#include"24c02.c"
#include"12864.c"
#include"Hongwai.c"
sbitKeyUp=P1^3;//顶端标志
sbitKeyDown=P1^4;//底端标志
sbitSong=P1^5;//音乐播放
sbitClock=P1^6;//电机脉冲
sbitCw=P1^7;//Cw=1升旗Cw=0降旗
sbitKey=P2^2;//模式切换
sbitLed=P2^3;//指示灯显示
sbitMotor=P2^4;
sbitlight=P2^7;
floatHeight;//实际高度
unsignedcharSetheignt,Step=1,Second,b;
bitHalfadd,HalfSub;//Halfadd是上升过程显示Height加减状态HalfSub是下降过程显示Height加减状态
bitHalfflag=0;//半旗标志
unsignedcharUpDowanFlag=0;//上下标志
unsignedcharHalfUpDowanFlag=0;//半旗状态上下标志
bitHalfSignalFlag;
bitHalfDown;//半旗状态下用来判断遇到顶部开关时上升还是下降
bitUp,Down;//用来判断上升到顶部或者底部无法再上升或下降
bitConfigFlag;
unsignedintConfigsignal,Signal,HalfSignal,a;//设置脉冲与实际脉冲
bitHeigntconfig;//手动上下标志
bitSpeedFlag;
bitTimeFlag;//设置时间标志
unsignedcharNumrow[5];
unsignedchartr0,cw;
unsignedcharStepTime=43;//步进时间
unsignedDingshi=38;
voidmain()
{
Lcd_Init();
Ir_Init();
n=0;
flag=0;
RdFromROM(Numrow,10,5);//读ROM里的数据
Height=Numrow[0]*100+Numrow[1]*10+Numrow[2];
tr0=Numrow[3];
cw=Numrow[4];
TR0=tr0;
Cw=cw;
//ConfigFlag=Numrow[5];
//Signal=Numrow[6];
//Configsignal=Numrow[7];
Lcd_DisplayString(0,0,"欢迎进入无线");
Delay(50000);
Lcd_DisplayString(2,1,"遥控升降旗系统");
Delay(50000);Delay(50000);Delay(50000);Delay(50000);
Lcd_Clear(0);Delay(5000);Lcd_Clear
(1);Delay(5000);Lcd_Clear
(2);Delay(5000);Lcd_Clear(3);
Lcd_DisplayString(0,2,"一般模式");
Delay(40000);
Lcd_DisplayString(1,0,"请选择控制方式");
Delay(40000);
Lcd_DisplayString(2,0,"1:
自动");
Lcd_DisplayString(2,4,"2:
手动");
Lcd_DisplayString(3,0,"历史高度:
");
Lcd_DisplayOneChar(3,5,(int)Height/100+0x30);
Lcd_DisplayOneChar(3,6,(int)Height%100/10+0x30);
Lcd_DisplayOneChar(3,7,(int)Height%10+0x30);
while
(1)
{
if(irok)
{
switch(Im[2])//按键功能显示
{
case01:
TimeFlag=0;
Lcd_Clear(0);Delay(5000);Lcd_Clear
(1);Delay(5000);Lcd_Clear
(2);Delay(5000);Lcd_Clear(3);
Lcd_DisplayString(0,0,"3:
上升");//自动模式
Lcd_DisplayString(0,4,"4:
下降");
Lcd_DisplayString(1,0,"当前高度:
");
Lcd_DisplayString(2,0,"时间:
");
Lcd_DisplayString(2,5,"S");
break;
case02:
TimeFlag=0;
Lcd_Clear(0);Delay(5000);Lcd_Clear
(1);Delay(5000);Lcd_Clear
(2);Delay(5000);Lcd_Clear(3);
Lcd_DisplayString(0,0,"请设置升降高度");//手动模式
Lcd_DisplayString(1,6,"CM");
Lcd_DisplayString(2,0,"步进:
");
Setheignt=0;Step=0;
break;
case03:
Height=0;Second=0;UpDowanFlag=1;//一般模式上升
Song=1;Delay(10000);Song=0;Delay(10000);Song=1;
Cw=1;TR0=1;
Lcd_Clear(3);
if(Up==1){TR0=0;Lcd_DisplayString(3,0,"已上升到顶部..");}
Delay(10000);
Lcd_DisplayOneChar(1,5,(int)Height/100+0x30);
Lcd_DisplayOneChar(1,6,(int)Height%100/10+0x30);
Lcd_DisplayOneChar(1,7,(int)Height%10+0x30);
Lcd_DisplayOneChar(2,3,Second/10+0x30);
Lcd_DisplayOneChar(2,4,Second%10+0x30);
break;
case04:
Height=180;Second=43;UpDowanFlag=2;//一般模式下降
Cw=0;TR0=1;
Lcd_Clear(3);
if(Down==1){TR0=0;Lcd_DisplayString(3,0,"已下降到底部..");}
Delay(10000);
Lcd_DisplayOneChar(1,5,(int)Height/100+0x30);
Lcd_DisplayOneChar(1,6,(int)Height%100/10+0x30);
Lcd_DisplayOneChar(1,7,(int)Height%10+0x30);
Lcd_DisplayOneChar(2,3,Second/10+0x30);
Lcd_DisplayOneChar(2,4,Second%10+0x30);
break;
case05:
Height=0;Second=0;HalfUpDowanFlag=1;//半旗状态上升
Song=1;Delay(10000);Song=0;Delay(10000);Song=1;
Cw=1;TR0=1;Delay(10000);
Halfadd=0;HalfDown=0;
Lcd_DisplayOneChar(2,5,(int)Height/100+0x30);
Lcd_DisplayOneChar(2,6,(int)Height%100/10+0x30);
Lcd_DisplayOneChar(2,7,(int)Height%10+0x30);
Lcd_DisplayOneChar(3,3,Second/10+0x30);
Lcd_DisplayOneChar(3,4,Second%10+0x30);