基于单片机的自行车里程速度计设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学号:
中州大学毕业设计
设计题目:基于单片机的自行车里程速度计设计
学院:
专业:
班级:
姓名:
指导教师:
日期:年月日
摘要
1
目前自行车已成为人们娱乐、休闲、锻炼的首选,尤其是对于用来锻炼的人们,自行车速度里程计让他们清楚地知道当前的速度、里程等物理量,更好的用于锻炼。

本论文主要阐述一种基于霍尔元件的自行车速度里程计设计。

以AT89C51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车速度里程计测量统计。

该速度里程计将传感器输入到单片机的脉冲信号的宽度实时地测量出来,然后通过单片机计算出速度和行程,再将所得的数据存储到串口数据存储器,采用CAT24WC32 实现在系统掉电的时候保存速度和行程信息,并由串口液晶显示模块实时显示出所测速度和行程。

本设计介绍了自行车速度/里程测试仪的硬件电路和软件设计。

硬件部分利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。

软件部分用汇编语言进行编程,采用模块化设计思想。

该系统硬件电路简单,子程序具有通用性,完全符合设计要求。

关键词:速度/里程;霍尔元件;单片机;LCD液晶显示
Abstract
2
Now the bicycle has become the first choice of entertainmenting and exercising. Especially for people to exercise,The bicycle speed/trip can fulfill the basic need of people’s life, so that they can learn the speed and the mileage of the bicycle. In these paper, the bicycle speed/trip design based on the Hall element is elaborated. By AT89C51 as kernel, using A44E Hall element to measure revolution, the measure and statistic are achieved. The range informations are saved by CAT24WC32 when the power is off, the bicycle speed can be displayed on LCD. In this article, the hardware circuit and software design of bicycle speed/trip instrument are introduced in detail. About the hardware, the pulse number is transmitted of one cycle of the bicycle into Single Chip Microcomputer system. Then the signal processed by Single Chip Microcomputer system is sent to display scream. About the software, in assemble language, the program is designed in the mode of modules. The system has simple hardware, common sub-program, and meet the demand of design.
Key words: speed/trip; Hall element; Single Chip Microcomputer; LCD
目录
一、概述
1、设计目的 (1)
3
2、课题简介 (1)
二、系统设计
1、总体设计方案 (2)
2、硬件部分简介 (3)
(1)AT89c51芯片简介 (3)
(2)硬件设计 (4)
3、软件部分 (5)
(1)初始化程序 (6)
(2)主程序 (8)
(3)中断程序 (9)
(4)里程、速度处理程序 (11)
(5)显示子程序 (14)
(6)延时子程序 (16)
三、调试 (17)
1、硬件调试 (17)
2、软件调试 (17)
四、操作说明 (19)
五、参考文献 (20)
六、心得体会 (21)
七、附录 (22)
1、元器件清单 (22)
2、整体原理图 (23)
3、完整程序 (24)
自行车里程计/速度计的设计
一、概述
4
1、设计目的
本设计采用AT89C51单片机作控制,利用霍尔元件等器件设计一个可用LED 数码管显示当前自行车行驶的距离及速度并具有超速报警功能的自行车里程/速度表,使其作为自行车的一种辅助工具,让自行车的功用更强大,给人们带来更多的方便。

2、课题简介
自行车被发明及使用到现在已有两百多年的历史,在这两百年间人类在不断的尝试与研发过程中,自行车发展的目的也从最早的代步工具转换成休闲娱乐的用途,随着生活水平的提高,人们希望自行车的功能更强大,而里程计/速度计正满足了这个需求。

现在先进的里程/速度计不仅能显示实时的速度和里程,还显示时间,甚至具有测量骑车人的心跳、显示骑车人热量消耗等功能。

由于时间有限,本设计完成的功能减为两个,即测量并通过LED数码管进行动态显示当前的速度和里程,并在超速时发出警报。

要求达到的各项指标及实现方法如下:
1. 利用霍尔传感器产生里程数的脉冲信号。

2. 对脉冲信号进行计数。

实现:利用单片机自带的计数器T1对霍尔传感器脉冲信号进行计数。

3. 对数据进行处理,要求用LED显示里程总数和即时速度。

实现:利用软件编程,对数据进行处理得到需要的数值。

最终实现目标:自行车的速度里程表具有里程、速度测试与显示功能,采用单片机作控制,显示电路可显示里程及速度。

二、系统设计
1、总体设计方案
采用AT89C51芯片,用霍尔元件将车轮的转速转换成电脉冲,经过处理后送入单片机。

里程及速度的测量,是经过AT89C51的定时/计数器测出总的脉冲数和每转一圈的时间,再经过单片机的计算得出,计算结果通过LED显示器显示出来。

传感器是获取自然或生产领域中信息的关键器件,是现代信息系统和各种设备不可缺少的信息采集工具。

磁传感器是一种将磁学量信号转变为电信号的器件或装置。

随着信息产业、工业自动化、医疗仪器等的飞速发展和计算机应用的普及,需要大量的传感器将被测或被控的非电信号转换成可与计算机兼容的电信号。

作为输入信号,这就给磁传感器的快速发展提供了机遇,形成了磁传感器的产业。

5
6
其中最具代表的磁传感器就是霍尔传感器,在自动检测系统中,利用霍尔传感器测转数是一种最基本的测量工作。

单片机是本次设计的核心部件,它是信号从采集到输出的桥梁,而且包括计算、定时、信息处理等功能
当轮子每转一圈,通过开关型霍尔元件传感器采集到一个脉冲信号,并从引脚12即P3.2外部中断0端输入,传感器每获取一个脉冲信号即对系统提供一次计数中断。

每次中断代表车轮转动一圈,中断数n 轮圈的周长为L 的乘积为里程值。

计数器T1计算每转一圈所用的时间t ,就可以计算出即时速度v 。

当里程键按下时,里程指示灯亮,LED 切换显示当前里程,与当速度键按下时,速度指示灯亮,LED 切换显示当前速度,若自行车超速,系统发出报警信号,指示灯闪烁。

里程数据自动记忆,也可用于电动自行车、摩托车、汽车等机动车仪表上。

设计包括硬件、软件两部分,硬件电路包括AT89C51单片机的外围电路以及LED 显示电路等,这里对硬件部分只做简单介绍,主要阐述的是软件部分的设计,包括数据初始化程序的设计、主程序的设计、处理子程序的设计、显示子程序的设计;最后针对仿真过程遇到的问题进行了具体说明与分析,对本次设计进行总结。

图2.1 系统的原理框图 外部信号
霍尔传感 外部存储 AT89C52单片机
里程显示
速度显示
报警部分
7 2、 硬件部分介绍
(1)AT89C51芯片简介
AT89C51是一种带4K 字节闪存可编程可擦除的只读存储器即为 (FPEROM —Flash Programmable and Erasable Read Only Memory )的低电压、高性能CMOS 8位微处理器,俗称单片机。

图2-2 单片机内部机构示意图
管脚说明:
VCC :供电电压。

GND :接地。

P0口:P0口为一个8位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O 口,P1口缓冲器能接收输出4TTL 门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH 编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O 口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”
定时/计数器 中断系统
CPU 存储器 并行
I/O 口 串口
I/O 口
TXD
RXD
T INT
P0-P3
时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH 编程期间,此引脚也用于施加12V编程电源(VPP)。

8
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

(2)硬件设计
自行车里程计/速度计电路原理图见附录。

本次设计信号的捕获采用的是霍尔传感器。

霍尔器件具有许多优点,它们的结构牢固、体积小、重量轻、寿命长、安装方便、功耗小、频率高(可达1MHz)、耐震动、不怕灰尘、油污、水汽及烟雾等的污染或腐蚀。

霍尔线性器件的精度高、线性度好;霍尔开关器件无触点、无磨损、输出波形清晰、无抖动、无回跳、位置重复精度高。

取用各种补偿和保护措施的霍尔器件工作温度范围宽,可达-55℃~150℃。

XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

由于输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

P0口作为输出口用于显示历程状态和速度状态。

由于P0口没有上拉电阻,因此作为输出口时要加上上拉电阻来驱动LED数码管的点亮。

接于引脚10即P3.2、RXD的开关用于控制改变显示的方式,当开关闭合时,显示速度;开关打开时显示里程。

第12脚即外部中断0用于对轮子圈数的计数输入,轮子每转一圈,霍尔传感器输出一个低电平脉冲。

第十三脚即外部中断1用于控制定时器T1的启停,当输入为0时关闭定时器。

此控制信号是将轮子圈数的计数脉冲经二分频后形成,这样,每次定时器T1的开启时间刚好为转一圈的时间,根据轮子的周长就可以计算出自行车的速度。

P1.4口和P1.5口用于EEPROM存储器24C01的存取控制。

11脚输出用于超速时的报警,此时蜂鸣器发出声音,同时LED灯闪烁。

LED数码管采用四位相连的共阴极数码管,片选信号分别通过三极管接
至21-24管脚即P2.0-P2.4口,从而实现里程和速度的动态显示。

自行车的速度里程表的硬件电路设计是基础部分,它包括信号的捕获、放大、整形,单片机的计算处理,数码管的实时显示和单片机外围基本电路的设计,两大主要器件就是传感器和单片机。

9
3.软件部分软件部分
模块化结构设计即是根据要求和硬件设计的结构,将整个系统的功能分成许多小的功能模块,再根据这些小的功能模块进行程序编写的过程。

这样的设计方法,使得系统的整个功能和各部分的功能趋于明朗化。

当系统出现问题,就可以根据功能设置找出问题的根源,从而更快地解决问题。

所以说,在整个设计过程中,软件设计必须与硬件设计紧密地结合在一起。

软件设计包括初始化程序、主程序、行车过程中里程和速度计算子程序、延时子程序、中断服务子程序、显示子程序等。

系统软件总体流程图如图3.1所示
总体设计思路:首先进行初始化,选择车轮周长,P3.0是用于里程和速度切换的,低电平为显示速度,高电平为显示里程。

根据P3.0的状态来决定显示内容,P3.0=1时,转到计算速度子程序并进行显示;P3.0=0时,转到计算里程子程序并进行显示。

P1.0和P1.1口分别用于显示里程状态和速度状态。

P1.2、P1.3、P1.6和P1.7口分别用于设置轮圈的大小,低电平有效。

中断0用于对轮子圈数的计数输入,轮子每转一圈,霍尔传感器输出一个低电平脉冲。

将根据里程寄存器中的内容计算和判断出行驶里程数。

中断1用于控制定时器T1的启/停,当输入为0时关闭定时器。

此控制信号是将轮子圈数的计数经二分频后形成。

这样,每次定时器T1的开启时间刚好为转一圈的时间,根据轮子的周长就可以计算出自行车的速度。

10
图 3.1 系统整体流程图
主要内存单元及用处:
50H:EEPROM 器件寻址字节存放单元
51H:EEPROM 传送字节数存放单元
30H:EEPROM 发送数据缓冲单元
40H:EEPROM 读出数据存放单元
0A0H:EEPROM 寻址字节写入
0A1H:EEPROM 寻址字节读出
62H:DPTR 计数扩展高8位
6CH:定时器T1计数扩展高8位
6DH:定时器T1计数扩展高8—16位
60H 、61H 、62H:里程计数单元
68H 、69H 、6AH 、6BH:存放自行车每圈时间数
70H 、71H 、72H 、73H:显示BCD 码数据存放用
11H--15H:存放被除数
16H —19H:存放除
(1)初始化程序
初始化程序主要完成以下工作:将T1设为外部控制定时器方式;外部中断0及初始化
P3.0=1?
计算里程 显示里程 计算速度
显示速度
N
开始
Y
外部中断1设为边沿触发方式;将部分内存单元清0;设置轮子周长;开中断及定时器;将EEPROM中的数据调入内存。

CLEARMEN:MOV TMOD,#90H ;T1为16位外部控制定时器
MOV SP,#75H ;堆栈从75H开始
SETB PX0 ;外部中断0优先级为1
SETB IT0 ;外部中断0用边沿触发
SETB IT1 ;外部中断1用边沿触发
CLR A ;清A
MOV 20H,A ;清内存中特定单元
MOV 6CH,A ;清内存中特定单元
MOV 6DH,A ;清内存中特定单元
MOV 70H,A ;清内存中特定单元
MOV 71H,A ;清内存中特定单元
MOV 72H,A ;清内存中特定单元
MOV 73H,A ;清内存中特定单元
MOV 60H,A ;清内存中特定单元
MOV 61H,A ;清内存中特定单元 6
MOV 62H,A ;清内存中特定单元
MOV 63H,A ;清内存中特定单元
DEC A ;A为0FFH
MOV 68H,A ;内存置数据0FFH
MOV 69H,A ;内存置数据0FFH
MOV 6AH,A ;内存置数据0FFH
MOV 6BH,A ;内存置数据0FFH
MOV P1,A ;P1口置1
CLEAR1: JB P1.2,KEY1 ;根据P1.2设置状态
MOV 21H,#0FH
LJMP CLEAR2 ;转CLEAR2
KEY1: JB P1.3,KEY2 ;根据P1.3设置状态
MOV 21H,#12H
LJMP CLEAR2
KEY2: JB P1.6,KEY3 ;根据P1.6设置状态
MOV 21H,#14H
LJMP CLEAR2
KEY3: JB P1.7,ERR ;根据P1.7设置状态
MOV 21H,#19H
CLEAR2: SETB TR1 ;开定时器T1
SETB EA ;开中断允许
SETB EX0 ;开外中断0
SETB ET1 ;开定时中断T1
SETB P3.1 ;关报警器
LCALL VIICREAD ;将EEPROM中原里程数据调入内存
RET
ERR: CPL P3.1 ;未设置车轮周长,开始报警
LCALL DL5S ;延时5S
LJMP CLEAR1 ;重新初始化
初始化具体过程:首先对P1.2口的内容进行查询,若P1.2=0,则说明P1.2口接的按钮被按下,即选择第一种车轮周长,同时将周长存入21H单元内;若
P1.2=1,则第一个按钮没被按下,再对P1.3口的内容进行查询,内容为0则将其周长值存入21H中,不为0则扫描P1.6,内容为0则将其周长值存入21H中,不为0则扫描P1.7,若P1.7为0则将其周长值存入21H中,不为0则说明没有选择车轮直径,此时开始报警,并调用延时子程序。

接着再从P1.2口扫描,如此循环,直到有键按下后停止报警。

图 3.2 初始化程序流程图
(2)主程序
主程序根据P3.0口的开关状态选择里程速度显示。

START: LCALL CLEARMEN ;上电初始化
START1: JB P3.0,DISPLAYS ;P3.0=1,显示里程
LCALL DISPLAYV ;P3.0=0,显示速度
START2: SJMP START1 ;循环
初始化
P1.2=1?
N P1.3=1?
P1.6=1?
P1.7=1?
出错提示 将车圈周长调入21H
开中断,启动定时器
N
N
N Y Y Y
Y
开报警器
并延时 关报警器
图3.3 主程序流程图
(3)用外部中断0实现的里程计数程序
定时中断是为满足定时或计数的需要而设置的。

在单片机内部有两个定时/计数器,以对其中的计数结构进行计数的方法,来实现定时或计数功能。

当结构发生计数溢出时,即表明定时时间或计数值已满,这时就以计数溢出信号作为中断请求,去置位一个溢出标志,作为单片机接受中断请求的标志。

这种中断请求是在单片机芯片内部发生的,因此无须在芯片上设置引入端。

定时/计数器控制寄存器TCON 是8位寄存器,地址为88H ,可以位寻址。

其高4位用于定时/计数器中断控制,低4位借给外部中断,用做中断标志和触发方式选择位。

本设计采用定时中断,对自行车的里程和速度进行计数。

INTEX0: PUSH ACC ;累加器堆栈保护
PUSH PSW ;状态字堆栈保护
INC 60H ;圈数加1
CLR A ;清A
CJNE A,60H,INTEX0OUT ;计数器没溢出转INTEX0OUT
INC 61H ;溢出进位(61H 加1)
CJNE A,61H,INTEX0OUT ;计数器没溢出转INTEX0OUT
INC 62H ;溢出进位(62H 加1)
INTEX0OUT:LCALL VIICWRITE ;里程数据存入EEPROM
SETB EX1 ;开外部中断1 初始化
开始
P3.0=1?
调用里程处理子
程序 Y
调用速度处理子程序
N
POP PSW ;状态字恢复
POP ACC ;累加器恢复
RETI ;中断返回
;每转一圈时间计数处理程序,每圈时间放在68H—6BH单元中
INTEX1: PUSH ACC ;累加器堆栈保护
PUSH PSW ;状态字堆栈保护
CLR EX1 ;关外部中断1
JNB 00H,INTEX11 ;溢出标志为0转INTEX11
MOV TL1,#0FFH ;溢出时计时单元赋#0FFH(显示速度为零)
MOV TH1,#0FFH
MOV 6CH,#0FFH
MOV 6DH,#0FFH
INTEX11: MOV 68H,TL1 ;将时间计数值移入暂存单元68H-6BH MOV 69H,TH1
MOV 6AH,6CH
MOV 6BH,6DH
CLR A ;清A
MOV TL1,A ;计数单元置零
MOV TH1,A
MOV 6CH,A
MOV 6DH,A
CLR 00H ;清溢出标志
POP PSW ;状态字堆栈恢复
POP ACC ;累加器堆栈恢复
RETI ;中断返回
;T1计数器中断服务程序。

(计数器T1由外部中断1输入控制,当为高电平时计时开始)
INTT1: PUSH ACC ; 累加器堆栈保护
PUSH PSW ;状态字堆栈保护
INC 6CH ;6C计时单元加1
MOV A,6CH ;6C单元内容移入A
JNZ INTT11 ;不为0,转INTT11
INC 6DH ;进位,6DH单元加1
MOV A,6DH ;移入A
JNZ INTT11 ;不为0,转INTT11
SETB 00H ;计时器溢出,置溢出标志位
INTT11: POP PSW ;状态字堆栈恢复
POP ACC ;累加器堆栈恢复
RETI ;中断返回
开始
关中断
现场保护
开中断
中断处理
关中断
现场恢复
开中断
中断返回
图 3.4 中断流程图
(4)里程、速度处理程序
里程处理程序
外中断0服务程序用于对单片机P3.2口输入的圈脉冲进行计数,为十六进制计数器。

60H为低位,62H为高位。

每次计数一次后,对里程数据进行一次存储操作。

当车轮每转一圈,通过霍尔元件将脉冲数输入单片机内,通过计数器计出脉冲数,再用乘法子程序算出里程数。

SSS: MOV 19H,#64H ;除数最高位赋值
MOV 18H,#00H ;除数赋值
MOV 17H,#00H ; 除数赋值
MOV 16H,#00H ; 除数赋值
MOV 11H,#00H ; 被除数赋值
MOV 12H,#00H ; 被除数赋值
MOV 13H,62H ; 被除数赋值
MOV 14H,61H ; 被除数赋值
MOV 15H,60H ; 被除数赋值 LCALL DIVST ;调除法程序 LCALL BCDST ; 跳到二进制转BCD码程序MOV A,25H ;将25H内容移入A ANL A,#0FH ; 高四位为0
MOV 70H,A ;移入70H
MOV A,25H ; 将25H内容移入A SWAP A ;交换高低字节
ANL A,#0FH ; 高四位为0
MOV 71H,A ; 移入71H
MOV A,24H ; 将24H内容移入A ANL A,#0FH ; 高四位为0
MOV 72H,A ; 移入72H
MOV A,24H ; 将24H内容移入A SWAP A ; 交换高低字节
ANL A,#0FH ; 高四位为0
MOV 73H,A ; 移入73H
RET
开始
点亮里程指示灯
将车圈数转换成里程
显示里程值
返回
图 3.5 里程处理程序流程图
速度处理程序
外中断1服务程序用于处理轮子转动一圈后的计时数据。

当标志位(00H)为1时,计数溢出,放入最大时间值(为#0FFH);当标志位为0时,将计数单元(TL1、TH1、6CH、6DH)的值放入68H~6BH单元。

定时器计出每转一圈所用的时间,用自行车车轮的周长除以时间就得出自行车的速度。

VVV: MOV 18H,68H ;除数赋值
MOV 17H,69H ;除数赋值
MOV 16H,6AH ;除数赋值
MOV 11H,#00H ;被除数赋值
MOV 12H,#00H ;被除数赋值
MOV 13H,#36H ;被除数赋值
MOV 14H,#0EEH ;被除数赋值
MOV 15H,#80H ;被除数赋值
LCALL DIVST ;调除法程序
MOV 14H,#00H ;舍去一位
LCALL BCDST ;跳到二进制转BCD码程序
MOV A,25H ;以下将速度值放入显示单元
ANL A,#0FH ;高四位为0
MOV 70H,A ;放入70H内
MOV A,25H ;再取数
SWAP A ;高低字节交换
ANL A,#0FH ;高四位为0
MOV 71H,A ;放入71H内
MOV 72H,#00H ;72H为0
MOV 73H,#00H ;73H为0
RET ;子程序返回
开始
开速度指示灯
计算速度
N
P3.0=1?
Y
报警显示速度
返回
图 3.6速度处理程序流程图
(5)显示子程序
采用动态扫描显示接口电路,动态显示接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM各自独立地受I/O线控制。

CPU向字段输出口送出字型码时,所有显示器接收到相同的字型码,但究竟是哪个显示器亮,则取决于COM端。

可以采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。

在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

本设计P2.0、P2.1、P2.2、P2.3信号一起组成位选通的位选信号,P0.0~P0.7信号一起组成段码选通的段选信号,通过软件编程,先把所要显示的数据放入存储单元,然后把数据送入段选通对应的地址,再选通某一个LED,逐步完成四个LED的显示。

;里程显示控制程序
DISPLAYS:SETB P1.0 ;点亮LED1
CLR P1.1 ;关闭速度指示灯
SETB P3.7
LCALL SSS ;将圈数转为公里数
LCALL DISPLAY ;显示公里数据
LJMP START1 ;跳回START1
;速度显示程序
DISPLAYV:CLR P1.0 ;关闭LED1(里程指示灯)
SETB P1.1 ;点亮LED2(速度指示灯) CLR P3.7
LCALL VVV ;每圈时间换算为KM/H程序
MOV A,71H ;将十位数(BCD码)值植入A SUBB A,#04H ;与预定报警值比较
JNC WARING ;时速超过40时报警
SETB P3.1 ;关报警灯
V1: LCALL DISPLAY ;显亮一次
RET ;子程序返回
DISPLAY: MOV R1,#70H ;显示单元首址
MOV R2,#0FEH ;扫描字
PLAY: MOV A,R2 ;扫描字送入A
MOV P2,A ;放到端口P2
MOV A,@R1 ;取显示数据
ANL A,#0FH ;高四位清0
MOV DPTR,#TAB ;取段码表首址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码输出
LCALL DL1MS ;点亮1MS
INC R1 ;指向下一显示数据地址
MOV A,R2 ;取扫描字
JNB ACC.3,ENDOUT ;已扫描到第四位,转ENDOUT退出
RL A ;循环左移
MOV R2,A ;放回R2
AJMP PLAY ;转PLAY循环
ENDOUT: SETB P2.0 ;关扫描
SETB P2.1 ;关扫描
SETB P2.2 ;关扫描
SETB P2.3 ;关扫描
RET ;子程序返回
;共阴极段码表
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DB 00H
开始
显示单元首址
取显示数据
求下一位位选码
取段码表首址
修改显示单元地
送段码到P0口
送位选到P2口
N
调用延时
4位显示结束
Y
返回
图 3.5 显示程序流程图(6)延时子程序
;1ms延时程序利用循环实现延时
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2 ;循环19H次
DJNZ R6,DL1 ;循环14H次
RET
;出错闪烁利用延时255ms
DL5S: MOV R5,#0FFH
DL3: LCALL DL1MS ;调用1ms延时
DJNZ R5,DL3 ;循环255次
RET
三、调试
1.硬件调试
硬件调试时,我们首先检查了接线,对照电路原理图,确保准确无误。

其次是检查各个焊点是否有虚焊的情况,检查无误后,接通经稳压后的5V电源。

硬件的修改可在元器件参数方面调整,如电阻的阻值等。

2.软件调试
先用KEIL软件输入完整的程序,进行编译。

首先,新建一个项目选择AT89C51,新建一个文件,将程序输入,输完后保存,保存时需加后缀名.ASM。

然后将文件添加到新建的工程下。

进行检错和编译,窗口如图3.2所示。

图3.1 KEIL编译窗口
编译无误后即可运行,运行时可从Peripherals中调出输出口P0—P3来观察输出情况。

运行时窗口如图3.1所示。

图3.2 KEIL运行窗口17接着再使用PROTEUS仿真软件进行仿真。

首先新建一个文件,选择所需的元件并排列好,根据电路原理图进行布线。

当完成原理图布线后,利用PROTEUS ISIS编辑环境所提供的电器规则检查命令对设计进行检查,并根据系统提供的错误检查报告修改原理图。

直到通过电器规则检查为止。

然后在KEIL中生成HEX 文件,双击AT89C51芯片,将完整的程序灌入芯片,单击左下角的开始箭头即可开始模拟仿真。

在仿真过程中遇到过一些问题,针对这些问题做了些软件方面的调整。

刚开始仿真时,P0口是灰色的,数码管没有点亮。

经检查是由于P0口内部没有上拉电阻,因此,必须另外加上,上拉电阻一段接P0口,另一端直接接到电源的正集。

接上后数码管点亮,但显示的是乱码经过仔细的检查,发现了程序中的错误,硬件中选用的是共阴极数码管,而程序中错用了共阳极的段码表,从
而造成了应该点亮的部分没亮,而不该点亮的部分反而亮了的错误情况。

相关文档
最新文档