基于MCS51单片机步进电机的控制系统设计与实现_第1页
基于MCS51单片机步进电机的控制系统设计与实现_第2页
基于MCS51单片机步进电机的控制系统设计与实现_第3页
基于MCS51单片机步进电机的控制系统设计与实现_第4页
基于MCS51单片机步进电机的控制系统设计与实现_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章绪论本章简单的介绍了步进电机的发展史,步进电机在各个领域的应用。论述了研究本课题的目的和意义,最后简要的叙述了本设计控制系统需要完成的几项任务。1.1课题背景在21世纪,电动机在我们社会中扮演着十分重要的角色,无论在工业、农业还是在我们日常生活中起着重要的作用。步进电机是一种特殊的可以控制的电动机,在现代社会的额各个领域有着广泛的应用。因为步进电机具有良好的控制作用,而且是当今机械电子工程的主要构件之一。因此步进电机大量地使用在各类不同的自动化设备及控制装置等领域[[][]早期的步进电机大约出现在十九世纪三十年代左右,在通电的情况下,有一种能够自由旋转的电磁铁,就是我们所说的早期步进电机,其工作原理和现在的步进电机本质上是相同的[[]]。到了上世纪初,由于出现大规模的战争,军工业和造船业等重工业的快速发展,步进电机的需求量被无线放大。同时期的西方报纸和期刊先后刊登了大量步进电机在军工业和造船业上应用的文章,那是的文章已经详细的介绍了不进电机电的设计方法和计算等。在后来的一段时期这些理论被用于实践指导步进电机的结构设计和批量的生产[[[][]到了二十世纪八十年代后,步进电动机的控制方式开始变得更加多样化,主要原因是多用途模式的步进电机的产生。在微电子个计算机技术高速发展的情况下,直接引起了对步进电机的使用数量成爆炸式增长,在各国家的军事领域和国民经济领域都有着广泛的应用。步进电机实际上是一种将电脉冲转化为角位移的控制元件,它突出的优点是自身构造简单,具有快速的启动、停止和反转响应,运行安全可靠。步进电机还有一些非常特殊的地方,它的步距值不会随着现场温度和电压的变化而改变,同时误差亦不会长时间积累,所以给实践的操作中带来了很大的方便[[]][]1.2课题研究的目的及意义随着现代工业和农业的不断发展壮大,步进电机的使用量也成爆炸式增长。以前的步进电机的控制精度和控制效果已无法达到当今社会生产力的要求,因此如何更好的发展和应用步进电机是非常值得思考的。本课题的设计就是对步进电机进行控制,其本身就具有一些突出的优点是快速的起动、停止和反转响应;由于其采用开环控制,从而自身构造更加简易化并且成本低[[]][]1.3系统设计的主要任务设计的该控制系统应完成以下几项任务:(1)步进电机的启动和停止控制;(2)步进电机的加速和减速控制;(3)步进电机的正反转控制;(4)步进电机的转速动态显示在液晶显示器上。第二章总体方案设计2.1系统总体设计与分析本设计是使用STC89C52为控制元件,设计出一种基于单片机步进电机的控制系统。该控制系统通过自有的键盘模块来实现对步进电机的运转进行有效的控制,并且将步进电机的转速显示在液晶显示器上,转动方向以文字的形式显示在液晶显示器上。下图是系统总体结构框图。图1系统总体结构框图2.2各模块功能说明本设计控制系统有五个模块:中央处理器模块、12864液晶显示模块、步进电机驱动模块、电源模块和键盘模块。(1)中央处理器模块主要由振荡电路和复位电路构成。振荡电路是给最小系统模块提供给频率,单片机的运行速度就是一该频率为基准的,频率高单片机运行速度快。复位电路就是系统运行时在受到外部干扰,内部程序运行出错时,通过按下复位按钮可以让原程序重新开始运行,保证了单片机的正常启动[[][](2)本设计的显示模块采用12864液晶器来动态显示步进电机的转动速度和方向。(3)本世纪的进电机驱动模块选用驱动器ULN2003为步进电机提供电脉冲信号,进而驱动步进电机转动。ULN2003的输入端与单片机的P1口相连。(4)电源模块是通过整流桥将变压器降压过来的交流电压转化为直流5V供给其他四个模块。(5)本设计的键盘模块包括了控制方向按钮键、加速按钮键、减速按钮键和启停按钮键,与单片机的P3口相连,通过这些键盘按钮可以对步进电机的转动状态进行有效的控制。2.3本章小结本章首先简单的说明了该设计的思想,在控制低成本,且能完成该设计的情况下,通过综合考虑用了以STC89C52单片机作为本设计系统的控制核心元件。第三章控制系统硬件分析与设计3.1.中央处理器模块中央处理器系统就是用最少的电子元件搭建的单片机而且能够正常工作的系统,其最小系统包括了单片机,复位电路、振荡电路和外部扩展等部分组成。中央处理器模块电路图如下:图2中央处理器模块电路图3.1.1单片机(1)概述单片机也就是微型处理器,世界上第一个位微处理器是因特尔公司研制出来的。因特尔公司的8051单片机是当时最成功的微处理器。基于这种单片机的操作系统在当代仍有使用。[[][]单片机的主要组成部分包括运算器、控制器寄存器和输入输出设备。其中运算器的功能是执行各种算术的运算和逻辑比较;控制器的功能是指令的存取以及控制CPU与和输入输出设备的数据交换。单片机相当于一个微型计算机,但是其没有计算机的外围设备[[][]单片机在各个领域都有着广泛的应用,它的发展趋势是小型化和高度集中化。8051是一款饱受好评的单片机,它生产出来之后就被大量使用。这种单片机具有明显的优越性就是其体积小、简单可靠而且性能不错。经过无数次的发展,2000年ARM退出了32位的高端单片机,但是其价格比较昂贵,没有8051性价比高。因此8051单片机一直在广泛使用这。在二十一世纪,单片机存在在各种电子器件产品中,最典型的我们周中使用的手机,电话,游戏机等,家庭的家用电器,笔记本电脑内部都有单片机。我们日常出门的交通工具汽车上就包含了几十个单片机,有的大型重工业控制系统上单片机的应用数量更多。单片机是世界上使用数量最多的处理器。(2)单片机的选择设计产品我们首先要考虑到经济性和可靠性,本设计采用STC89C52单片机足以满足我们设计的需要,其是一种单时钟的单片机,其拥有以下优点:运算速度高、功耗低、抗干扰能力强等。STC89C52的运算速度是早期8051的10倍左右。STC89C52主要特性如下:针对本系统,RAM和Flash容量足够大,有定时器中断功能能实现实时温度的采集,提供有EEPROM,可以设置掉电保护,是之前设置的温度不丢失,全双工的工作方式是的系统更加可靠。[[][](3)引脚功能说明图3单片机引脚功能图VCC:电源电压。

GND:接地。

P0口(32脚~39脚):通常被定义为数据/地址的低八位,适用于外部数据寄存器。P0口通常作为一个输入端口,使用时要接上上拉电阻。P1口(1脚~8脚):是一个输入输出的端口,每个端口可以独立控制。P2口(21脚~28脚):具有P0和P1的基本功能既可以做输入输出端口也可以做外部数据寄存器,每个端口也可以独立控制。P3口(10脚~17脚):可以作为一个输入输出端口,也可以充当单片机的一个特殊功能端口。下表是P3口个引脚功能说明如下[[][]表1.P3口引脚功能说明端口引脚功能P3.010串行输入口P3.111串行输出口P3.212外部中断0P3.313外部中断1P3.414计数器0外部输入P3.515计数器1外部输出P3.616外部数据存储器写选通P3.717外部数据存储器读选通3.1.2复位电路复位电路:其作用是把原有状态的电路初始化到一个确定的电路,单片机的复位端口接上适当的电阻和电容构成的电路就是所说的中央处理器系统的复位电路。复位电路一般包括上电复位和按键复位,本设计采用的按键复位,通过一个独立按键来手动控制电路的复位。复位电路图如下所示:图4复位电路图3.1.3振荡电路振荡电路:晶振是组成单片机系统的关键元件之一,晶振电路在单片机系统里存在着十分中重要的作用,晶振两端接在单片机的XTAL1和XTAL2引脚上。单片机的晶振的实质作用是给中央处理器提供时钟电路,单片机工作运行的速度与晶振提供的频率有关。本设计的晶振电路用了30pf的电容和12MH的晶体振荡器作为核心元件。振荡电路图如下:图5振荡电路图3.2显示模块本设计显示部分采用12864液晶显示器,通过各个端口的定义,在12864上动态的显示步进电机的速度和方向。显示模块电路图如下:图6显示电路模块图(1)12864的基本特性12864是128*64点阵型液晶模块的点阵数简称,因为要更人性化显示中文汉字,所以12864是最好的选择。12864液晶显示器是一种内部含有简体中文字库的点阵图形液晶显示模块。其内部设置了大量的点阵和ASCII字符集,可以完成数学、汉字和图形的显示。其串口借口引脚信号表如下[[][]表2.12864串口接口管脚信号引脚号引脚名称引脚功能1VSS电源地2VDD电源正3V0对比度(亮度)调整4RS低电平时,数据显示高电平时,指令数据显示5R/W高电平时,数据读低电平时,数据写6E使能信号7-14DB0-DB7八位数据三态线15PSB高电平时,并口方式低电平时,串口方式16NC空脚17/RESET复位端,低电平有效18VRLCD驱动电压输出端3.3驱动模块本系统设计的主要目的是为了有效的控制步进电机的转动速度个运转方向,所以我们要把单片机的电脉冲信号转化为能使步进电机转动的步距角,本设计中我采用了驱动器ULN2003作为脉冲信号的提供原。驱动模块电路图如下所示:图7驱动电路模块图3.3.1步进电机(1)步进电机的工作原理通常电动机是由静止的转子和转动的转子组成,电动机的转子是一种永磁体,当有电流通过定子绕组时,定子起着接受电能产生旋转磁场的作用。转子在该磁场的作用下旋转一个角度,从而让转子的磁场方向与定子的磁场方向保持一致。同样,定子的磁场旋转一个角度,转子也会沿着该方向转动相同的角度。每接收一个电脉冲信号,电动机就会转动一个固定角度。脉冲数量越多电机旋转角度越大,脉冲频率越高电机转速越快,可以看出它们两辆成正比关系。我们只需要改变绕组的通电顺序就能够改变电动机的转动方向。因此控制电动机的转动实际上就是控制脉冲数量和频率。[[][](2)步进电机的分类步进电机根据结构的差异通常分为以下三类:表3.步进电机分类类别反应式步进电机永磁式步进电机混合式步进电机结构有软磁材料组成定子绕组和转子步进电机的转子用永磁材料制成定子上有多相绕组、转子上采用永磁材料力矩小大大步距角小(1.2o)大(7.5o或15o)小精度差差好动态性能差好好(3)步进电机的主要特点和特性步进电机转动的前提是必须添加驱动,脉冲信号时唯一能驱动电机运转的驱动信号,也就是没有脉冲信号电机就不会运转。当添加一个稳定的脉冲信号,其就会按照固定的角度转动,转动的速度与脉冲频率成正比。能够瞬间启动和快速停止时步进电机的一个优越特性。改变步进电机转动方向的一个简便方法就是改变脉冲顺序。步进电机主要具有以下有点[[][]1、电机旋转的角度与脉冲数成正比;2、最大的转矩出现在电机停止的位置上;3、每一步的精度在3%~5%,而且误差不会长期积累,上一步的误差不会叠加到下一步,因而具有良好的位置精度;4、电机具有快速的起停和反转响应;5、步进电机没有电刷,运行可靠,因此电机自身的轴承寿命决定了电机的寿命;6、因为没有反馈环节,故控制简单;7、脉冲信号的频率决定了转速,故电机有较宽的调速范围。但是,这种电机也有自身的缺点:1、在控制不当的情况下容易产生共振;2、很难获得较高的转动速度;3、转矩较小;4、在体积重量方面没有优势,能源利用率低;5、过载运转时会破坏同步,高速转动时会产生振动和噪声。(4)本设计采用了28BY-J48型进电机。其参数如下[[][]表4.28BY-J48型进电机技术参数电压V项数步距角度减速比定位转矩g.cm545.625/641:64>=3003.3.2ULN2003ULN2003是一种晶体管阵列,它的明显特点是功能强大,而且成本不高,是各种电路的理想器件,应用范围非常广。图8、图9是ULN2003的芯片引脚图和外形图:图8ULN2003芯片引脚图图9ULN2003外形图3.4电源模块下图是电源模块图,有两套电源电路,其中一个是备用电路。如下图所示:图10电源模块图电源模块整流桥采用的是2W10整流桥,其是一种圆形直插式整流桥。其最大平均工作电流2A,最大反向电压时1000V[[]][]图11整流桥外形图3.5键盘模块键盘模块主要是对步进电机的转动速度和转动方向进行有效的控制,该模块包含了加速按钮、减速按钮、正反转按钮和停止按钮。控制不进电机电的转速只需要按下加速或者减速按钮;对步进电机的方向进行控制我们只需要按下正或反转按钮;停止按钮可以随时让步进电机停止转动。键盘模块电路图如下所示:图12键盘模块电路图3.6本章小结本章内容首先介绍了该控制系统的组成模块,并对各个模块硬件设计作了详细的说明。另外,还对步进电机和单片机的原理等知识作了说明。第四章控制系统软件分析与设计综合总体设计方案和各模块硬件电路的考虑,该系统的软件设计思路:第一步:各模块初始化,对12864、驱动器进行设置为下一步接受信息做好准备。第二步:通过ULN2003产生的脉冲驱动电机转动,显示在12864上,在通过键盘扫描得到设定的信息;第三步:通过键盘按钮里控制步进电机的运转情况,并显示在显示器上。4.1主程序流程图图13主程序流程图主程序流程图:首先是对各个模块进行初始化,包括12864,步进电机等。然后通过按键扫描得出设定速度并进行显示。然后读FLAG标志选择是正转还是反转,正转时,确定转速和圈数,然后调用12864显示程序显示。然后返回按键扫描,构成循环。4.212864显示程序流程图图1412864显示程序流程图12864显示程序流程图:首先是初始化,针对显示屏进行设计,比如设定游标的移动方向,游标位置反白允许,设定CGRAM地址,并口或者工作模式等等。第二步写指令,写入控制指令,选择写入12864的显示位置。第三步,写入数据,可以写入单个字符也可以写入字符串,单个数据时要加入0X30,还可以写入图片内容,在写入时逐个写入,直到结束。第四步,12864内部写计数器计数器为0时,显示结束,完成一次显示过程。4.3正反转程序流程图图15正反转程序流程图正反转程序流程图:首先是在主程序里面初始化定时器0,主要是开总中断,开外部中断0,设定边沿式触发中断。然后设定一个正反转FLAG标志,判断当FLAG标志位’1’为时选择正转,反之,FLSF标志位位‘0’时选择反转。该改变FALG标志的方法是选择外部中断。具体是:通过一个独立按键作为外部中断0的输入,当有按键按下时,边沿触发,然后申请中断,执行中断服务程序。在中断服务程序里面首先按键去抖动程序,去抖动后对FLAG标志取反从而每按一次按键FLAG标志位改变一次,执行结束后返回主程序。这样每按一次按键正反转改变一次实现正反转。4.4加减速程序流程图图16加减速程序流程图加减速程序流程图:通过两个独立按键实现,一个代表加速,一个代表减速。首先设置按键对应单片机端口部分,然后检测是否有低电平,当检测到有低电平时,延时10ms去抖动,再次判断是否有低电平,仍然是低电平时判断按键是否释放,当按键释放时才执行下一部程序,针对本程序,当加按键按下后增加转速NUM值就可以加速,反之,减按键按下后减小NUM值从而减小速度。4.5本章小结本章简单的介绍了系统软件设计的思想,并且说明了主程序和各子程序的设计方法和思路,描绘出了各程序流程图。第五章系统的测试与结果分析5.1软件测试工具KEIL是常用的开发软件,适应于包括大部分的单片机系统和部分嵌入式系统的开发。它的突出特点是操作者可在初始化新建工程文件时将单片机的芯片资料库直接添加到开发环境中,这样使得用户软件编写变得更加便捷灵活。工程文件一旦生成操作者就不再需要进行文件的初始化操作,而且可以直接将程序代码放进工程中。如下图所示:图17KEIL界面图运用软件调试工具Debug可以很好的观察程序执行过程。表示启动和停止调试模式;表示打开和关闭项目窗口;表示打开和关闭输出窗口;表示设置程序断点等等可以帮助操作者进行程序的分析、差错以及时序的确定。如下图所示:图18Debug调试界面5.2测试数据与分析通过由测速传感器和最小系统构成的测试平台,检测步进电机转动的圈数和速度的误差。该测试平台的实物图如下:图19测试平台实物图5.2.1圈数测试首先在步进电机转动时开始计数,直到步进电机停止转动,记录电机转动了多少圈。将记录的圈数与先前程序设置的圈数进行比较,下面是电机正转和反转时测试的圈数数据表:表5正转时测试的圈数数据测试次数1234设定值(圈数)406080100实测值(圈数)406080100表6反转时的测试圈数数据测试次数1234设定值(圈数)-40-60-80-100实测值(圈数)406080100测试结果说明步进电机在正常运转时,设定的圈数和实际测得的圈数相同。进而说明转过的圈数没有误差。5.2.2速度测试电机转动时,通过测速传感器模块将步进电机的速度动态显示在显示器上,通过加减速键盘按钮来改变设定值,同时也改变了电机的实际转速。然后将其实际转速与先前设定的速度进行比较,下面是电机正转和反转时测试的速度数据表:表7电机正转时测试速度数据测试次数1234567设定值(r/min)708090100908070实测值(r/min)67778696867767表8电机反转时测试速度数据测试次数1234567设定值(r/min)-70-80-90-100-90-80-70实测值(r/min)68778797877768为了更加直观的反应实际测量速度与设定速度的误差,我们用折线图展现出来。下图是正转是的实测速度与设定速度折线图,反转类似在这省略了。图20实测速度与设定速度折线图从上图可以看出步进电机实测速度与设定速度的误差始终保持在一定范围,误差没有因为测量次数的增加而积累,所以可以认为其误差不会长期积累。下面用正转时的数据表格来计算误差,证明其误差不会积累。第一次测量误差:第二次测量误差:第三次测量误差:…第七次测量误差:通过数据分析可以得到步进电机的误差始终在一定范围内,误差不会积累。5.3本章小结本章首先介绍了设计使用的KEIL软件工具,接着重点叙述了本设计通过测试平台。证明了步进电机的转动圈数没有误,转速的误差在一定范围内,且不会长期积累。进而也证明了步进电机具有良好的控制作用。第六章毕业设计总结通过近期的努力,毕业设计顺利的完成了。本次设计主要呈现了对单片机在控制欲实现及步进电机的简单应用,在本次设计中,通过自身的努力让我在各方面的能力都有一定的提高。通过这次设计,我对单片机的调试、ULN2003的工作原理和12864显示器等都有了一些新的认识和了解。同时,我对本设计的总体硬件电路的组装和调试印象很深,总体电路的组装和调试十分重要,直接关系到设计的电路能否正常运行。在本设计的软件编程方面,为了能把各个模块的程序良好的组合在一起并能够顺利的实现运作,进行了大量的程序调试,需要经几个模块程序一起调试,在这个过程中话费了大量的时间。本设计完成了题目所要求的基本功能,原计划要扩展一下该设计,但是由于时间和精力现在无法实习,在以后的工作中可以继续完成。参考文献[1]坂本正文.步进电机应用可以[M].北京:科学出版社,2006:23-45.[2]张强,吴红星,谢宗武.基于单片机的电动机控制技术[J].北京:中国电力出版社,2008,22(1):34-58.[3]栾居里.永磁同步电动机的开环步进驱动器的研究[J].机械设计与制造,2012,16(2):135-143.[4]袁任光,张伟武.电动机控制电路选用与258实例[M].北京:机械工业出版社,2005:56-60.[5]王秀和.永磁电机[M].北京:中国电力出版社,2007:21-35.[6]房玉明,杭柏林.基于单片机的步进电机开环控制系统[J].电机与控制应用,2006,18(2):202-223.[7]H.S.Kim,K.H.Kim,M.J.Youn.On-LineDead-TimeCompensationMethodBasedOnTimeDelayControl[J].IEEETrans.onControlSystemsTechnology,2003,11(2):279-285.[8]刘国荣.单片微型计算机技术[M].北京:机械工业出版社,1996:105-112.[9]宏晶科技.STC89C52RC单片机中文资料[J].技术手册,2012,3,11-13[10]黄友锐.单片机原理及应用[M].合肥:合肥工业大学出版社,2006.[11]绘晶科技.12864液晶显示器中文资料[J].技术手册,2012,6,16-18[12]栾居里.永磁同步电动机的开环步进驱动器的研究[J].机械设计与制造,2012,16(3):105-116.[13]王润孝,秦现生.机床数控原理与系统[M].西安:西北工业大学出版社,1997:45-56.[14]德昌机电科技.步进电机中文资料[J].技术手册,2013,4-6.[15]鼎好电子科技.整流桥英文资料[J].技术手册,2012,2-3.致谢在此次的毕业设计过程中,我要感谢院系领导能给我这样一个好平台去锻炼与展示自己。感谢储忠老师在此过程中给我的解惑与指导帮助。记得在上学期刚选题的时候,曾经对这个课题有比较多的疑问和考虑。首先是对题意的要求了解的不够深,其次是采用的制冷方法很难确定,可以确定的话成本也很难接受。由于在之前,比如参电协焊接大赛或数学建模比赛,我们所做的都是一个团队去完成的。所以,个人都没有经历过自己独立的去完成一个项目,显然得到的锻炼也相对较少。对于本次毕业设计的方案,我是纠结了很久,与老师交流了很多,也同实验室里的同学交流了不少。当然,我想还是我之前学习的知识不够,才导致了我在本次设计中遇到诸多问题。经过了这次的毕业设计,我遇到了很多困难,也成长了不少。矛盾的确是在推动我们前进的动力。虽然,我日后的工作不一定是与本专业相关的,但是作为大学里的最后一次作业,那一定要认认真真的去完成。我觉得做事还是不能好高骛远,得从小事做起,成功是积累出来的。在做事的过程中一定要仔细、认真、用心。哪怕是最小、做不起眼的工作也要做好!例如,在设计电源的过程中就由于自己的大意,没有考虑好功耗,导致电源芯片发热严重。同时经过了这次的独立设计,让我提高了自学能力与自己解决问题的能力。回想起刚接触本课题时的那种心态,与如今顺利完成时的心态。真的感觉很有成就感,我想这足以让人自信不已。不过还是设计的有点不足,很多功能并不是很稳定。也通过了这次的设计让我对日后的工作有了更多的认识与理解。当然,这得感谢丁老师给我提供的指导,真的非常的感谢!大学的这四年里,遇到了好老师,对学生影响真的很大。还有就是很多帮助我的同学们。有了你们的帮助,我的专业知识学变得更加的扎实、牢固,我迷茫与纠结的时间也少很多。最后,衷心地感谢储老师和帮助我的同学!致谢人:魏伟2014年05月12日于合肥学院附录附录一系统电路仿真图附录二系统实物图附录三单片机端口分配表引脚号引脚分配说明引脚号引脚分配说明P0.0接12864的4脚(RS)P1.4接加速按钮脚P0.1接12864的5脚(R/W)P1.5接减速按钮脚P0.2接12864的6脚(E)P1.6接圈数按钮脚P0.3接12864的7脚(DB0)P2.1接12864的12脚(DB5)P0.4接12864的8脚(DB1)P2.2接12864的13脚(DB6)P0.5接12864的9脚(DB2)P2.3接12864的14脚(DB7)P0.6接12864的10脚(DB3)P2.4接12864的15脚(PSB)P0.7接12864的11脚(DB4)P2.5接12864的16脚(NC)P1.0接UNL2003输入口1P2.6接12864的17脚(/RESET)P1.1接UNL2003输入口2P3.2接正反转按钮脚P1.2接UNL2003输入口3P3.3接测试传感器D0口P1.3接UNL2003输入口4附录四系统程序1.主程序/*主程序*/voidmain(){Init_0(); //外部中断0Init_Timer0();//定时器中断0Init_1(); //外部中断1Init_ST7920();//初始化LCD_PutString(0,1,"步进电机控制系统"); //Y从1-4;X从0-7;LCD_PutString(0,2,"当前速度:r/m");LCD_PutString(0,3,"设定速度:r/m");LCD_PutString(0,4,"显示圈:q");while(1){ sudu_sd(); //矩阵键盘显示设定速度 dianji(); //控制电机加减速和正反转 sudu_jc(); //检测实际速度 qs_jc(); //检测实际圈数}}2.显示部分#include"delay.h"#include"12864.h"sbitRS=P2^4; //12864sbitRW=P2^5;sbitE=P2^6;sbitRES=P2^3;sbitPSB=P2^1;sbitPAUSE=P3^0;sbitKEY_ADD=P1^4;//按键sbitKEY_DEC=P1^5;unsignedcharSpeed=6;//电机实际转速unsignedcharnumm; //设定速度unsignedchardis[2];#defineDataPortP0//MCUP0<>LCM/*检测忙位*/voidCheck_Busy(){RS=0;RW=1;E=1;DataPort=0xff;while((DataPort&0x80)==0x80);//忙则等待E=0;}/*写命令*/voidWrite_Cmd(unsignedcharCmd){ Check_Busy(); RS=0; RW=0; E=1; DataPort=Cmd; DelayUs2x(5); E=0; DelayUs2x(5);}/*写数据*/voidWrite_Data(unsignedcharData){ Check_Busy(); RS=1; RW=0; E=1; DataPort=Data; DelayUs2x(5); E=0; DelayUs2x(5);}/*液晶屏初始化*/voidInit_ST7920(){DelayMs(40);//大于40MS的延时程序PSB=1;//设置为8BIT并口工作模式DelayMs(1);//延时RES=0;//复位DelayMs(1);//延时RES=1;//复位置高DelayMs(10);Write_Cmd(0x30);//选择基本指令集DelayUs2x(50);//延时大于100usWrite_Cmd(0x30);//选择8bit数据流DelayUs2x(20);//延时大于37usWrite_Cmd(0x0c);//开显示(无游标、不反白)DelayUs2x(50);//延时大于100usWrite_Cmd(0x01);//清除显示,并且设定地址指针为00HDelayMs(15);//延时大于10msWrite_Cmd(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50);//延时大于100us}/*显示字符串x:横坐标值,范围0~8y:纵坐标值,范围1~4*/voidLCD_PutString(unsignedcharx,unsignedchary,unsignedcharcode*s){switch(y){ case1:Write_Cmd(0x80+x);break; case2:Write_Cmd(0x90+x);break; case3:Write_Cmd(0x88+x);break; case4:Write_Cmd(0x98+x);break;default:break; }while(*s>0){Write_Data(*s);s++;DelayUs2x(50);}}/*设定速度显示位置 //位置显示与上述一样*/voidLCD_POS(unsignedcharX,unsignedcharY){unsignedcharpos;if(Y==1){Y=0x80;}elseif(Y==2){Y=0x90;}elseif(Y==3){Y=0x88;}elseif(Y==4){Y=0x98;}pos=Y+X;Write_Cmd(pos); //显示地址}/*按键扫描子程序,设置初始速度值程序*/voidKEY_SCAN(void) //扫描按键设置初始时钟信号{ unsignedcharshiwei;unsignedchargewei; if(!KEY_ADD) //十位自我设置 { DelayMs(10); if(!KEY_ADD) {while(!KEY_ADD); if(Speed>=2) { Speed=Speed-1; } } } if(!KEY_DEC) //减自我设置 { DelayMs(10); if(!KEY_DEC) {while(!KEY_DEC); Speed=Speed+1; } } if(Speed==1) { numm=36; } if(Speed==2) { numm=22; } if(Speed==3) { numm=14; } if(Speed==4) { numm=12; } if(Speed==5) { numm=10; } if(Speed==6) { numm=8; }shiwei=numm/10;gewei=numm%10;dis[0]=shiwei+0x30; dis[1]=gewei+0x30;}voidsudu_sd(void) //显示设定速度{unsignedcharj; KEY_SCAN(); LCD_POS(5,3); for(j=0;j<2;j++) { Write_Data(dis[j]); }}unsignedcharspeed_num(void) //用于时间判断{unsignedcharnu;nu=Speed;return(nu);}3.测试部分#include"cesu.h"#include"12864.h"#include"delay.h"#include"timer.h"sbitKEY_YUZHI=P1^6;unsignedintcalsp; //设置读时间时间unsignedintcalxx; //设置读时间时间unsignedintcounter=0; //脉冲数unsignedintquanshu;unsignedintqsyz; //圈数预置12*30unsignedintqs,qs1;unsignedintmotorspeed;unsignedchardis3[3];unsignedchardis5[3];unsignedchardis6[3];bitFLAG2=1;/*定时器中断0和外部中断1模块程序*//*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*外部中断0初始化子程序*/voidInit_1(void){EA=1; //开启总中断 EX1=1; //开启外部中断1IT1=1; //设置成下降沿触发方式}/*定时器中断子程序*/voidTimer0_isr(void)interrupt1{//unsignedcharj;TH0=(65536-9217)/256; TL0=(65536-9217)%256; //10000/1.085=9217得到10ms执行一次calsp++;calxx++;}/*外部中断子程序*/voidINT1_isr()interrupt2{ counter++; if(FLAG2==1) {quanshu++; } if(FLAG2==0) { //if(qsyz>3) //{ qsyz--; //} }}/*脉冲计算*/voidcalspeed(){ unsignedcharGE,SHI,BAI; //显示速度 if(calsp>=1000) //300*10ms=3s计算一次 { motorspeed=counter/2;//由此转一圈两个高低电平,所以与除以0.5;抵消/3*60=20 counter=0; //清零脉冲数 calsp=0; //清零标志 }BA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论