自动控制升降旗装置课程设计报告.docx

上传人:b****7 文档编号:25528049 上传时间:2023-06-09 格式:DOCX 页数:29 大小:545.94KB
下载 相关 举报
自动控制升降旗装置课程设计报告.docx_第1页
第1页 / 共29页
自动控制升降旗装置课程设计报告.docx_第2页
第2页 / 共29页
自动控制升降旗装置课程设计报告.docx_第3页
第3页 / 共29页
自动控制升降旗装置课程设计报告.docx_第4页
第4页 / 共29页
自动控制升降旗装置课程设计报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

自动控制升降旗装置课程设计报告.docx

《自动控制升降旗装置课程设计报告.docx》由会员分享,可在线阅读,更多相关《自动控制升降旗装置课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。

自动控制升降旗装置课程设计报告.docx

自动控制升降旗装置课程设计报告

湖南人文科技学院

课程设计报告

课程名称:

单片机原理及应用课程设计

 

设计题目:

自动控制升降旗装置

系别:

通信与控制工程系

专业:

通信工程

指导教师评语:

 

指导教师签名:

年月日

成绩评定

项目

权重

成绩

邓晓雄

王成

胡楚煊

1、设计过程中出勤、学习态度等方面

0.2

2、课程设计质量与答辩

0.5

3、设计报告书写及图纸规范程度

0.3

总成绩

教研室审核意见:

 

教研室主任签字:

年月日

教学系审核意见:

 

主任签字:

年月日

摘要

本系统采用单片机STC89C52作为自动控制升降旗系统的检测和控制核心,采用由单片机控制的步进电机带动国旗升降,实现对国旗升降的自动控制。

该电路主要由电机驱动控制模块、键盘与显示模块及语音模块几个部分组成。

电机驱动控制模块采用集成驱动芯片ULN2003L,采用键盘作为输入控制和数码管作为输出显示,语音模块采用报警蜂鸣器(LS)电路。

关键字:

步进电机;自动控制;语音;数码管显示;按键

 

 

自动控制升降旗装置

设计要求

基本部分:

1).按下上升按键后,旗帜匀速上升,同时流畅地播放歌曲,上升到最高端时自动停止上升,歌曲停奏;按下下降按键后,旗帜匀速下降,降旗的时间不放歌曲,下降到最低端时自动停止;

2).旗帜在最高端,上升按键不起作用;在最低端时,下降按键不起作用;

3).升降旗的时间均为43秒,与国歌的演奏时间相等;

4).即时显示旗帜所在的高度,以CM为单位,误差不大于2CM。

发挥部分:

1).重新合上电源后,所显示的旗帜高度数据不变;

2).要求升降旗的速度可调整,调整范围是30—120秒钟,步进1秒(除43秒

外,其他时间可与国歌不同步);

3).在最高升降速度下(以自选的电机参数定),能在指定的位置上自动停止,

定位误差≤±2CM。

1方案选择与论证

1.1电机的选择与论证

方案一:

采用普通的直流电机。

普通直流电动机具有优良的调速特性,调速平滑、方便,调整范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无级快速启动、制动和反转。

方案二:

采用步进电机。

步进电机是纯粹的数字控制电动机,它将电脉冲转化为角位移,即一脉冲,电机就转动一角度,因此很适合单片机控制。

步进电机的一个显著特点是具有快速的启停能力,如果负荷不超过步进电机所能提供的动态转矩值,就能够立即使步进电机启动或反转。

另一个显著特点是转换精度高,可以通过步数实现精确定位,可正转反转控制灵活。

综上所述,我们选用方案二。

1.2电机驱动方案的选择与论证

方案一:

采用继电器对电动机的开或关进行控制,通过控制开关的切换速度实现对电机的运行速度进行调整。

这个电路的优点是电路结构简单,其缺点是继电器的响应时间长,易损环,寿命短,耗电流,不能很好的驱动步进电机,可靠性不是很高。

方案二:

采用由达林顿管组成的H桥型PWM电路。

用单片机控制达林顿管使之工作在占空比可调的开关状态,可精确调整电动机的运动状态(前进,后退,左转,右转)。

这种电路由于工作在管子的饱和截至模式下,效率很高。

H桥电路保证了可以简单的实现转速和方向的控制,但不能很精确的控制步距和速度。

方案三:

采用ULN2003驱动。

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。

所以综上所述我们采用方案三。

2自动控制升降旗整体电路设计

2.1整体电路原理

系统整体电路原理框图如图1所示:

图1总体电路框图

3单元电路设计

3.1步进电机电路的设计

根据设计要求,我们采用了步进电机的准确步进来控制旗杆的升降,电路图如图3所示:

图3步进电机原理图

步进电机是数字控制电机,不同于直流电机。

它将脉冲信号转变为角位移,即给一个脉冲信号,步进电机就转动一个角度,非常适合单片机控制。

工作原理如下:

(1)控制换相顺序

通电换相这一过程称为脉冲分配。

例如:

三相步进电机的六拍工作方式,其各相通电顺序为A-AB-B-BC-C-CA-A,通电控制脉冲必须严格按照这一顺序分别控制A,B,C各相得通断。

(2)控制步进电机的转向

如果给定工作方式正序换相通电,电机正转,如果按反序通电换相,电机就反转。

(3)控制步进电机的速度

如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它就会再转一步。

两步脉冲的时间间隔越短,步进电机就转的越快。

调整单片机发出的脉冲频率,就可以对步进电机进行调速。

步进电机步序表如表1所示:

表1步进电机步序表

步序

C4

C3

C2

C1

ULN2003输出

单片机输出

1

0

0

0

1

0x01

0x0e

2

0

0

1

1

0x03

0x0c

3

0

0

1

0

0x02

0x0d

4

0

1

1

0

0x06

0x09

5

0

1

0

0

0x04

0x0b

6

1

1

0

0

0x0c

0x03

7

1

0

0

0

0x08

0x07

8

1

0

0

1

0x09

0x06

如果按步序1-->步序8输出数据,步进电机正转,按步序8—>步序一输出数据,步进电机反转。

3.2数码管显示电路的设计

由于要求升降过程中即时显示所在高度,故采用四位数码管即可显示出来。

本试验所采用的开发板上有一排六位的数码管,每个数码管的8段是由芯片8255得PB口控制亮灭,即可得到所要显示的数字,每个数码管的公共脚分别由8255的PA0—PA5经三极管扩流后进行控制,原理图如图4所示:

图4数码管显示电路原理图

要在某位数码管上显示一个数字,首先把待显示数字的显示码送给8255的PB口,接着选中要显示的位。

例如:

要在开发板的最左边的数码上显示一个‘0’,则需要先把‘0’得显示码0xc0送8255得PB口,接着PA0赋‘0’(低电平),随后让单片机保持这个值不变。

3.3音乐发声电路的设计

为了在升旗得过程中同步放出国歌的音乐,本实验采取蜂鸣器来奏响国歌。

单片机的P33引脚用来控制蜂鸣器的工作,当P33输出高电平时,蜂鸣器不工作。

当P33引脚输出低电平时,三极管导通,蜂鸣器工作,同时二极管发光。

蜂鸣器音乐电路如图5示:

图5音乐发声电路

3.4矩阵4X4键盘电路的设计

本实验中用来控制的功能比较多,故采取按键控制的方法来实现控制功能。

电路如图6示:

图6矩阵4X4键盘电路

矩阵式键盘的按钮识别办法可以确定矩阵式键盘上何键被按下,采用的方法之一为“行扫描法”。

行扫描法又称为逐行(或列)扫描查询法,是一种最常见的按钮识别方法,键盘如上所示。

具体实现过程如下:

判断键盘中有无键按下。

将全部行线置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键低于低电平线与4根行线交叉的4个按钮之中。

若所有列线均为高电平,则按键中无键按下。

判断闭合键所在的位置:

在确认有键按下的情况下,即可进入确定具体键的过程。

操作是:

依次将行线置为低电平,即在置某根行线为低电平时,其他线为高电平。

在确定某根行线为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该线与置为低电平的行线交叉处的按钮就是闭合的按钮。

3.5外部ROM存储器电路设计

由于设计要求要掉电后将数据保存,即重开电源后单片机要从上次掉电前得状态继续执行,故采取I2C总线形式挂载外部程序存储器来存储掉电前得数据。

原理图如图7所示:

图7外部ROM存储器电路

I2C总线是一种用于IC器件之间连接的二进制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:

不管是单片机、存储器、LCD驱动器还是键盘接口。

AT24C08是低功耗的CMOS串行EEPROM,内含256*8位存储空间,工作电压宽,擦写次数多,写入速度快等特点。

本设计中24C08的1、2、3脚是三条地址线,用于确定芯片的硬件地址。

在开发板上均接地,第8脚和第4脚分别接正、负电源。

第5脚SDA为串行数据输入输出,数据通过这条I2C总线串行传送,与单片机的P27连接。

第6脚SCL为串行时钟输入线与单片机的P26连接。

SDA与SCL都需要和正电源间各接一个2K的上拉电阻。

第7脚需接地。

4自动控制升旗装置软件设计

4.1系统总程序流程图

系统工作总程序流程图如图8所示:

图8整体程序流程图

4.2步进电机转动的软件设计

步进电机是一种将电脉冲转化为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

其工作流程图如图9所示:

图9步进电机程序流程图

此次设计中,采用的为四相八拍的步进电机控制方式。

代码中,先定义了要用到的步进电机正转和反转的时序数组,以使后面的程序能够随时更改电机接收到的脉冲时序,以达到实时地控制电机的正转和反转,从而实现旗帜的上升与下降。

更改脉冲时序的条件由所按下的键盘按键决定,所以可以实时地更改脉冲的时序,达到实时地控制电机转动方式。

4.3数码管实时显示的软件设计

数码管显示的部分硬件上是通过8255扩展I/O芯片实现控制,且采用的为动态数码管显示的方法,也就是六要数码管共用的为一个八位数据线。

上面函数的功能为在指定的数码管上显示指定的数字。

实际中要显示的数字不只有一位,所以必须在人的视觉停留的时间内,即1/12秒的时间内,把所有要显示的数码管全部点亮,才能给人感觉像是所有数码管同一时刻全部点亮了。

数码管工作流程图如图10所示:

图10数码管子程序流程图

4.4国歌音乐的软件设计

音乐功能主要在两个中断中完成;定时器0中断主要输出一定频率的方波,定时器1中断完成音长的控制,在完成特定音符的音长后读取下一个音符,并且更新定时器0的初始设置值。

演奏时,要根据音符的不同把对应半周期的定时时间初始值送入定时器T0,再由定时器T1按时输出高低电平,定时器控制音乐程序流程图如图11所示:

图11定时器T0、T1控制音乐子程序流程图

4.5矩阵键盘实时控制软件设计

本次设计采用的为4X4矩阵键盘,这种键盘是由16个按键组成的开关矩阵。

其程序流程图如图12所示,程序中用来识别用户按下的按键采用的方式为动态扫描的方式,即分别对矩阵进行行扫描,再进行列扫描即可得到识别按键所需的两个坐标值,在程序中定义全局变量test_x,test_y用来存储键盘扫描得到的值。

个体的程序设计中,因为实时控制电机的转动,音乐的开关均以用户按下的按键为基准,故程序中多次要用到键盘扫描,所以将键盘扫描程序抽象出来形成一个单独的函数scanKeyboard(),提高编码效率。

图12键盘程序流程图

4.6外部ROM实时访问的软件设计

因为RAM存储器的掉电易失性,而要达到掉电保存数据的效果,就必须将要保存的数据写到ROM中。

本次设计中,采用外部程序存储器24C08,采用的通讯协议为I2C串行总线方式,外部ROM程序流程图如图13所示。

具体的程序设计中,将主要对存储器的操作抽象为两个函数以供调用,即存储器写函数Write24c02(uintch,ucharaddress),功能为每一次写一字节到指定的存储器地址上,存储器读函数Read24c02(ucharaddress),功能为读出指定地址上的一个字节。

图13外部ROM程序流程图

5详细仪器清单

表格1仪器清单

仪器名称

数量

STC89C52芯片

1

8255A芯片

1

ULN2003L

1

步进电机

1

七段LED数码显示器

6

按键

16

6总结与思考及致谢

本系统采用单片机STC89C52作为自动控制升降旗系统的检测和控制核心,采用由单片机控制的步进电机带动国旗升降,通过用按生键来实现对国旗升降的自动控制,最终与实践相结合的升降旗系统,实现单片机与人们活的密切应用。

做本设计,深刻的体会到,要把各功能模块搞懂才能达到各硬件的融合,达到硬件和软件的结合。

软件设计中,由于汇编的繁琐性,本系统采用C来编写程序,其实C是每一条语句可转化为汇编,汇编是更接近硬件的语言,写汇编可以对单片机的实际操作有更好的理解,故有时间可以尝试写“双语”。

感谢学校能给我们这次机会,让我们有一个发挥自己的平台,让我们把从课本学到的知识用到实际生活当中,从中得到锻炼。

在系统设计过程中,刘老师、方老师、谭老师、周老师等提出了许多宝贵的意见,在此深表感谢!

同时得到了在校老师和同学们的支持与帮助,在此表示感谢!

参考文献

[1]朱定华,戴汝平.单片微机原理与应用(M).北京:

清华大学出版社.2003

[2]张鑫.单片机原理及应用(M).电子工业出版社.2009

[3]彭秀华.单片机高级语言c51Windows环境编程与应用(M).电子工业出版社2001

[4]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(M).北京:

理工大学出版社.2003年

[5]彭为.单片机典型系统设计实例精讲(M).电子工业出版社.2005

[6]沈庆阳.8051单片机实践与应用(M).清华大学出版社.2002

[7]张立科.单片机典型模块设计实例导航(M).北京:

人民邮电出版社.2004

[8]陈涛.单片机应用及c51程序设计(M).机械工业出版社.2007

 

附录一:

系统程序代码

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeFFW[8]={0x75,0x65,0x6d,0x4d,0x5d,0x1d,0x3d,0x35};//步进电机正转数组

ucharcodeREV[8]={0x35,0x3d,0x1d,0x5d,0x4d,0x6d,0x65,0x75};//步进电机反转数组

//setflag用标志定位是否有效test_x,test_y用于定义16个按键中的任一个

uchartest_x=10,test_y=10,setflag=0;

ucharsetfalse=0;

uintcounter=0;//用于定义每隔多少个脉冲数码管上数字自增

//定义四个变量分别存储四个要显示的数位的值four显最高位第四位的值,依此类推

uintsum=0,four=0,three=0,two=0,one=0;

uintfour_max=0,three_max=0,two_max=0,one_max=0;//定义四个变量,用来定位停止

//音乐模块用到的些定义常量,变量,数组

unsignedcharvolatileFlagBeat;//基本节拍单位计数变量

unsignedintvolatileFreqTemp;

unsignedcharvolatilemusic_temp;//暂时存放从MusicTable数组中读出的变量

unsignedcharvolatilebeat;

unsignedcharvolatilefreq;//简谱码对应T值数组的下标

unsignedcharvolatile*pmusic;

sbitPin_Buzzer=P3^3;

//串行外存定义的量

#defineWriteDeviceAddress0xa0//定义器件在IIC总线中的地址

#defineReadDviceAddress0xa1

sbitSCL=P2^6;

sbitSDA=P2^7;

unsignedcharx1,x2,x3;

unsignedintcodeFreqTab[]={//简谱对应的简谱码、T值

65535,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030};

unsignedcharcodeMusicTable[]={//音符节拍码

0x52,0x84,0x02,0x82,0x82,0x01,0x81,0x52,0x61,0x71,0x84,0x84,0xa2,0x82,0x91,0xa1,0xc2,0x01,0xc1,0xc4,0xa2,0x01,0xa1,0x82,0x01,0xa1,0xc2,0x01,0xa1,0x94,0x94,0x04,0xd4,0xc4,0x94,0xa4,0xc2,0xa4,0xc2,0xa2,0x91,0xa1,0x82,0x01,0x91,0xa4,0xc2,0x01,0x61,0x82,0xa2,0x01,0xa1,0xc2,0x01,0xc1,0x92,0x92,0x92,0x62,0x01,0x61,0x94,0x02,0x52,0x84,0x02,0x82,0xa4,0x02,0xa2,0xc4,0x04,0xc4,0x04,0x82,0x01,0xa1,0xc2,0x01,0xc1,0xd4,0xc4,0xa2,0x01,0x81,0xc2,0xc2,0xc2,0xa2,0x82,0x54,0x84,0x32,0x01,0x81,0xc2,0xc2,0xc2,0xa2,0x82,0x54,0x84,0x54,0x84,0x54,0x84,0x84,};

unsignedcharconstdis_table[16]={

0xA0,/*0*/

0xBB,/*1*/

0x62,/*2*/

0x2A,/*3*/

0x39,/*4*/

0x2C,/*5*/

0x24,/*6*/

0xBA,/*7*/

0x20,/*8*/

0x28,/*9*/};

voidDelayMs(unsignedintnumber){

unsignedchartemp;

for(;number!

=0;number--){

for(temp=112;temp!

=0;temp--);}}

//开始总线

voidStart(){SDA=1;SCL=1;SDA=0;SCL=0;}

//结束总线

voidStop(){SCL=0;SDA=0;SCL=1;SDA=1;}

//发ACK0

voidNoAck(){SDA=1;SCL=1;SCL=0;}

//测试ACK

bitTestAck(){bitErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}

//写入8个bit到24c08

Write8Bit(unsignedintinput){

unsignedchartemp;

for(temp=8;temp!

=0;temp--){

SDA=(bit)(input&0x80);

SCL=1;

SCL=0;

input=input<<1;}}

//写入一个字节到24c08中

voidWrite24c02(uintch,ucharaddress){

Start();

Write8Bit(WriteDeviceAddress);

TestAck();

Write8Bit(address);

TestAck();

Write8Bit(ch);

TestAck();

Stop();

DelayMs(10);}

//从24c08中读出8个bit

ucharRead8Bit(){

unsignedchartemp,rbyte=0;

for(temp=8;temp!

=0;temp--){

SCL=1;

rbyte=rbyte<<1;

rbyte=rbyte|((unsignedchar)(SDA));

SCL=0;}

return(rbyte);}

//从24c08中读出1个字节

ucharRead24c02(ucharaddress){

ucharch;

Start();

Write8Bit(WriteDeviceAddress);

TestAck();

Write8Bit(address);

TestAck();

Start();

Write8Bit(ReadDviceAddress);

TestAck();

ch=Read8Bit();

NoAck();

Stop();

return(ch);}

voiddelay(){//延时主要用于控制display函数执行速度,以及电机的转带

uinti=0;

for(i=0;i<20;i++);

}

voiddelaytest(){//延时主要用作按键消抖作用。

uinti=0;

for(i=0;i<25000;i++);}

//动态扫描4X4键盘,不停的扫描则可以确实按下的为哪一个按键。

voidscanKeyboard(){

uinti,j,PC_data=0;

a8255_CON=0x89;

a8255_PB=0xff;

a8255_PA=0xff;

delay();

PC_data=a8255_PC;

for(j=0;j<4;j++){

if((PC_data&(1<

for(i=0;i<4;i++){

a8255_PA=1<

delay();

PC_data=a8255_PC;

if((PC_data&(1<

test_x=i;

test_y=j;

break;}}}}}

//定时器,音乐模块的一些初始化

voidinitial(){

pmusic=MusicTable;

beat=1;

FlagBeat=0;

TMOD=0x11;//定时器0,1都工作16位计数方式

ET0=1;//允许定时器0溢出中断;

ET1=1;//允许定时器1溢出中断

EA=1;

TL1=0xF0;

TH1=0xFF;

TR1=1;

IT0=1;//外中断跳变产生中断

EX0=1;}

//数码管显示方法,在指定的place位置显示num数字。

voiddisplay(ucharplace,uintnum){

uchari=0,displ

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

当前位置:首页 > 考试认证 > IT认证

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

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