目 录
第1章 概述 .................................................. 1 第2章 方案的确定 ............................................ 3 2.1 设计思路 ................................................ 3 2.2 硬件电路总体设计方案 .................................... 3 第3章 模块硬件电路设计 ...................................... 4 3.1 LED显示模块的电路设计 ................................... 4 3.2 按键模块电路设计 ........................................ 4 第4章 软件设计 .............................................. 6 4.1 主程序设计 .............................................. 6 4.2 按键扫描设计 ............................................ 6 4.3 中断服务程序设计 ........................................ 6 4.4 进制转换设计 ............................................ 6 4.5 动态扫描显示设计 ........................................ 7 第5章 系统调试 ............................................. 12 5.1 软件模拟仿真 ........................................... 12 5.2 硬件调试 ............................................... 12 第6章 总结 ................................................. 14 参考文献 ..................................................... 15 附录 ......................................................... 16
第1章 概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端[1]的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部
1
单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
2
第2章 方案的确定
2.1 设计思路
利用AT89C51作为中控器和四个显示管组成一个测速表。电机转速采用光电脉冲传感器来模拟,设置定时器/计数器T0和T1,利用其内部定时器T0设置为定时方式,且定时时间为1s;计数器T1则设置为外部脉冲计数工作方式,设在1s内测量的脉冲个数为n,又由于脉冲频率为60个脉冲/转,故测到的转速n就是脉冲频率。定时1s,在此时间段内允许中断,每中断一次,软件计数器加1,1s后,中断关闭,则软件计数器即为1s内的脉冲数,通过计数在一定时间内通过定时器的脉冲数和软硬件结合工作即可测出光电脉冲的转速了。
2.2 硬件电路总体设计方案
根据设计的要求和设计思路,硬件电路应有8个部分构成,即单片机按键输入、复位电路、时钟电路、LED段码驱动、LED位码驱动、LED显示电路。其中LED段码由74LS48驱动,LED位码由ULN2003驱动,采取按键复位电路,步进马达转动用可调脉冲模拟。图2.1为总体硬件电路的框图。 时钟电路 复位电路 按键电路 图2.1 总体硬件电路的框图
3
LED 段码驱动 AT89C51 LED 位码驱动 LED显示
第3章 模块硬件电路设计
3.1 LED显示模块的电路设计
本课题所采用得是由四位LED(数码管)作为显示电路,用以显示由单片机对频率发生器的计数值转换后的BCD码值,以及开始测速时的初始状态。其硬件电路连接是单片机P0.0~P0.7口分别经过驱动后接数码管的A~G的8各管脚,而P2.4~P2.7口则分别经过驱动后接数码管的1~4控制端口,如图3.1所示,且数码管采用共阴极连接的方法连接。如图3-1所示:
3.2 按键模块电路设计
根据设计思路,对系统的控制只需用到启动、停止和复位三个键,因此可采用简单的独立方式对按键排布和接线。具体的接口连接如图3.2所示,启动、停止和复位键分别连接单片机的P3.0~P3.2端口,当有键按下时,单片机的三个端口由高电平跳变为低电平,从而起到对显示的控制作用。如图3-2所示。
4
图3.1 显示模块硬件电路图
图3-2 按键电路图
5
第4章 软件设计
4.1 主程序设计
在初始化程序后,数码管显示初始化状态,接下来对按键循环的进行扫描,检测是否有按键按下,当有按键按下时,判断是哪个键,再向CPU提出中断申请,进而执行相应按键的控制功能,执行完程序后返回对按键的查询;当没有按键按下时,继续对按键扫描,如此循环。图4.1是总体设计的流程图 。
4.2 按键扫描设计
程序开始后,进行按键扫描,检测是否有按键按下。当有按键被按下,为了消除抖动现象,对按键按下进行两个显示的延时操作,大概20ms,直到按键闭合了,对相应的按键取值,送给单片机端口进行控制;当没有按键按下,给按键取值后,跳转回按键的扫描程序。为了更形象的说明设计思路,下面是按键扫描的流程图,如图4.2所示。
4.3 中断服务程序设计
当中断发生时候,TF0自动置1,开始进入中断服务程序,每次进入中断服务程序之后,规定的变量自动加1,当变量的值加到20的时候就表示定时1s,此时将呼叫进制转换程序来对计数值进行转换,并将TR1中的内容清零,以免下次计数发生重叠。流程图如图4.3所示。
4.4 进制转换设计
当定时器T0定时50ms,R4循环20次后,恰好是1s,此时将十六位的二进制数转换为十进制的BCD码显示。转换方法如下所示。 分别用M=(TH1%(OX10))/(OX10)和N=(TH1%(OX10))表示TH1的高四位和低四位;再用X=(TL1%(OX10))/(OX10)和Y=(TL1%(OX10))表示TL1的高四位和低四位。于是T1对应的十进制数表示为:Z=M*4096+N*256+X*16+Y*1,又因为
6
定时时间为1s,故需将Z乘以60才得到每分钟的转速。而在汇编程序中,定义显示的缓冲区为7AH-7DH,所以需将得到的DEC的四位再进行分解:千位=DEC/1000,百位=(DEC%1000)/100,十位=(DEC%100)/10,个位=DEC%10。然后分别将千位至个位的数字送到7AH-7DH的单元中,供显示程序使用。
4.5 动态扫描显示设计
采用动态扫描显示的方法,也即任意时刻只有一个数码管被点亮, 但由于人的视觉暂留效应,当显示速度合适的时候我们看到的将是所有管子同时发亮的数字。实现方法是:TAB 存放着0-9的码字,我们让R0指向7A内存区,DPTR指向TAB的首址,通过A,我们使用 @A+DPTR完成查字 形编码表的工作。然后从R0开始扫描四次.完成了7AH-7DH中内容的显示。位选使用R6,先赋值为#0FEH,然后逐个左移,左移四次就完成了四个数码管的轮流点亮,流程如图4.4所示。
7
开始 初始化 调显示子程序 有无键? N Y 启动中断 启动键? N 启动暂停处 理程序 Y Y 处理程序 暂停键? N N 复位键? Y 图4.1 总体设计的流程图
8
开始 N 有键按下? Y 延时去抖 有键闭合? Y 扫描取键值 N 闭合键释放? Y 结束 图4.2 按键扫描流程图
9
中断服务开始 变量加1 R4等于20? N Y 调用转换子程序 T1和变量清零 中断返回 图4.3 中断服务程序流程图
10
DPTR指向TAB的表头 7A内存区,R1和R2分别赋值01和04 查字形编码表 轮流扫描 从R0开始扫描4次 显示数字 图4.4 动态扫描显示设计图
11
R0指向
第5章 系统调试
5.1 软件模拟仿真
试验所涉及的2个软件keil和proteus,以下是仿真步骤。
程序调试部分keil:先新建一个工程,并保存在所建工程弹出的对话框中选择AT89C51处理器。新建一个文档以编辑程序,将所设计的程序输入到新建文档中,并保存文档.asm(汇编源文件)。将所保存的文档添加到工程中去,再进行工程配置,点击Project菜单下的Options for Target ,在弹出的对话框中设晶振为12MHZ,将Create HEX File打上勾,再编译文件。
仿真部分proteus:运行proteus的ISIS后进入仿真界面将所需元件选择好,根据原理图画出仿真图,待仿真图换好后双击AT89C51写入keil所产生的程序,按开始进行仿真。
5.2 硬件调试
硬件调试的步骤如下:接通电源和数据线,通过软件将在keil中生成的HEX文件下载到单片机板子上,先对板子关电当显示请上电时按下单片机上的电源开关按钮上电下载程序到单片机中,通过按键和LED的显示进行调试。
当程序下载完之后,按下电源开关,LED上显示初始状态,按下启动键显示接收数据的状态,按下停止键后显示当前所记录的数据,按下复位键则显示初始状态。
脉冲为10HZ时仿真结果如图5-1所示。脉冲为50HZ时仿真结果如图5-2所示。
12
图5-1 脉冲10HZ时仿真结果
图5-2 脉冲50HZ时仿真结果
13
第6章 总结
本次应用单片机设计数字转速表的课程设计给我带来了不一样的收获。短短两周的时间里,锻炼了我主动动手解决问题和设计性思维的能力,将理论应用于实践中确实并非易事,因为它不是单纯的理论学习和理解,包含的东西远远超过我的想象,首先是扎实的理论基础,再是具备创新设计思维,还必须懂得电脑仿真软件的应用,接着是拥有一定的编写报告的能力,最后也是最重要的是要有刻苦专研和积极提问的精神,我想这也是为什么老师将我们分为几人一组完成课题的原因吧!
课程设计不是一个人的事情,就像篮球运动一样,要靠团队的力量,才能取得成功。毕竟个人的力量是有限的,无法解决所有的问题。所以在我们设计的过程中,团队的协作起到了很大的作用,尽管大部分的设计都是由一个人完成,但其他人的协助为他解决了许多他没有考虑到的问题。尤其是我们的指导老师,她起着关键性的作用,老师负责和严谨态度让我们受益匪浅,短短的两个星期里,老师便和我们交流了五次,基本上是两天一指导,这不仅对我们的设计起到了一个督促作用,更是给了我们方向性的指导,让我们得以更加高效的完成这次的设计。真的非常感谢李老师在这次课程设计中给予我们的帮组和指导!
通过这次的课程设计,不但让我对单片机有了更加深层的认识,而且对课本的知识起到了很好的巩固作用。在此,我要感谢和我一组的其他同学,对我的帮助,使对单片机得用途有了更多的了解,这些都是我在课本上学不到的宝贵知识。很高兴这次的课程设计能够与他们一起共进,同时谢谢李老师耐心的指导!
通过这次的课程设计,我从不会设计开始学习,到了最后把设计搞好,这个过程让我感到开心,设计能运行给了自己巨大的动力,在以后的学习和工作中,我应该更要加油,通过自己的努力做好每一件事。
14
参考文献
[1]刘国荣.单片微型计算机技术.机械工业出版社,1996
[2] 张迎新.单片微型计算机原理、应用及接口技术.国防工业出版社,1993 [3]房小翠.编单片机实用系统设计技术.国防工业出版社,1999 [4]何立民.编单片机应用系统设计.北航出版社,2005 [5]王为清.编keilCx51应用开发技术.人民邮电出版社,2007 [6]先锋工作室.编单片机程序设计实例.清华大学出版社.2003
15
附录
总电路图
16
程序清单
ORG 0000H
AJMP MIAN ;转主程序入口MAIN ORG 000BH ;T0的中断入口 LJMP DVT0 ;定时器T0中断 ORG 0030H MIAN: MOV SP,#60H MOV 30H,#0 MOV 31H,#0 MOV 7AH,#11H MOV 7BH,#11H MOV 7CH,#11H
MOV 7DH,#11H MOV R4,#20 MOV TMOD,#51H MOV TH0,#3CH MOV TL0,#0B0H MOV TH1,#0
MOV TL1,#0 LOOP1: LCALL DIS LCALL KEY1
JNZ KEY2
AJMP LOOP1
KEY2: LCALL DIS LCALL DIS LCALL KEY1
JNZ KEY3
;; 设置中断向量 ;设置堆栈区 ;计数单元清零
;复位状态字型码送缓冲区
T0、T1工作方式字
;给T0设置初值 ; T1置初值 ;重复显示、查键
17
;设置
LJMP LOOP1
KEY3: JNB P3.0,LP0 JNB P3.1,LP1
JNB P3.2,LP2
LJMP LOOP1 LP2: CLR ET1 CLR TR1 CLR
EA
CLR TR0 CLR ET1 CLR TF0
LJMP MIAN
LP1: CLR TR1 CLR TR0 CLR ET0 CLR ET1 CLR
EA
CLR TF0
LJMP LOOP1 LP0: MOV 7AH,#0H MOV 7BH,#0H MOV 7CH,#0H
MOV 7DH,#0H
SETB TR0 SETB ET0
SETB EA SETB TR1
LJMP LOOP1
T0
;停止定时器T0
;启动定时器0
;开放中断,并设置中断方式18
;停止定时器
KEY1: MOV P3,#0FFH ;扫描显示初始化 MOV A,P3 CPL A
ANL A,#07H RET
;-------------------驱动LED显示器的程序----------- DIS: MOV DPTR,#TAB DIS1: MOV R0,#7AH MOV R1,#01H
MOV R2,#04H DIS2: MOV P2,#0
MOV A,@R0 ;四位轮流扫描显示 MOVC A,@A+DPTR
MOV P0,A MOV A,R1
MOV P2,A LCALL DAY INC R0 RL A MOV R1,A DJNZ R2,DIS2
RET TAB: DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H, 0A1H,86H,8EH,0FFH,0BFH; ;字形编码表DAY: MOV R6,#1 D1: MOV R7,#248 D2: NOP
19
NOP DJNZ R7,D2 DJNZ R6,D1 RET
;---------------------定时器T0中断服务程序-------------------- DVT0: PUSH PSW ;T0中断程序
PUSH ACC ;相关内容入栈保护 MOV TH0,#3CH
MOV TL0,#0B0H ;T0重装初值 DJNZ R4,RTNO ;1s定时未到,继续 MOV R4,#20
CLR ET0
CLR TR1 ;1秒定时到,关闭计数器 CLR EA CLR TR0
MOV 31H,TH1 MOV 30H,TL1 LCALL HEX2BCD MOV TH1,#0
MOV TL1,#0 ;计数器T1清零,准备下一轮计数 SETB ET0
SETB TR1 ;启动定时器1 SETB EA
SETB TR0 ;启动定时器0
RTNO: POP ACC
POP RETI
HEX2BCD:PUSH PSW ;数码转化子程序
20
PSW
SETB RS0 SETB RS1 MOV A,30H MOV B,#60 MUL AB MOV 31H,B MOV 30H,A
LCALL CHANGE ;二进制到BCD码的转化 MOV A,
33H ;以下是将转化后的BCD码存入相应缓冲区
ANL A,#0FH MOV MOV
7BH,A A,33H
SWAP A ANL A,#0FH MOV MOV
7AH,A A,32H
ANL A,#0FH MOV MOV
7DH,A A,32H
SWAP A ANL MOV
A,#0FH 7CH,A
CLR RS0 CLR RS1 POP PSW RET
CHANGE: CLR A
MOV 40H,A
21
MOV 41H,A MOV R7,#16
L0P4: MOV R0,#30H
MOV R6,#02 CLR C
L0P2: MOV A,@R0
RLC A MOV @R0,A
INC R0 DJNZ R6,L0P2 MOV R1,#41H MOV R5,#02H
L0P3: MOV A,@R1
ADDC A,@R1 DA A MOV @R1,A DEC R1
DJNZ R5,L0P3 DJNZ R7,L0P4 MOV 33H,40H MOV 32H,41H RET END
1 22
;内存单元加
因篇幅问题不能全部显示,请点此查看更多更全内容