找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5002|回复: 0
打印 上一主题 下一主题
收起左侧

单片机自行车里程/速度计的设计论文

[复制链接]
跳转到指定楼层
楼主
ID:316967 发表于 2018-4-26 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

自行车里程/速度计的设计

摘要:本文介绍了用89C52单片机设计自行车里程/速度计,运用单片机的运算和控制功能,并采用数码管实时显示所测速度和里程的速度里程计设计方案,用分频器TC4024实现二分频,用来探讨24C01传感器的用途,通过实用电路的设计来掌握速度及里程传感器的使用方法及一些性能参数。本系统含了电子电路技术,以及常用的AT89C52单片机工作原理,通过本系统的设计,把它们俩者有机结合。

The Odometer/Speedometer’s Design Of  The Bike

Abstract: This article introduced used the Micro Computer Unit of the AT89C52 design The Odometer/Speedometer’s Of The Bike, it utilizes Micro Computer Unit's operation and control function, and it uses the nixietube real time display to measure the speed and the course speed hodometer design proposal, it realizes two frequency divisions with the frequency divider of TC4024,it uses for to discuss the 24C01 sensor's use, through the practical electric circuit's design it grasps the odometer/speedometer’s application method and some performance parameter。This system contains the electronic circuit technology, as well as the commonly used AT89C52 Micro Computer Unit's work principle, through this system's design, which pairs them organic union。


目 录
1  绪  论
2 AT89C52单片机
2.1  at89C52单片机简介
2.2  at89C52的管脚及其含义
3 TC4024
4 24C01芯片
4.1 24C01简介
4.2  24C01的特性:
5  硬件电路的设计
5.1  系统硬件电路
5.2 系统的工作原理
6 软件设计
6.1 系统内存的规划
6.2 系统的主要程序设计              9
7 系统调试
7.1  硬件调试
7.2 软件调试
8  结 论
致谢
附录: 系统完整源程序

1  绪  论

传感器,英文名字为Sensor或Transducer,亦称换能器、变换器。在科技迅速发展的今天,传感器越来倍受重视。在日常生活、航天、航空,常规武器、交通运输,机械制造、化工、生物医学工程、自动化检测工程及计量等各项领域都被广泛应用[6]。

目前,传感器已向新材料开发,集成化、智能化、数字化、新工艺,高精度化及高稳定、高可靠化等技术发展。特别是霍尔传感器,鉴于它的价廉、易于使用,使它广泛运用于里程计、速度计等[6]。

单片微型计算机简称单片机,又称微控制器,特别适用于控制领域。通常单片机由单块集成电路构成,内部包含有计算机的基本部件:CPU(中央处理器),存储器和I/O接口电路等。因此,单片机只需要与适当的软件及外部设备相结合,便可以成为一个单片机控制系统[4]。

目前,场上销售的单片机有4位、8、16位、32位,并且单片机朝着高性能多种方向发展,尤其是8位单片机以经成为当前单片机的主流,主要体现在CPU功能增强、内部资源增多、引脚的功能化、低电压和低功好耗化上[4]。

单片机因为其体积小、功能强,可靠性高,灵活方便等优点,所以可以用于各个领域,对各行各业的技术改造和产品更新换代起到重要的推动作用。

本人经过学习,用AT89C52设计了一个自行车里程/速度计。本设计可轮流显示自行车行使的里程和速度, 采用TC4024芯片作为计数器以及2C401存储数据,3个单级共阴数码管作为显示系统。本系统具有超速信响提醒功能,里程数据自动记忆,也可应用于电动自行车、摩托车、汽车等机动车仪表上。


.


2 AT89C52单片机2.1 AT89C52单片机简介

本设计选用AT89C52单片机,AT89C52是一种低功耗、高性能CMOS 8位微控制器。使用Atmel 公司高密度非易失性存储器技术制造,可与工业AT89C51 产品指令和引脚完全兼容。

2.2 AT89C52的管脚及其含义[5]

AT89C52的管脚及各管脚含义如下:

  

图2.2  89C52管脚图

各引脚功能说明

VCC——电源电压;
GND——接地;
P0口——P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用;
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻;
在FLASH编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻;
P1口——P1口是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输出口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流;
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX);
FLASH编程和程序校验期间,P1接收低8位地址;
P1.0和P1.1的第二功能
P1.0 T2(定时/计数器2外部计数脉冲输入),时钟输出 ;
P1.1 T2EX(定时/计数2捕获/重装载触发和方向控制);
P2口——P2是一个带内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流;
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容;
FLASH编程或校验时,P2亦接收高位地址和一些控制信号;
P3口——P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流;
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 INTO(外中断0)
P3.3 INT1(外中断1)
P3.4 TO(定时/计数器0)
P3.5 T1(定时/计数器1)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号;
RST——复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位;
ALE/PROG——当访问外部程存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲;
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG);
EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。

3 TC4024

本程序采用TC4024芯片,它是一个7位的计数器,计数器具有分频的作用,它包含有14个管脚,其7脚接地,14脚接+5V,1脚接AT89C52的INT0,即12脚,在系统中此芯片起到了二分频的作用。

4 24C01芯片4.1 24C01简介

24C01是一个1K位串行CMOS EEPROM,内部含有128个8位字节,CATALYST的先进CMOS技术实际上减少了器件的功耗,24C01是一个8位字节页写缓冲器,该器件通过I2C总线接口进行操作,即此芯片采用I2C协议进行读写数据。有一个专门的写保护功能。

24C01是I2C接口的,但标准51是不带I2C接口的,串口方式0是不行的,需要用IO模拟,所以随便接两个IO都可以,而且都要接上拉电阻,大概几K就行了,因为不是总线方式,所以不能用MOV指令,也不能用SBUF,要判断是否为满,可以在程序里设个变量。

在这里要注意E2P芯片的寿命(一般是读写100万次,足够了)。 存储数据的时候,可以对操作数和存储的数据进行比较,不相等则存储,这样可以增加使用寿命,比有些每隔1秒钟进行存储的会好多了。以下是24C01的管脚图:

图4.1管脚图

表3.1 24C01的管脚描述

管脚名称

功能

A0、A1、A2

器件地址选择

SDA

串行数据/地址

SCL

串行时钟

WP

写保护

VCC

+1.8V—6.0V工作电压

VSS

接地

4.2  24C01的特性:

24C01芯片具有以下特性:

  • 400KHZI2C总线兼容;
  • +1.8-6.0V工作电压范围;
  • 低功耗CMOS技术;
  • 写保护功能:当WP为高电平时进入写保护状态;
  • 页写缓冲器;
  • 自定时擦写周期;
  • 1,000,000编程擦除/周期;
  • 可保存数据100年;
  • 8DIPSOICTSSOP封装;

10 温度范围:商业级、工业级和汽车级。

5  硬件电路的设计5.1  系统硬件电路

自行车里程/速度计能自动显示自行车行驶的总里程数及行车速度,具有超速信响提醒功能,里程数据自动记忆,也可应用于电动自行车、摩托车、汽车等机动车仪表上。其硬件电路原理图如图5.1。

图  5.1系统原理图

5.2 系统的工作原理

本设计能实时地将所测的速度与累计里程数显示出来,主要是将24C01传感器输入到单片机的脉冲信号,将频率实时地测量出来,然后通过单片机计算出速度和里程,再将所得的数据存储到TC4024芯片中,通过AT89C52单片机计算出来的速度和里程的数据,必须通过BCD码的转换才能输出给数码管。最后由共阴数码管显示所测速度与里程。

自行车里程/速度计采用AT89C52单片机作控制,速度及里程传感器采用霍尔元件,其电器原理图如图5.1所示。P0口和P2口用于七段LED显示器的段码及扫描输出,在显示里程时,第三位小数点用17脚P3.7口控制点亮。P1.0和P1.1口分别用于显示里程状态和速度状态。P1.2、 P1.3、 P1.6和 P1.7口分别用于设置轮圈的大小。P3.0口的开关用于确定显示的方式,当开关闭合时,显示速度;打开时显示里程。第12脚外中断0用于对轮子圈数的计数输入,轮子每转一圈,霍尔传感器输出一个地电平脉冲。第13脚外中断1用于控制定时器T1的启停,当输入为0时关闭定时器。此控制信号是将轮子圈数的计数脉冲经二分频后形成(见图5.1),这样,每次定时器T1的开启时间刚好为转一圈的时间。根据轮子的周长就可以计算出自行车的速度。P1.4和P1.5口用于EEPROM存储器24C01的存取控制。11脚输出用于速度超速时的报警。

6 软件设计6.1 系统内存的规划

由于本系统处理功能较多,因而一部分内存单元用于特定的用处。其主

要内存单元用处如下:

50H:EEPROM器件寻址字节存放单元;

51H:EEPROM传送字节数存放单元;

30H:EEPROM发送数据缓冲单元;

40H:EEPROM读出数据存放单元;

0A0H:EEPROM寻址字节字节写;

0A1H:EEPROM寻址字节字节读;

62 H:DPTR计数器扩展高8位;

6C H:定时器T1计数器扩展高8位;

6D H:定时器T1计数器扩展高8—16位;

60 H、61 H、62 H:里程计数单元;

68 H、69 H、6A H、6B H:存放自行车每圈时间数;

70 H、71 H、72 H、73 H:显示BCD码数据存放用;

11 H—15 H:存放被除数;

16 H—19 H:存放除数。

6.2 系统的主要程序设计

1. 初始化程序

在本系统初始化程序中,主要完成以下工作:将T1设为外部控制定时器方式;外中断0及外中断1设为边沿触发方式;将部分内存单元清零;设置轮子 周长值;开中断及定时器;将EEPROM中的数据调入内存等。

2. 轮圈设置出错处理程序

   P1.2、 P1.3、 P1.6、P1.7端口的开关用于设定轮子的周长,当没有设定时(至少让一个开关闭合),能从P3.1口输出一个周期为0.5S的方波信号,用作发光管闪烁及信响器提醒。

3. 主程序

主程序根据P3.0的开关状态选择里程或速度显示,其流程图如图6.2所示。

图6.2 主程序流程图

4.里程计数程序(外中断0服务程序)

    外中断0服务程序用于对12脚输入的圈脉冲进行计数,为十六进制计数器。60H为低位,62H为高位。每计数一次后,对里程数据进行一次存储操作。

5.外中断1服务程序

外中断1服务程序用于处理轮子转动一圈后计时数据。当标志位(00H)为1时,说明计数器溢出,放入最大时间值(为#0FFH);当标志位为0时,将计数单元(TL1、TH1、6CH、6DH)的值放入68H—6BH单元。

6.EEPROM存取程序

本系统使用归一化I2C串口存取子程序,使用一条数据线和时钟线,采用ATMEL公司的24C01串口存储器,应用简单方便。

7.显示子程序

当显示里程时,先要将圈数计数器中的数据进行运算,求出总里程。当要

   显示速度时,要将轮子的这周长和转一圈的时间数相除,然后换算成Km/h单位。最后放入70H—73H,进行数据显示。

7 系统调试

要完成一个产品的设计,有很多纷繁复杂的步骤和过程,其中最为重要

和最为关键的就是系统调试。调试的步骤和方法有很多。本人也看过不少,在这次系统调试的中调试的过程我充分的发挥了仿真器的作用。


7.1  硬件调试

硬件的焊接是一个比较繁琐的过程,繁琐的地方在于3个单联数码管的

连接,线路较多,在焊接时要特别的细心,在焊接完成并烧入程序之后通电发现数码管不亮,检查了好几遍,电路无焊没有错误,于是我就怀疑可能是数码管的问题,拿去贝尔(学院的社团)测试没问题,数码管并没有烧坏。

在插入芯片时要特别注意不能把芯片插反,否则就会把芯片烧掉;也要

  注意极性电容的方向,长的脚为正,短的为负,不能把负的接+5V,正的接地;在焊接三极管时也要注意其三个管脚的排布,还有为保护三极管不被烧换,所以3个三极管要各自接一个限流电阻(这里为4.7K)。

7.2 软件调试

软件调试是调试的重点,同时也是出错最多的地方;在整个软件调试调试过程中我采取先部分后整体的调试方法。

在整个程序的编写调试过程中我首先调试的是数码管显示系统,为此我编写了以下一段程序用于数码管显示调试,要求数码管显示0、1、2。

            ORG    0000H

   MAIN:   MOV     P2, #0FFH

            MOV     P0, 0C0H

            MOV     P2, #0FEH

      ACALL   DELAY1

      MOV     P2, #0FFH

      MOV     P0, 0F9H

      MOV     P2, #0FDH

      ACALL   DELAY1

      MOV     P2, #0FFH

      MOV     P0, 0A4H

      MOV     P2, #OFBH

      MOV     P2, #0FFH

      AJMP    MAIN

DELAY1:  MOV    R6, #02H

AGAIN:  MOV     R7, #8FH

DELAY:  DJNZ     R7, DELAY

          DJNZ     R6, AGAIN

          RET

          END

结果数码管正确显示了0、1、2这三个数,显示系统调试成功。

软件测试要注意一下几点:

1.在编写I2C串行归一化存储子程序时本来出了点错,后经过多次调试才运行正确。

2.里程/速度控制程序是系统程序的重点,所以它当然也是软件调试的重点。

3.显示系统最好先调试。

4.用韦幅软件进行仿真时要充分利用其逐步调试功能。

8  结 论

本设计能自动显示自行车行驶的总里程数及行车速度,具有超速信响报警提醒以及里程数据自动记忆的功能,也可应用于电动自行车、摩托车、汽车等机动车的仪表上。由于本系统采用的是动态扫描LED显示且共阴数码管的驱动电流不是很大,所以数码管的显示不是特别亮。但可以通过更换小点的电阻增大其驱动电流(最大驱动电流不能超过20毫安)使数码管变得更亮。













致谢

首先,我要感谢宋复成老师在本次毕业设计中,宋老师不厌其烦的指导我,在整个毕业设计制作过程中,使得我在单片机方面的技能得到了进一步提高。宋老师给予了全程的帮作、鼓励与指导,在此我表示衷心的感谢!同时感谢王玉芝老师在各方面给予的帮助,使我能够有一个良好的环境,在做此课程设计时王老师还为我免费提供仿真器等器材,为我更好的完成本系统的设计提供了先决条件。

    另外,我还要感谢我的父母,没有他们的支持,我是无法完成这个系统设计的,他们给予我的,我将来一定会努力回报他们的。

最后,我还要感谢我身边的同学、朋友,他们也给了我很大的帮助。


附录: 系统完整源程序
以下是控制系统完整源程序

  1. <font color="rgb(0, 0, 0)"><font color="rgb(0, 0, 0)">;
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;; SPEED/MILE OR IKE   PROGRAM   ;;
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. ;
  6. ;
  7. ;       60H,61H,62H作里程计数单元,6CH,6DH作T1计数扩充单元,
  8. ;       68H,69H,6AH,6BH存放自行车每圈时间数,70H,71H,72H,73H
  9. ;       作显示BCD码存放数用,11H—15H存放被除数,16H-19H存放除数
  10. ;
  11. ;
  12. ; 定义
  13.         VSDA    EQU    P1.5   ; EEPROM数据传送口
  14.         VSCL    EQU      P1.4    ; EEPROM时钟传送口
  15.         SLA     EQU     50H     ; EEPROM器件寻址字节存放单元
  16.         NUMBYT  EQU    51H    ; EEPROM传送字节数存放单元
  17.         MTD     EQU     30H     ; EEPROM发送数据缓冲单元
  18.         MRD     EQU     40H     ; EEPROM读出数据存放单元
  19.         SLAW    EQU     0A0H    ; EEPROM寻址字节写
  20.         SLAR    EQU    0A1H    ; EEPROM寻址字节读
  21.         DPHH    EQU     62H     ; DPTR计数扩展高8位
  22.         TH1H    EQU     6CH     ; 定时器T1扩展高8位
  23.         TH1HH   EQU    6DH   ; 定时器T1扩展高8-16位
  24. ;
  25. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  26. ;; PRO  GRAM INPUT  ;;
  27. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  28.         ORG    0000H                                          ;程序执行开始地址
  29.         LJMP    START                                          ;跳至START
  30.         ORG     0003H                                          ;外中断0中断程序入口
  31.         LJMP    INTEX0                                          ;跳至INTEX0中断服务程序
  32.         ORG    000BH                                          ;定时器T0中断程序入口
  33.         RETI                                                                          ;中断返回
  34.         ORG     0013H                                          ;外中断1中断入口
  35.         LJMP    INTEX1                                          ; 跳至INTEX1中断服务程序
  36.         ORG     001BH                                          ; 定时器T1中断程序入口
  37.         LJMP    INTT1                                          ; 跳至INTT1中断服务程序
  38.         ORG     0023H                                          ;串口中断入口地址
  39.         RETI                                                                          ;中断返回
  40. ORG     002BH                                          ;定时器T2中断入口地址
  41.         RETI                                                                          ;中断返回
  42. ;
  43. ;
  44. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  45. ;; PROGRAM CLEAR  ;;
  46. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  47. ;上电初始化程序
  48. CLEARMEN:    MOV     TMOD, #90H    ;T1为16位外部控制定时器
  49.                 MOV     SP, #75H         ;堆栈在75H开始
  50.                SETB     PX0           ;外中断0优先级为1
  51.                 SETB     IT0            ;外中断0用边沿触发
  52.                 SETB     IT1             ;外中断1用边沿触发
  53.                 MOV     20H, A           ;清内存中特定单元
  54.                 MOV     6CH, A           ;
  55.                 MOV     6DH, A           ;
  56.                 MOV    70H, A           ;
  57.                 MOV     71H, A           ;
  58.                 MOV     72H, A           ;
  59.                 MOV    73H, A           ;
  60.                 MOV     60H, A           ;
  61.                 MOV     61H, A           ;
  62.                 MOV     62H, A           ;
  63.                 MOV     63H, A          ; 清内存中特定单元
  64.                 DEC     A               ;A为#0FFH
  65.                 MOV     68H, A          ;内存置数据#0FFH
  66. MOV     69H, A           ;内存置数据#0FFH
  67. MOV     6AH, A           ;内存置数据#0FFH
  68.                 MOV     6BH, A           ;内存置数据#0FFH
  69.                 MOV     P1, A                         ;P1口置1
  70. CLEAR1:        JB      P1.2, KEY1      ;根据P1.2,P1.3,P1.6,P1.7设置状态
  71.                                                                                               ; 在21地址单元赋自行车周长
  72.                                            值
  73.                 MOV    21H, #0FH       ; 22寸自行车周长值
  74.                 LJMP    CLEAR2        ; 转CLEAR2
  75. KEY1:          JB     P1.3, KEY2     ;
  76.                 MOV    21H, #12H       ; 24寸自行车周长值
  77.                 LJMP    CLEAR2        ; CLEAR2
  78. KEY2:          JB     P1.6, KEY3     ;
  79.                 MOV    21H, #14H        ; 26寸自行车周长值
  80.                 LJMP    CLEAR2         ; 转CLEAR2
  81. KEY3:          JB     P1.7, ERR        ; 四个开关都没合上,转出错处理
  82.                 MOV    21H, #19H       ; 28寸自行车周长值
  83. CLEAR2:        SETB    TR1            ; 开定时器T1
  84.                 SETB    EA              ; 开中断允许
  85.                 SETB    EX0             ; 开外中断0
  86.                 SETB    ET1             ; 开定时中断T1
  87.                 SETB    P3.1             ; 关报警器
  88.   LCALL  VIICREAD       ; 将EEPROM中原里程数据调入
  89. 内存
  90.                 RET                                                       ; 子程序返回
  91. ERR:           CPL    P3.1             ; 轮周长设置出错,LED灯闪
  92. 提醒
  93.                 ALL     DL5S             ; 延时
  94.                 LJMP   CLEAR1         ; 重新初始化,等待轮周长设置开关合上              
  95. ;
  96. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  97. ;; PROGRAM START  ;;
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99. ;
  100. START:          LCALL   CLEARMEN      ; 上电初始化
  101. START1:         JB       P3.0, DISPLAYS  ; P3.0=1,显示里程
  102.                  LCALL   DISPLAYV       ; 显示速度
  103. START2:         SJMP    START1         ; 转START1循环
  104. ;
  105. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  106. ;; INTEX0 PROGRAM  ;;
  107. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  108. ; 里程计数程序,用外中断0实现,计数用60H-62H内存单元。
  109. INTEX0:       PUSH    ACC             ; 累加器堆栈保护
  110.                PUSH    PSW                          ; 状态字堆栈保护
  111.                INC      60H                          ; 圈加1
  112.                CLR      A                           ; 清A
  113.                CJNE     A, 60H, INTEX0OUT  ; 计数没溢出转INTEX0OUT
  114.                INC      61H            ; 溢出进位(61H加1)
  115.                CJNE     A, 61H, INTEX0OUT ; 计数没溢出转INTEX0OUT
  116.                INC      62H                         ; 溢出进位(62H加1)
  117. INTEX0OUT:   LCALL   VIICWRITE        ; 里程数据存入EEPROM
  118.                SETB     EX1                          ; 开外中断1
  119.                POP      PSW                          ; 状态字恢复
  120.                POP      ACC             ; 累加器恢复
  121.                RETI                                                         ; 中断返回
  122. ;
  123. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  124. ;; INTEX1 PROGRAM ;;
  125. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  126. ; 每转1圈时间计数处理程序,每圈时间放在68H-6BH单元中。
  127. INTEX1:        PUSH     ACC             ; 堆栈保护
  128.                 PUSH    PSW           ;
  129.                 CLR      EX1            ; 关外中断1
  130.                 JNB      00H, INTEX11      ; 溢出标志为0转INTEX11
  131.                 MOV     TL1, #0FFH       ; 溢出时计时单元赋#0FFH(显示速度为零)
  132.                 MOV     TH1, #0FFH       ;
  133.                 MOV     6CH, #0FFH      ;
  134.                 MOV     6DH, #0FFH       ;
  135. INTEX11:       MOV  68H, TL1        ; 将时间计数值移入暂存单元68H-6BH
  136.                 MOV     69H, TH1        ;
  137.                 MOV     6AH, 6CH      ;
  138.                 MOV     6BH, 6DH      ;
  139.                 CLR      A               ; 清A
  140.                 MOV     TL1, A            ; 计时单元置0
  141.                 MOV     TH1, A           ;
  142.                 MOV    6CH, A           ;
  143.                 MOV    6DH, A         ;
  144.                 CLR      00H             ; 清溢出标志
  145.                 POP      PSW                          ; 堆栈恢复
  146.                 POP    ACC             ;
  147.                 RETI                      ; 中断返回
  148. ;
  149. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  150. ;; INTT1 PROGRAM  ;;
  151. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  152. ;
  153. ; T1计数器中断服务程序。(计数器T1由外中断1输入控制,当为高电平时计时开始)
  154. INTT1:          PUSH    ACC             ; 堆栈保护
  155.                 PUSH    PSW                          ;
  156.                 INC     6CH                       ; 6CH计时单元加1
  157.                 MOV    A, 6CH                      ; 移入A
  158.                 JNZ     INTT11          ; 不等于0转INTT11
  159.                 INC     6DH                        ; 进位,6DH单元加1
  160.                 MOV    A, 6DH                       ; 移入A
  161.                 JNZ     INTT11          ; 不等于0转INTT11
  162.                 SETB   00H                       ; 计时器溢出,置溢出标志
  163. INTT11:         POP     PSW                        ; 恢复堆栈
  164.                 POP     ACC                        ;
  165.                 RETI                                                        ; 中断返回
  166. ;
  167. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  168. ;; DISPLAY S    ;;
  169. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  170. ;
  171. ;里程显示控制程序
  172. DISPLAYS:      SETB    P1.0           ; 点亮LED1(显示里程状态)
  173.                 CLR     P1.1             ; 关闭速度指示灯
  174.                 SETB    P3.7           ; 显示小数点(最小显示为0.1公里)
  175.                 LCALL   SSS             ; 将圈数转为公里数
  176.                 LCALL   DISPLAY       ; 显示公里数据
  177.                 LJMP    START1         ; 跳回START1
  178. ;
  179. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  180. ;; DISPLAY V ;;
  181. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  182. ;速度显示控制程序
  183. DISPLAYV:      CLR     P1.0           ; 关闭LED1(里程)灯
  184.                 SETB    P1.1          ; 点亮LED2(显示时速状态)
  185.                 CLR     P3.7          ; 关小数点显示
  186.                 LCALL   VVV         ; 每圈时间换算为公里/小时程序
  187.                 MOV   A, 71H       ; 将十位数(BCD码)值移入A
  188.                 SUBB   A, #04H       ; 与预定报警值比较
  189.                 JNC     WARING       ; 时速超过40时报警
  190.                 SETB    P3.1          ; 关报警灯
  191. V1:             LCALL   DISPLAY       ; 显亮一次(为了改善闪烁)
  192.                 RET                                          ; 子程序返回
  193. WARING:       CLR     P3.1           ; 报警灯LED3点亮(并呜叫)
  194.                 AJMP    V1             ; 转V1退出
  195. ;
  196. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  197. ;; VIIC WRITE    ;;
  198. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  199. ;归一化EEPROM存入程序(12M时钟),存入数在50H起单元
  200. VIICWRITE:     ACALL   WMOV9
  201.                 MOV     SLA, #SLAW
  202.                 MOV     NUMBYT, #09H
  203.                 LCALL   WRNBYT
  204.                 RET
  205. WMOV9:       MOV     5FH, #50H
  206.                 MOV     R0, #MTD
  207.                 MOV     R1, #5FH
  208.                 MOV     R2, #09H
  209. WMOV:         MOV     A, @R1
  210.                 MOV     @R0, A
  211.                 INC    R0
  212.                 INC    R1
  213.                 DJNZ     R2, WMOV
  214.                 RET
  215. ;
  216. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  217. ;;  VIICRE AD      ;;
  218. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  219. ; 归一化EEPROM读出程序(12M时钟),读出数放入60H-67H单元
  220. VIICREAD:      MOV     MTD, #50H   
  221.                 MOV     SLA, #SLAW
  222.                 MOV     NUMBYT, #01H
  223.                 LCALL   WRNBYT
  224.                 MOV     SLA, #SLAR
  225.                 MOV     NUMBYT, #08H
  226.                 LCALL   RDNBYT
  227.                 ACALL   RMOV8
  228.                 RET
  229. RMOV8:       MOV     R0, #MRD
  230.                 MOV     R1, #60H
  231.                 MOV     R2, #08H
  232. RMOV:       MOV     A, @R0
  233.               MOV     @R1, A
  234.                 INC    R0
  235.                 INC    R1
  236.                 DJNZ    R2, RMOV
  237.                 RET
  238. ;
  239. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  240. ;; VIIC   PROGRAM  ;;
  241. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  242. ; I2C串行归一化存储子程序
  243. STA:            SETB    VSDA
  244.                 SETB    VSCL
  245.                 NOP
  246.                 NOP
  247.                 NOP
  248.                 NOP
  249.                 CLR     VSDA
  250.                 NOP
  251.                 CLR     VSDA
  252.                 NOP
  253.                 NOP
  254.                 NOP
  255.                 NOP
  256.                 CLR     VSCL
  257.                 RET
  258. STOP:           CLR     VSDA
  259.                 SETB    VSCL
  260.                 NOP
  261.                 NOP
  262.                 NOP
  263.                 NOP
  264.                 SETB    VSDA
  265.                 NOP
  266.                 NOP
  267.                 NOP
  268.                 NOP
  269.                 CLR     VSDA
  270.                 CLR     VSCL
  271.                 RET
  272. MACK:         CLR     VSDA
  273.                 SETB    VSCL
  274.                 NOP
  275.                 NOP
  276.                 NOP
  277.                 NOP
  278.                 CLR     VSCL
  279.                 SETB    VSDA
  280.                 RET
  281. MNACK:        SETB    VSDA
  282.                 SETB    VSCL
  283.                 NOP
  284.                 NOP
  285.                 NOP
  286.                 NOP
  287.                 CLR     VSCL
  288.                 CLR     VSDA
  289.                 RET
  290. CACK:        SETB    VSDA
  291.                 SETB    VSCL
  292.                 CLR   F0
  293.                 MOV   C, VSDA
  294.                 JNC     CEND
  295.                 SETB    F0
  296. CEND:          CLR     VSCL
  297.                 RET
  298. WRBYT:        MOV     R0, #08H
  299. WLP:           RLC     A
  300.                 JC      WR1
  301.                 AJMP    WR0
  302. WLP1:          DJNZ    R0, WLP
  303.                 RET
  304. WR1:           SETB    VSDA
  305.                 SETB    VSCL
  306.                 NOP
  307.                 NOP
  308.                 NOP
  309.                 NOP
  310.                 CLR     VSCL
  311.                 CLR     VSDA
  312.                 AJMP    WLP1
  313. WR0:           CLR     VSDA
  314.                 SETB    VSCL
  315.                 NOP
  316.                 NOP
  317.                 NOP
  318.                 NOP
  319.                 CLR     VSCL
  320.                 AJMP    WLP1
  321. RDBYT:         MOV     R0, #08H
  322. RLP:            SETB    VSDA
  323.                 SETB    VSCL
  324.                 MOV     C, VSDA
  325.                 MOV     A, R2
  326.                 RLC    A
  327.                 MOV     R2, A
  328.                 CLR     VSCL
  329.                 DJNZ    R0, RLP
  330.                 RET
  331. WRNBYT:       MOV     R3, NUMBYT
  332.                LCALL   STA
  333.                 MOV    A, SLA
  334.                 LCALL  WRBYT
  335.                 LCALL  CACK
  336.                 JB       F0, WRNBYT
  337.               MOV    R1, #MTD
  338. WRDA:         MOV    A, @R1
  339.                 LCALL   WRBYT
  340.                 LCALL   CACK
  341.                 JB     F0, WRNBYT
  342.                 INC      R1
  343.                 DJNZ      R3, WRDA
  344.                 LCALL   STOP
  345.                 RET
  346. RDNBYT:       MOV    R3, NUMBYT
  347.                 LCALL  STA
  348.                 MOV    A, SLA
  349.                 LCALL   WRBYT
  350.                 LCALL   CACK
  351.                 JB     F0, RDNBYT
  352. RDN:          MOV     R1, #MRD
  353. RDN1:         LCALL   RDBYT
  354.                 MOV   @R1, A
  355.                 DJNZ   R3, ACK
  356.                 LCALL   MNACK
  357.                 LCALL   STOP
  358.                 RET
  359. ACK:          LCALL   MACK
  360.                 INC     R1
  361.                SJMP   RDN1
  362. ;
  363. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  364. ;; DISPLAY PROGRAM ;;
  365. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  366. ; 显示程序。显示BCD码在70H-73H单元内,采用共阴LED数码管
  367. DISPLAY:      MOV    R1, #70H                               ; 显示单元首址
  368.                 MOV     R2, #0FEH                               ; 扫描字
  369. PLAY:           MOV     A, R2                                             ; 扫描字入A
  370.                 MOV     P2, A                                             ; 放到端口
  371.                 MOV     A, @R1                               ; 取显示数据
  372.                 ANL    A, #0FH                               ; 去掉高四位(为0)
  373.                 MOV     DPTR, #TAB                 ; 取段码表首址
  374.                 MOVC    A, @A+DPTR                 ; 查显示数据对应段码
  375.                 MOV     P0,A                                             ; 段码输出
  376.                 LCALL   DL1MS                                   ; 点亮1毫秒
  377.                 INC    R1                                                 ; 指向下一显示数据地址
  378.                 MOV     A, R2                                             ; 取扫描字
  379.                 JNB     ACC.3, ENDOUT  ; 已扫描到第四位,转ENDOUT退出
  380.                 RL      A                                                  ; 循环左移
  381.                 MOV     R2, A                                             ; 放回R2
  382.                 AJMP    PLAY                                             ; 转PLAY循环
  383. ENDOUT:       SETB    P2.0                                   ; 关扫描
  384.                 SETB    P2.1                                             ; 关扫描
  385.                 SETB    P2.2                                             ; 关扫描
  386.                 SETB    P2.3                                             ; 关扫描
  387.                 RET                                                                             ; 扫描结束
  388. ;共阴段码表(可显示0-F)
  389. TAB:          DB     3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
  390.                 DB     7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
  391.               DB      00H
  392. ;
  393. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  394. ;; SSS PROGRAM  ;;
  395. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  396. ; 里程处理程序,将自行车圈数据换算成公里数
  397. SSS:            MOV     19H, #64H                               ; 除数最高位赋值
  398.                 MOV     18H, #00H                               ; 除数赋值
  399.                 MOV     17H, #00H                               ; 除数赋值
  400.                 MOV     16H, #00H                               ; 除数赋值
  401.                 MOV     11H, #00H                               ; 被除数赋值
  402.                 MOV     12H, #00H                               ; 被除数赋值
  403.                 MOV    13H, 62H                               ; 被除数赋值
  404.                 MOV     14H, 61H                               ; 被除数赋值
  405.                 MOV    15H, 60H                               ; 被除数赋值
  406.                 LCALL    DIVST       ; 调除法程序
  407. LCALL    BCDST       ; 调二进制转BCD码程序
  408.                 MOV                   A, 25H                                  ; 结果处理,将25H数移入A
  409. ANL                   A, #0FH                               ; 将高四位置为0
  410.                 MOV               70H, A                                   ; 放入70H单元
  411.                 MOV                   A, 25H                               ; 25H数移入A
  412.                 SWAP                A                                             ; 高低四位交换
  413.                 ANL                   A, #0FH                               ; 将高四位置为0
  414.                 MOV                  71H, A                               ; 放入71H单元
  415.                 MOV                   A, 24H                               ; 24H数移入A
  416.                 ANL                   A, #0FH                               ; 将高四位置为0
  417.                 MOV                 72H, A                               ; 放入72H单元
  418.                 MOV                 A, 24H                               ; 24H数移入A
  419.                 SWAP              A                                                 ; 高低四位交换
  420.                 ANL                 A, #0FH                               ; 将高四位置为0
  421.                 MOV               73H, A                               ; 放入73H单元
  422.                 RET                                                                             ; 子程序返回
  423. ;
  424. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  425. ;; VVV PROGRAM    ;;
  426. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  427. ; 时速处理程序,最大显示速度为99公里/小时(用作自行车)
  428. VVV:          MOV     18H,68H                               ; 除数赋值
  429.                 MOV     17H,69H                               ; 除数赋值
  430.                 MOV     16H,6AH                               ; 除数赋值
  431.                 MOV     11H,#00H                               ; 被除数赋值
  432.                 MOV     12H,#00H                               ; 被除数赋值
  433.                 MOV     13H, #36H                               ; 被除数赋值
  434.                 MOV     14H, #0EEH                              ; 被除数赋值
  435.                 MOV     15H, #80H                               ; 被除数赋值
  436.                 LCALL    DIVST           ; 调除法程序
  437.                 MOV     14H, #00H                               ; 舍去一位
  438.                 LCALL   BCDST         ;二进制转BCD码程序
  439.                 MOV                 A, 25H                      ;以下将速度值放入显示单元
  440.                 ANL                 A, #0FH                      ;高四位为0
  441.                 MOV                 70H, A                     ;放入70H内
  442.                 MOV                  A, 25H                                    ;再取数
  443.                 SWAP              A                                                  ;高低四交换
  444.                 ANL               A, #0FH                                 ;高四位为0
  445.                 MOV                  71H, A                                 ;放入71H内
  446.                 MOV      72H, #00H                     ;72H为0(高二位LED显示0)
  447.                 MOV                   73H, #00H                     ;73H为0
  448.                 RET                                                                              ;子程序返回
  449. ;
  450. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  451. ;     DL1MS    ;;
  452. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  453. ;1毫秒延时程序,LED点亮用
  454. DL1MS:         MOV   R6, #14H
  455. DL1:            MOV   R7, #19H
  456. DL2:            DJNZ    R7, DL2
  457.                 DJNZ    R6, DL1
  458.                 RET
  459. ;
  460. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  461. ;     DL0.5S    ;;
  462. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  463. ;出错闪烁用延时(255毫秒)
  464. DL5S:           MOV     R5, #0FFH
  465. DL3:            LCALL     DL1MS
  466.                 DJNZ     R5, DL3
  467.                 RET


  468. ;
  469. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  470. ; 除法子程序   ;;
  471. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  472. ;除法子程序,用作四位除法,除数在16H-19H,被除数在11H-15H。
  473. DIVST:           CLR                 C                   ;运算开始
  474.                  MOV                A, 13H
  475.                  SUBB                A, 18H
  476.                  MOV                 A, 12H
  477.                 SUBB                A, 17H
  478.                  MOV                 A, 11H
  479.                  SUBB                A, 16H
  480.                  JNC                    LOOP4
  481.                  MOV      B, #10H
  482.       NDIV1:  CLR                  C
  483.                  MOV                  A, 15H
  484.                  RLC                  A
  485.                  MOV      15H, A
  486.                  MOV                  A, 14H
  487.                  RLC                  A
  488.                  MOV                  14H, A
  489.                  MOV                  A, 13H
  490.                  RLC                  A
  491.                  MOV                  13H, A
  492.                  MOV                  A, 12H
  493.                RLC                  A
  494.                 MOV                  12H, A
  495.                 MOV                  A, 11H
  496.               RLC     A
  497.                  MOV                  11H, A
  498.                  MOV                  F0, C
  499.                  CLR                  C
  500.                  MOV               A, 13H
  501.                  SUBB                 A, 18H
  502.                 MOV               1AH, A
  503.                 MOV                   A, 12H
  504.                 SUBB                 A, 17H
  505.                   MOV               19H, A
  506.                  MOV                 A, 11H
  507.                  SUBB               A, 16H
  508.                 JB                  F0, NDIV2
  509. JC                  NDIV3
  510.       NDIV2:    MOV                  11H, A
  511.                 MOV                  A, 19H
  512.                  MOV                  12H, A
  513.                  MOV                  A, 1AH
  514.                 MOV                  13H, A
  515.                INC                  15H
  516.        NDIV3:    DJNZ                 B, NDIV1
  517.                CLR                  F0
  518. DIVEND:   RET
  519.         LOOP4:  SETB                  F0
  520.                 SJMP                  DIVEND
  521. ;
  522. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  523. ;;  BCD码转换程序  ;;
  524. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  525. ;将14H、15H单元内数据转换成十进制BCD码放在24H、25H单元内。
  526.                    BCDST:   MOV                   R7, #10H
  527.                             CLR                  C
  528.                            MOV                 25H, #00H
  529.                  MOV                 24H, #00H
  530.                     KKK:    MOV                 A, 15H
  531.                  RLC                  A
  532.                  MOV                  15H, A
  533.                               MOV                  A, 14H
  534.                  RLC     A
  535.                  MOV    14H, A
  536.                  MOV                  A, 25H
  537.                  ADDC    A, 25H
  538.                             DA                               A
  539.                             MOV                  25H, A
  540.                             MOV                  A, 24H
  541.                             ADDC                  A, 24H
  542.               DA                  A
  543.                             MOV                  24H, A
  544.                             DJNZ                 R7, KKK
  545. RET
  546. END                                                        ;程序结束</font></font>
复制代码


完整的Word格式文档51黑下载地址:

自行车里程速度计的设计毕业论文.doc (316.5 KB, 下载次数: 22)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表