毕业设计伍建华.docx
《毕业设计伍建华.docx》由会员分享,可在线阅读,更多相关《毕业设计伍建华.docx(17页珍藏版)》请在冰点文库上搜索。
毕业设计伍建华
毕业设计(论文)
标题:
数字转速计的设计
学生姓名:
伍建华
系部:
汽车电子系
专业:
应用电子技术
班级:
电子1001
指导教师:
欧阳斌武
目录
第1章序言3
第2章工作原理和设计思路及方案5
2.1基本原理5
2.2设计思路5
2.3设计方案5
第3章硬件电路设计7
3.1按键设计电路图7
3.2显示电路设计图7
3.3脉冲产生电路设计图8
第4章软件设计8
4.1主程序流程及说明9
4.2中断服务子程序9
4.3键盘扫描程序10
第5章系统调试及软件仿真11
5.1程序调试11
5.2硬件电路调试12
第6章总结13
参考文献14
附录15
系统原理图:
15
程序清单:
15
第1章序言
随着科学技术特别是微型计算机技术的高速发展,单片微机技术也获得了飞速发展。
目前,单片机已经在日常生活和控制领域等方面得到广泛的应用,它正为我国经济的快速发展发挥着举足轻重的作用。
作为自动化专业的一名工科学生应该牢牢掌握这一重要技术。
而课程设计这一环节是我们提高单片机应用能力的很好机会,也是我们学好这一课程的必经环节。
通过课程设计可以进一步巩固我们前面所学理论知识,使我们对单片机理论知识有一个深刻的认识和全面的掌握。
另外通过这一真正意义上的实践活动,我们可以从中发现自己不足之处并能够在自己的深思下和老师的指导下得到及时的解决。
再次,它能使我们的应用能力和科技创新能力得到较大的提高。
本课程设计是单片机系统在测速方面的简单应用。
目前单片机技术已经在电机转速等为控制对象的控制系统中得到了广泛的应用,而在这一控制过程中必须通过单片机来测量转速。
本课程设计利用89C51单片机及外围电路来设计一个数字转速表。
通过测量转速所对应的方波脉冲来测量转速,,同时其具体数值也可以在LED上显示出来。
单片机作为嵌入式微控制器在工业测控系统,智能仪器和家用电气中得到广泛应用。
虽然单片机的品种很多,但MCS-51系列单片机仍不失为单片机中的主流机型。
本课程以MCS-51系列与其特点是由浅入深,注重接口技术和应用。
机电一体化是当今制造技术和产品发展的主要倾向,也是我国机电工业发展的必由之路。
可以认为,它是用系统工程学的观点和方法,研究在机电系统和产品中如何将机械、计算机、信息处理和自动控制技术综合应用,以求机电系统和产品达到最佳的组合。
机电一体化产品所需要的是嵌入式微机,而单片机具有体积小、集成度高、功能强等特点,适于嵌入式应用。
智能仪器、家用电器、数控机床、工业控制等机电设备和产品中竟相使用单片机。
第2章工作原理和设计思路及方案
2.1基本原理
本次课程设计用STC89C52作为主控器组成一个转速表。
电机转速采用光电脉冲传感器来测量,通过设置定时器/计数器T0为1S,设置定时器/计数器T1为计数器对光电传感器传过来的脉冲进行计数,电动机测速采用测周法,即每旋转一周产生一个脉冲,则设在1s内测量的脉冲个数为n,故测到转速n就是脉冲频率,再乘以60就是电动机的转速,单位为r/min。
在此期间定时1s,在1s内允许中断,每中断一次,软件计数器加1,1s后,关闭中断,则软件计数器即为1s内的脉冲数,通过计数一定时间内通过定时器的脉冲数通过软硬件结合工作即可测出电机的转速。
2.2设计思路
为了确定其设计方案,首先必须构思好初步的设计思路。
根据设计要求和实验仿真条件,初步的设计思路可以总结如下:
(1)当前转速与电动机的状态显示用4段LED数码管。
(2)键盘采用独立式键盘,需要3个键。
(3)采样时间用定时/计数器0来实现。
(4)用定时/计数器1来统计采样时间内的脉冲数,进而计算转速。
2.3设计方案
根据设计要求和设计思路,可以确定该系统的设计方案,图1为该系统设计的硬件电路设计框图。
硬件主要由三部分组成,即单片机、键盘、LED显示器。
单片机采用STC89C52。
要求测量的脉冲直接用另一个单片机产生提供。
在单片机中,定时功能既可以由硬件(定时/记数器)实现,也可通过软件定时实现。
硬件定时是利用单片机内定时器定时,启动以后定时器可与CPU并行工作,不占用CPU时间,CPU有较高的工作效率。
采用硬件定时和软件定时并用的方式,即用T0溢出中断功能实现50ms定时,通过软件延时程序实现1s定时。
定时器的TMOD用于设置定时器/计数器的工作方式0~3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
硬件电路设计如图2.1所示。
图2.1硬件电路设计
第3章硬件电路设计
3.1按键设计电路图
对于按键电路的设计可以有2种方式:
一种方式是直接按键设计,也称独立按键,这种设计电路适用于按键较少的控制,具有按键电路简单,编程方便等优点;另一种方式是矩阵式键盘的设计,它适用于对控制按键较多的电路控制,占用较少的I/O接口,但是按键电路复杂,编程比较复杂。
本课题总共需要3按键,所以采用独立按键设计。
设计图如3.1.1:
由上到下的按键分别是复位、停止、启动。
图3.1.按键电路
3.2显示电路设计图
本课题所采用得是由LED(数码管)作为显示电路,用以显示由单片机所接收的脉冲转换来的BCD码,以及开始测速时的各种状态。
硬件电路连接是单片机P0.0~P0.7接数码管的由A~G、DP8个各管脚,P2.0~P2.3接数码管的控制端W4、W3、W2、W1采用共阳极连接的方法连接图如图3.2.1所示。
图3.2显示电路
3.3脉冲产生电路设计图
在实际做试验是由另一块单片机产生脉冲,在本次设计中我让另一块单片机输入1Hz频率的脉冲,并把脉冲接到现实的单片机的P3.5口进行计数。
图3.3脉冲电路
第4章软件设计
4.1主程序流程及说明
本次设计用T0做定时器定时时间为50ms、T1作计数器,都设置为工作方式一。
在主程序钟通过先重装初值,然后再检测按键,根据按键的状态和定时器的状态调用相应的子程序。
程序流程如图4.1所示
图4.1主程序流程图
4.2中断服务子程序
当定时器的50MS的定时时间到时,假如计数值大于20次就改变定时器的状态位并清定时器的计数值。
图4.2中断程序流程图
4.3键盘扫描程序
数字转速表的键盘操作应具有3个功能,即:
启动、停止、复位。
本次采用的是直接连接的独立式按键,在键盘扫描过程中必须解决以下问题:
1、是否有键按下;2、是哪一个键按下;3是不是有抖动;4、按键是不是松开。
故在程序应该注意以上问题,不然会产生问题,不能正确的对按键进行识别。
图4.3为键盘流程图:
图4.3按键流程图
第5章系统调试及软件仿真
5.1程序调试
试验所涉及的2个软件KeiluVsion2和proteus,以下是仿真步骤。
程序调试部分:
uVsion2先新建一个工程,选择芯片为AT89C52然后点击是,然后弹出是否加入标准启动文件,点击否,再新建一个文件,保存为“文件名.C”。
然后点开工程窗口的Target右键单击出现弹出菜单,选择添加文件到工程,选到刚才新建的文件然后点击OK,输入程序,点击工程选择,选中Output中的CreatHexFile,然后编译,连接生成Hex文件,有错误修改后再编译链接。
当编译结果中没出现错误时证明该程序已不存在语法错误。
是否能完成课题所要求的功能则需要进行仿真。
仿真部分:
运行proteus的ISIS后进入仿真界面将所需元件选择好,根据原理图画出仿真图,待仿真图换好后双击AT89C52导入KeiluVsion2所产生的后缀名为.HEX文件,按开始键进行仿真。
当输入脉冲为6HZ时输出为360rad/min。
5.2硬件电路调试
硬件调试的步骤如下:
接通电源和数据线,通过软件将在KeiluVsion2中生成的HEX文件下载到单片机板子上,先对板子关电当显示请上电时按下单片机上的电源开关按钮上电下载程序到单片机中,通过按键和LED的显示进行调试。
当程序下载完之后,按下电源开关,LED上显示初始状态,按下启动键显示接收数据的状态,按下停止键后显示当前所记录的数据,按下复位键则显示初始状态,关闭所有数码管,为全黑状态。
第6章总结
回顾起此次课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说三极管PNP管脚不懂怎么放置,不懂分得二极管的正负极,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次的课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在欧阳老师的辛勤指导下,终于迎刃而解。
同时,在欧阳老师的身上我学得到很多实用的知识,在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢。
参考文献
[1]周向红,刘国繁.51系列单片机应用与实践教程.北京航空航天大学出版社,2008
[2]王迎旭.单片机原理及应用.机械工业出版社,2010
[3]张毅刚.新编MCS-51单片机应用设计,哈尔滨工业大学出版社,2003
[4]何立民.编单片机应用系统设计.北航出版社,2000
[5]刘国荣.单片微型计算机技术.机械工业出版社,1996
[6]张迎新.单片微型计算机原理、应用及接口技术.国防工业出版社,1993
[7]房小翠.编单片机实用系统设计技术.国防工业出版社,1999
[8]何立民.编单片机应用系统设计.北航出版社,2005
[9]曹琳琳.编单片机原理及接口技术.国防科技大学出版社,2000
附录
系统原理图:
程序清单:
#include//头文件
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
ucharcodetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳数码管代码0-F
uintCount=0;//定时器中断的次数
uintKey_State,T_State;//定义键的状态和定时器的状态
intsecond=0;//定时器1在1S内计数的次数
sbitStop=P3^0;//停止
sbitReset=P3^1;//复位
sbitkey=P3^2;//启动
voiddelay(uintms)//延时子程序
{
uinti;
while(ms--)
for(i=0;i<120;i++);
}
voidDisplay()//显示子程序
{
P2=0xFE;//显示个位
P0=Tab[second%10];
delay(5);
P2=0xFD;//显示十位
P0=Tab[second%100/10];
delay(5);
P2=0xFB;//显示百位
P0=Tab[second%1000/100];
delay(5);
P2=0xF7;//显示千位
P0=Tab[second/1000];
delay(5);
}
voidScan_Key()//键盘扫描子程序
{
if(key==0)//启动功能键被按下
{
delay(10);//去抖
if(key==0)//启动键被按下
{
if(Key_State==0|Key_State==3)//假如键状态为0或3
{
TR0=1;//开启定时器/计数器0
TR1=1;//开启定时器/计数器1
Key_State=1;//把键状态设为1
}
while(!
key);//等待启动键释放
}
}
if(Stop==0)//复位键被按下
{
delay(10);//延时去抖
if(Stop==0)//停止键被按下
{
if(Key_State!
=2)//键状态不为2
{
Key_State=2;//状态设为2
TR0=0;//关闭定时器/计数器0
TR1=0;//关闭定时器/计数器1
}
while(!
Stop);//等待复位键释放
}
}
if(Reset==0)//停止键被按下
{
delay(10);//延时去抖
if(Reset==0)//停止键确实被按下
{
if(Key_State!
=3)//键状态为不3
{
Key_State=3;//键状态设为3
TR0=0;//关闭定时器/计数器0
TR1=0;//关闭定时器/计数器1
}
while(!
Reset);//等待停止键释放
}
}
}
voidmain()//主函数
{
TMOD=0x51;//定时器1和0都工作在方式1
TH0=(65536-50000)/256;//定时器0装入初值
TL0=(65536-50000)%256;
TH1=0;//定时器1装入初值
TL1=0;
EA=1;//开放总中断
ET0=1;//开放定时器/计数器0中断
ET1=1;//开放定时器/计数器1中断
TR0=0;//关闭定时器/计数器0
TR1=0;//关闭定时器/计数器1
P2=0xff;//关闭数码显示管
while
(1)
{
Scan_Key();//调用键盘扫描子程序
if(T_State==1&&Key_State==1)//键状态为1且定时器状态为1
{
T_State=0;//把定时器状态清0
second=(TH1*256+TL1)*60;//计算转速
TH1=0;//清计数器
TL1=0;
}
if(Key_State==1|Key_State==2)//键状态为1或2
Display();//调用显示子程序
if(Key_State==3)//键状态为3
P2=0XFF;//关闭显示
}
}
voidT0timer()interrupt1//定时器0用于定时
{
TH0=(65536-50000)/256;//重装初值
TL0=(65536-50000)%256;
Count++;//计数值加1
if(Count>=20)//计数值到了20次,即1S就清0,并把定时器状态设为1
{
Count=0;
T_State=1;
}
}
voidT1timer()interrupt3//定时器1用于计数
{
TH1=0;//重装初值
TL1=0;
}