国旗升降自动控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Protues电路设计与仿真
结
课
论
文
姓名吕雪锋
学号**********
学院信息工程学院
专业计算机科学与技术
班级计算机16-2班
指导老师孟洪兵
国旗升降自动控制系统
目录
设计任务........................................................2
摘要.............................................................4 第 1 节系统方案论证与比较..................................5
1.1 设计思路...............................................5
1.2 方案选择与论证.........................................5
1.2.1、电机的选择与论证.....................................5
1.2.2、电机驱动方案的选择与论证.............................5
1.2.3、显示部分方案的选择与论证.............................6
第 2 节电路框图设计.......................................8
2.1 总体框图设计..........................................8
2.2 整体程序流程图........................................9
第 3 节系统的具体设计...............................10
3.1 系统的硬件设计........................................10
3.1.1、电机驱动模块.........................................10
3.1.2、键盘与显示模块.......................................11 3.2 系统的软件设计.......................................12
3.2.1、主体电路图.....................................12
第 4 节结论.................................................13 第 5 节心得.................................................14 参考文献...........................................................14 附录.........................................................15
国旗升降系统控制设计报告
设计任务
设计一个国旗升降旗系统,该系统能够控制升旗和降旗,升旗时,在到固定时间时自动停止;降旗时,在到达固定时间自动停止。
旗帜的升降由电动机驱动,该系统有三个控制按键,一个是上升键,一个是下降键,一个是复位按键。
基本功能
1.按下上升按键后,电机随着时间匀速顺时针转动;上升到固定时间时自动停止上升,电机停止转动;按下下降按键后,电机随着时间匀速逆时针下降,下降到固定时间时电机停止转动。
2.能在上升到最大时间后复位,动态时间清零。
3.为避免误动作,国旗在上升到固定时间时,按上升键不起作用;国旗在下降到时,按下降键不起作用。
4.升降旗的时间均为43秒,升国旗时,电机顺时针转动到时间最大值;降国旗时,电机逆时针转动到最大值
5.数字即时显示电机转动的时间,以秒为单位,误差不大于1秒。
摘要
本系统采用单片机A T89C51作为自动控制升降旗系统的检测和控制核心,采用由单片机控制的步进电机带动国旗升降,实现对国旗升降的自动控制。
该电路主要分为电机驱动控制模块、键盘与显示模块、语音模块及无线遥控电路模块等几个部分。
电机驱动控制模块采
用集成驱动芯片L298,控制与显示部分分别采用键盘作为控制和液晶RT1602C作为显示。
基于这些完备而可靠的硬件设计,使用了一套完善的软件编程,实现了自动升降旗的基本功能及发挥部分的一些功能。
关键字:步进电机自动控制液晶显示接近开关
具体设计
第 1 节系统方案论证与比较
1.1思路
题目要求设计一自动控制升降旗系统,该系统能够自动升降旗和自动升降半旗,能够在指定位置停止,升降旗的时间可在30—120秒的范围内自行调整,标准的升降旗时间与国歌演奏时间相等,即为43秒,且具有数字即时显示旗帜所在的高度和无线遥控升、降旗及停止功能。
根据题目要求由一个步进电机来控制旗帜的升降情况,由接近开关来防止旗帜在最高点或最低点停止时出现的误动作,由液晶来显示旗帜所在的高度及升降旗所用的时间,无线遥控电路使用无线发射接收模块SP,语音模块采用集成语音芯片ISD2560。
1.2 方案选择与论证
1.2.1、电机的选择与论证
方案一:采用普通的直流电机。
普通直流电动机具有优良的调速特性,调速平滑、方便,调整范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无级快速启动、制动和反转。
方案二:采用步进电机。
步进电机的一个显著特点是具有快速的启停能力,如果负荷不超过步进电机所能提供的动态转矩值,就能够立即使步进电机启动或反转。
另一个显著特点是转换精度高,正转反转控制灵活。
因为在本系统中需要精确的转换速度和转换时间且启停要迅速,所以在本设计中我们选择方案二
1.2.2、电机驱动方案的选择与论证
方案一:采用继电器对电动机的开或关进行控制,通过控制开关的切换速度实现对电机的运行速度进行调整。
这个电路的优点是电路结构简单,其缺点是继电器的响应时间长,易损环,寿命短,可靠性不是很高。
方案二:采用由达林顿管组成的H桥型PWM电路。
用单片机控制达林顿管使之工作在占空比可调的开关状态,可精确调整电动机的运动状态(前进,后退,左转,右转)。
这种
电路由于工作在管子的饱和截至模式下,效率很高。
H 桥电路保证了可以简单的实现转速和方向的控制,但不能很精确的控制步距和速度。
方案三:采用集成ULN2003A 。
在自动化密集的场合会有很多被控元件如继电器,风机,空调等,这些设备通常由CPU 集中控制,由于控制系统不能直接驱动被控元件,这与要有功率来扩展输出电流以满足被控元件的电流与电压。
而ULN2003A 功能性强、应用范围广。
所以综上所述我们采用方案三。
1.2.3、显示部分方案的选择与论证
方案一:采用LED 数码管显示旗帜所在的高度以及升降旗所用的时间。
在本系统中需要用到6只LED 数码管进行动态显示才可以达到要求。
采用LED 的优点是亮度高,醒目,价格便宜,寿命长;缺点是只能显示0~9的数字和一些简单的字符,电路复杂,占用资源较多且信息量小。
方案二:用LCD AMPIRE12864液晶显示,其优点是能显示更多的字符,工作电流比LED 小几个数量级,故其功耗低,且有着良好的人机界面,体积小,功耗极低。
基于上述考虑,所以我们选择方案二
第 2 节 电路框图设计
2.1 总体框图设计
根据设计要求,本系统可由图所示的几个部分组成:
根据设计要求,可得本系统的程序主流程图如图2-2-1
所示:本系统的控制器采用
ATMEL公司的AT89C52。
2.2 整体程序流程图
第 3 节系统的具体设计
3.1 系统的硬件设计
本系统由单片机AT89C52作为升降旗系统的控制核心,实现键盘控制、液晶显示以及无线遥控等几个部分,即该系统主要包括电机驱动模块、键盘与显示模块及晶振电路模块等几个部分。
现分别对各模块进行分析。
3.1.1、电机驱动模块
在本设计中采用ULN2003A来驱动电机。
其电路原理图如图所示。
电机驱动电路
其步进电机的控制原理为:为了准确实现可调节的时间和高度控制的匀速升降,需要精确计算在人眼不能识别的时间内的步进电机的脉冲数。
在此我们选用步距角0.9度,则走一圈所需的步数为400步,因为用于固定绳子的轴的直径为2.5cm,则平均每步拉出的线长便可计算出来约为L=0.0234cm,在整个上升或下降过程中,high为总高度,可通过公式计算出在此段距离中步进电机需走的步数,即为,步进电机要转动的总步数:总步数=高度(high)
/0.0234, 在此,时间可调时间间隔为1s。
3.1.2、键盘与显示模块
在本设计中使用了四个按键,分别用来控制升降旗和随意停止及其复位,时间的调节,其键盘摸板如图,显示部分采用液晶LCD AMPIRE12864,因为在本设计中只要求显示时间与汉子字符,其键盘与显示模块的电路原理图如图所示。
图3-1-2 键盘摸板
键盘与显示电路
3.2 系统的软件设计
整个系统的主要任务是执行升降旗、时间调整两种运动。
主体软件电路图:
此电路包括按键控制部分、单片机控制部分、步进电机驱动控制电路部分。
电路采用AT89C52单片机作为控制系统的核心。
单片机通过对按键的扫描,识别出外部命令,并通过I/O口输出的具有时序的方波作为步进电机的控制信号,信号经过驱动电路来驱动步进电机运转。
当按上升键时,步进电机正转;当按下降键时,步进电机反转;按停止键时,步进电机停转
第 4 节结论
本系统的特色:本设计在硬件上,使用了步进电机控制和利用接近开关实现停止的双重保险,在软件上,利用C语言的简单精练特点,实现起来更加简单,现将题目要求指标及系统实际性能列表如下:
第 5 节心得
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
作为二十一世纪的大学来说单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了许多在书本上所学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是重要要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这次设计也让我发现自己的知识严重不足,所以一定要不断充实自己的知识。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。
同时,在老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献:
[1] 扬立,微型计算机原理与接口技术[M].北京.中国铁道出版社.2008
[2] 陈伯时,电力拖动自动控制系统[M].北京.机械工业出版社.2009
[3] 莫正康,电力电子应用技术[M].北京.机械工业出版社.2007
[4] 赵瑞林,单片机原理与应用教程[M].北京.北京大学出版社.2005[1]
[5] 张旭涛,单片机原理与应用[M].北京.北京理工大学出版社.2008
[6] 赵建领,51单片机开发与应用技术详解[M].北京.电子工业出版社.2009
[7] 康维新,MCS-51单片机原理与应用[M].北京.中国轻工业出版社.2009
[8] Yokogawa.Models UT550/UT520 Digital Indicating Controllers Users
Manunal.Tokyo.Yokogawa.2003
[9] 陈爱萍,何智勇,羊四清,电子显示屏的单片机控制系统[M].北京.自动化与仪表
[J].1999(7):54~57
[10] 楼然苗,李光飞,51系列单片机设计实例[M].北京.北京航空航天大学出版社.2003
[11] 卢艳君,单片机原理与应用[M].北京.机械工业出版社.2008
[12] Kavanagh R C. Improved Digital Tachometer with Reduced Sensitivity to Sensor
Nonideality. IEEE Trans.Ind. Elect ron. , 2000 ,47 (4) : 890 – 897
[13] Prokin M. Ext remely Wide range Speed Measurement Using a Double2buffered Method.
IEEE Trans. Ind. Electron. , 1994 ,41 (5) :550 – 559
[14] 吴丙申,卞祖富,模拟电路基础[M].北京.北京理工大学出版社.2007
[15] 李响初, 数字电路基础与应用[M].北京.机械工业出版社.2008
附录
材料清单
LCD AMPIRE12864
AT89C52
BUTTON
CAP
CAP-ELEC
CRYSTAL
MOTOR-STEPPER
POT-HG(主要用于调节液晶屏的背光) RES
RESPACK-8
UNL2003A
部分程序
#include<reg52.h>
#include<intrins.h>
#include<source.h>
#include<LCD12864.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY2=P3^0;
sbit KEY3=P3^1; //三个按键控制口char min,sec,tt=0,flag=0;
int num=0; //相序存放处
bit dir=1; //方向标志(默认为顺时针)
uchar code forward[]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};//正转uchar code reveser[]={0x0e,0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c};//反转
void delay(uint i)
{
while(--i);
}
void key_scan(void)
{
if(KEY2==0) //按键2按下,升旗
{
delay(5000);
if(KEY2==0)
{
while(!KEY2);
ClearScreen(0);
flag=1;sec=0;min=0;dir=1;
TR0=1; TR1=1; //启动定时器
Display_HZ(1,0,3,sheng);
Display_HZ(2,0,0,qi);
Display_SZ(1,4,32,0);
Display_SZ(1,4,40,0);
Display_HZ(1,4,3,fen);
Display_SZ(2,4,0,4); // 屏(1左2右) 页(0 2 4 8)列(0 1 2 3)
Display_SZ(2,4,8,3);
Display_HZ(2,4,1,miao);
}
}
if(KEY3==0) //按键3按下,降旗
{
delay(5000);
if(KEY3==0)
{
while(!KEY3);
ClearScreen(0);
flag=2;sec=0;min=0;dir=0;
TR0=1; TR1=1; //启动定时器
Display_HZ(1,0,3,jiang);
Display_HZ(2,0,0,qi);
Display_SZ(1,4,32,0);
Display_SZ(1,4,40,0);
Display_HZ(1,4,3,fen);
Display_SZ(2,4,0,4); // 屏(1左2右) 页(0 2 4 8)列(0 1 2 3)
Display_SZ(2,4,8,3);
Display_HZ(2,4,1,miao);
}
}
}
void main()
{
init_LCD(); //初始12864
ClearScreen(0); //清屏
Set_line(0); //显示开始行
EA=1; //开启总中断
IT0=1;
EX0=1;
ET0=1; //允许定时器0中断
ET1=1;
TMOD=0x11; //设置定时器工作方式1 16位计数
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-60000)/256;
TL1=(65536-60000)%256;
TR0=0; //启动定时器
TR1=0;
Display_HZ(1,0,2,kai);
Display_HZ(1,0,3,shi);
Display_HZ(2,0,0,sheng);
Display_HZ(2,0,1,qi); //上电显示:“开始升旗”
Display_SZ(1,4,32,0);
Display_SZ(1,4,40,0);
Display_HZ(1,4,3,fen);
Display_SZ(2,4,0,4); // 屏(1左2右) 页(0 2 4 8)列(0 1 2 3)Display_SZ(2,4,8,3);
Display_HZ(2,4,1,miao);
while(1)
{
if(tt==20) //1秒时间到
{
tt=0; //把重新赋值为0 等待下一秒(tt=20)
sec++; //
if(sec==60)
{
min++;
sec=0;
}
}
if(min==0&&sec==43)
{
TR0=0;TR1=0;
Display_HZ(1,0,2,yi);
Display_HZ(1,0,3,shii);
Display_HZ(2,0,0,wan);
Display_HZ(2,0,1,bi); //上电显示:“开始升旗”
}
if(flag==1) //升旗计时显示
{
Display_SZ(1,6,32,min/10);
Display_SZ(1,6,40,min%10);
Display_HZ(1,6,3,fen);
Display_SZ(2,6,0,sec/10); // 屏(1左2右) 页(0 2 4 8)列(0 1 2 3)
Display_SZ(2,6,8,sec%10);
Display_HZ(2,6,1,miao);
}
if(flag==2) //降旗计时显示
{
Display_SZ(1,6,32,min/10);
Display_SZ(1,6,40,min%10);
Display_HZ(1,6,3,fen);
Display_SZ(2,6,0,sec/10); // 屏(1左2右) 页(0 2 4 8)列(0 1 2 3)
Display_SZ(2,6,8,sec%10);
Display_HZ(2,6,1,miao);
}
key_scan();
}
}
void key() interrupt 0 //定时器0中断服务程序
{
TR0=!TR0;
TR1=!TR1;
}
void timer0() interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
void timer1() interrupt 3 //定时器1中断服务程序
{
TH0=(65536-60000)/256;
TH0=(65536-60000)/256;
if(num>=8) num=0;
if(dir==1) P1=forward[num++]; //正转
else P1=reveser[num++]; //反转}。