搜索
您的当前位置:首页正文

自行车里程速度计的设计

来源:哗拓教育
-----WORD格式--可编辑--专业资料-----

1 、引 言 ................................ 错误!未定义书签。 2 、AT89C52单片机 ......................................... 2 2.1 AT89C52单片机简介 ................................... 2 2.2 AT89C52的管脚及其含义 ............................... 3 3 、TC4024 ................................................ 8 4、 24C01芯片 ............................................. 9 4.1 24C01简介 ........................................... 9 4.2 24C01的特性: ...................................... 10 5 、硬件电路的设计 ....................................... 11 5.1 系统硬件电路 ....................................... 11 5.2 系统的工作原理 ..................................... 12 6、软件设计 .............................................. 13 6.1 系统内存的规划 ...................................... 13 6.2 系统的主要程序设计 .................................. 13 7 、系统调试 ............................................. 16 7.1 硬件调试 ........................................... 16 7.2 软件调试 ............................................................. 16 参考文献

............................................ 18

1 引 言 传感器,英文名字为Sensor或Transducer,亦称换能器、变

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

换器。在科技迅速发展的今天,传感器越来倍受重视。在日常生活、航天、航空,常规武器、交通运输,机械制造、化工、生物医学工程、自动化检测工程及计量等各项领域都被广泛应用。 目前,传感器已向新材料开发,集成化、智能化、数字化、新工艺,高精度化及高稳定、高可靠化等技术发展。特别是霍尔传感器,鉴于它的价廉、易于使用,使它广泛运用于里程计、速度计等 。 单片微型计算机简称单片机,又称微控制器,特别适用于控制领域。通常单片机由单块集成电路构成,内部包含有计算机的基本部件:CPU(中央处理器),存储器和I/O接口电路等。因此,单片机只需要与适当的软件及外部设备相结合,便可以成为一个单片机控制系统。 目前,场上销售的单片机有4位、8、16位、32位,并且单片机朝着高性能多种方向发展,尤其是8位单片机以经成为当前单片机的主流,主要体现在CPU功能增强、内部资源增多、引脚的功能化、低电压和低功好耗化上。 单片机因为其体积小、功能强,可靠性高,灵活方便等优点,所以可以用于各个领域,对各行各业的技术改造和产品更新换代起到重要的推动作用。 本人经过学习,用AT89C52设计了一个自行车里程/速度计。本设计可轮流显示自行车行使的里程和速度, 采用TC4024芯片作为计数器以及2C401存储数据,3个单级共阴数码管作为显示系统。本系统具有超速信响提醒功能,里程数据自动记忆,也可应用于电动自行车、摩托车、汽车等机动车仪表上。

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

本设计选用AT89C52单片机,AT89C52是一种低功耗、高性能CMOS 8

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

位微控制器。使用Atmel 公司高密度非易失性存储器技术制造,可与工业AT89C51 产品指令和引脚完全兼容。 2.2 AT89C52的管脚及其含义

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

图2.289C52管脚图

各引脚功能说明:

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

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”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流;

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

在访问外部程序存储器或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输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲; 对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG); EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。

3 TC4024

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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

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,

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

要判断是否为满,可以在程序里设个变量。

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

图4.1管脚图 表4.1 24C01的管脚描述

管脚名称 A0、A1、A2 SDA SCL WP VCC VSS

4.2 24C01的特性:

24C01芯片具有以下特性:

--完整版学习资料分享----

功能 器件地址选择 串行数据/地址 串行时钟 写保护

+1.8V—6.0V工作电压 接地

-----WORD格式--可编辑--专业资料-----

1. 与400KHZ的I2C总线兼容; 2. +1.8-6.0V工作电压范围; 3. 低功耗CMOS技术;

4. 写保护功能:当WP为高电平时进入写保护状态; 5. 页写缓冲器; 6. 自定时擦写周期;

7. 1,000,000编程擦除/周期; 8. 可保存数据100年;

9. 8脚DIP、SOIC、TSSOP封装; 10 温度范围:商业级、工业级和汽车级。 5 硬件电路的设计 5.1 系统硬件电路

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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

图5.1系统原理图

5.2 系统的工作原理

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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

自行车里程/速度计采用AT89C52单片机作控制,速度及里程传感器采用霍尔元件,其电器原理图如上图所示。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时关闭定时器。此控制信号是将轮子圈数的计数脉冲经二分频后形成,这样,每次定时器T1的开启时间刚好为转一圈的时间。根据轮子的周长就可以计算出自行车的速度。P1.4和P1.5口用于EEPROM存储器24C01的存取控制。11脚输出用于速度超速时的报警。

6 软件设计

6.1 系统内存的规划

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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

要内存单元用处如下:

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端口的开关用于设定轮子的周长,当

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

没有设定时(至少让一个开关闭合),能从P3.1口输出一个周期为0.5S的方波信号,用作发光管闪烁及信响器提醒。 3.里程计数程序(外中断0服务程序)

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

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

5.EEPROM存取程序

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

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

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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

7 调试 7.1 硬件调试

硬件的焊接是一个比较繁琐的过程,线路较多,在焊接时要特别的细心。在插入芯片时要特别注意不能把芯片插反,否则就会把芯片烧掉;也要

注意极性电容的方向,长的脚为正,短的为负,不能把负的接+5V,正的接地;在焊接三极管时也要注意其三个管脚的排布,还有为保护三

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

极管不被烧换,所以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

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

参考文献

[1] 李玉峰、倪虹霞. MCS-51系列单片机原理与接口技术. 第一版.

北京:

人民邮电出版社. 2004

[2] 周兴华. 手把手教你学单片机. 第一版.北京:北京航空航天大

学出版社. 2005

[3] 曾一江. 单片微机原理与接口技术. 第一版.北京:科学出版社.

2006

[4] 张俊谟. 单片机中级教程—原理与应用. 第二版. 北京:北京航

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

空航天大学出版社. 2006. P1-11

[5] 张友德 、赵志英、涂时亮. 单片机微型机原理、应用与实验.

第五版.上海:复旦大学出版社. 2006. P24-27

[6] 吕泉. 现代传感器原理及应用. 第一版. 北京:清华大学出版社.

2006. P1-5

[7] 张毅刚、彭喜元. 单片机原理与应用设计. 第一版. 哈尔滨:哈尔滨工业大学.

[8] 谢自美.电子线路设计.实验.测试[M].武汉:华中科技大学出版

社,2000

[9] 曲家骇,王季秩 ,伺服控制系统中的传感器

[10] 邬宽民.单片机外围器件实用手册,数据传输接口器件分册.北京.

北京航空航天大学出版社.2001:189-195

[11] 王贵悦,新编传感器实用手册.水利电力出版社.2002:67-89 [12] 《自行车电子里程表的初步设计》 刁文兴 南京工业职业技术学

院 后勤总公司 江苏 南京

[13] 《数字式汽车里程表的设计》 诸德宏, 潘天红, 朱湘临 江苏

大学电气信息工程学院 , 江苏 镇江

[14] 《电子车速里程表的单片机实现方案》王锁弘, 威海双丰电子

传感有限公司 山东 威海

[15] 张福学。传感器使用电路150例.中国技术出版社[M].1992年 [16] 《Embedded Microcontrollers and Processor Design》,嵌入式

微控制器与处理器设计,Greg Osborn,机械工业出版社 [17] Altium Designer (Protel),机械工业出版社

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

[18] Programming 8-bit PIC Microcontrollers in C with Interactive

Hardware Simulation, 8位单片机C语言编程:基于PIC16 ,Martin P. Bates,人民邮电出版社

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SPEED/MILE OR IKE PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 60H,61H,62H作里程计数单元,6CH,6DH作T1计数扩充单元, ; 68H,69H,6AH,6BH存放自行车每圈时间数,70H,71H,72H,73H ; 作显示BCD码存放数用,11H—15H存放被除数,16H-19H存放除数; ; 定义

VSDA EQU P1.5 ; EEPROM数据传送口 VSCL EQU P1.4 ; EEPROM时钟传送口 SLA EQU 50H ; EEPROM器件寻址字节元 NUMBYT EQU 51H ; EEPROM传送字节数单元 MTD EQU 30H ; EEPROM发送数据缓冲单元 MRD EQU 40H ; EEPROM读出数据存放单元 SLAW EQU 0A0H ; EEPROM寻址字节写 SLAR EQU 0A1H ; EEPROM寻址字节读 DPHH EQU 62H ; DPTR计数扩展高8位 TH1H EQU 6CH ; 定时器T1扩展高8位 TH1HH EQU 6DH ; 定时器T1扩展高8-16位; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PRO GRAM INPUT ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H ;程序执行开始地址 LJMP START ;跳至START

ORG 0003H ;外中断0中断程序入口

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

LJMP INTEX0 ;跳至INTEX0中断服务程序 ORG 000BH ;定时器T0中断程序入口 RETI ;中断返回 ORG 0013H ;外中断1中断入口

LJMP INTEX1 ; 跳至INTEX1中断服务程序 ORG 001BH ; 定时器T1中断程序入口 LJMP INTT1 ; 跳至INTT1中断服务程序 ORG 0023H ;串口中断入口地址 RETI ;中断返回 ORG 002BH ;定时器T2中断入口地址 RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PROGRAM CLEAR ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;上电初始化程序

CLEARMEN: MOV TMOD, #90H ;T1为16位外部控制定时器 MOV SP, #75H ;堆栈在75H开始 SETB PX0 ;外中断0优先级为1 SETB IT0 ;外中断0用边沿触发 SETB IT1 ;外中断1用边沿触发 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 ; 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,P1.3,P1.6,P1.7设置状态 ; 在21地址单元赋自行车周长值 MOV 21H, #0FH ; 22寸自行车周长值 LJMP CLEAR2 ; 转CLEAR2 KEY1: JB P1.3, KEY2 ;

MOV 21H, #12H ; 24寸自行车周长值 LJMP CLEAR2 ; CLEAR2 KEY2: JB P1.6, KEY3 ;

MOV 21H, #14H ; 26寸自行车周长值

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

LJMP CLEAR2 ; 转CLEAR2

KEY3: JB P1.7, ERR ; 四个开关都没合上,转出错处理 MOV 21H, #19H ; 28寸自行车周长值 CLEAR2: SETB TR1 ; 开定时器T1 SETB EA ; 开中断允许 SETB EX0 ; 开外中断0 SETB ET1 ; 开定时中断T1 SETB P3.1 ; 关报警器 LCALL VIICREAD ; 将EEPROM中原里程数据调入 内存

RET ; 子程序返回

ERR: CPL P3.1 ; 轮周长设置出错,LED灯闪提醒 ALL DL5S ; 延时

LJMP CLEAR1 ; 重新初始化,等待轮周长设置开关合上 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PROGRAM START ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

START: LCALL CLEARMEN ; 上电初始化

START1: JB P3.0, DISPLAYS ; P3.0=1,显示里程 LCALL DISPLAYV ; 显示速度

START2: SJMP START1 ; 转START1循环 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; INTEX0 PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 里程计数程序,用外中断0实现,计数用60H-62H内存单元。 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 POP PSW ; 状态字恢复 POP ACC ; 累加器恢复 RETI ; 中断返回 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; INTEX1 PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 每转1圈时间计数处理程序,每圈时间放在68H-6BH单元中。

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

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 ; 计时单元置0 MOV TH1, A ; MOV 6CH, A ; MOV 6DH, A ;

CLR 00H ; 清溢出标志 POP PSW ; 堆栈恢复 POP ACC ;

RETI ; 中断返回 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; INTT1 PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

; T1计数器中断服务程序。(计数器T1由外中断1输入控制,当为高电平时计时开始) INTT1: PUSH ACC ; 堆栈保护 PUSH PSW ;

INC 6CH ; 6CH计时单元加1 MOV A, 6CH ; 移入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 ; 中断返回 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; DISPLAY S ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

;里程显示控制程序

DISPLAYS: SETB P1.0 ; 点亮LED1(显示里程状态)

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

CLR P1.1 ; 关闭速度指示灯

SETB P3.7 ; 显示小数点(最小显示为0.1公里) LCALL SSS ; 将圈数转为公里数 LCALL DISPLAY ; 显示公里数据 LJMP START1 ; 跳回START1 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; DISPLAY V ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;速度显示控制程序

DISPLAYV: CLR P1.0 ; 关闭LED1(里程)灯

SETB P1.1 ; 点亮LED2(显示时速状态) CLR P3.7 ; 关小数点显示

LCALL VVV ; 每圈时间换算为公里/小时程序 MOV A, 71H ; 将十位数(BCD码)值移入A SUBB A, #04H ; 与预定报警值比较 JNC WARING ; 时速超过40时报警 SETB P3.1 ; 关报警灯

V1: LCALL DISPLAY ; 显亮一次(为了改善闪烁) RET ; 子程序返回

WARING: CLR P3.1 ; 报警灯LED3点亮(并呜叫) AJMP V1 ; 转V1退出 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; VIIC WRITE ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;归一化EEPROM存入程序(12M时钟),存入数在50H起单元 VIICWRITE: ACALL WMOV9

MOV SLA, #SLAW MOV NUMBYT, #09H LCALL WRNBYT RET

WMOV9: MOV 5FH, #50H MOV R0, #MTD MOV R1, #5FH MOV R2, #09H WMOV: MOV A, @R1 MOV @R0, A INC R0 INC R1

DJNZ R2, WMOV RET ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; VIICRE AD ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

; 归一化EEPROM读出程序(12M时钟),读出数放入60H-67H单元 VIICREAD: MOV MTD, #50H MOV SLA, #SLAW MOV NUMBYT, #01H LCALL WRNBYT MOV SLA, #SLAR MOV NUMBYT, #08H LCALL RDNBYT ACALL RMOV8 RET

RMOV8: MOV R0, #MRD MOV R1, #60H MOV R2, #08H RMOV: MOV A, @R0 MOV @R1, A INC R0 INC R1

DJNZ R2, RMOV RET ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; VIIC PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; I2C串行归一化存储子程序 STA: SETB VSDA SETB VSCL NOP NOP NOP NOP

CLR VSDA NOP

CLR VSDA NOP NOP NOP NOP

CLR VSCL RET

STOP: CLR VSDA SETB VSCL NOP NOP NOP NOP

SETB VSDA

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

NOP NOP NOP NOP

CLR VSDA CLR VSCL RET

MACK: CLR VSDA SETB VSCL NOP NOP NOP NOP

CLR VSCL SETB VSDA RET

MNACK: SETB VSDA SETB VSCL NOP NOP NOP NOP

CLR VSCL CLR VSDA RET

CACK: SETB VSDA SETB VSCL CLR F0 MOV C, VSDA JNC CEND SETB F0 CEND: CLR VSCL RET

WRBYT: MOV R0, #08H WLP: RLC A JC WR1 AJMP WR0 WLP1: DJNZ R0, WLP RET

WR1: SETB VSDA SETB VSCL NOP NOP NOP NOP

CLR VSCL

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

CLR VSDA AJMP WLP1 WR0: CLR VSDA SETB VSCL NOP NOP NOP NOP

CLR VSCL AJMP WLP1 RDBYT: MOV R0, #08H RLP: SETB VSDA SETB VSCL MOV C, VSDA MOV A, R2 RLC A MOV R2, A CLR VSCL DJNZ R0, RLP RET

WRNBYT: MOV R3, NUMBYT LCALL STA MOV A, SLA LCALL WRBYT LCALL CACK

JB F0, WRNBYT MOV R1, #MTD WRDA: MOV A, @R1 LCALL WRBYT LCALL CACK

JB F0, WRNBYT INC R1

DJNZ R3, WRDA LCALL STOP RET

RDNBYT: MOV R3, NUMBYT LCALL STA MOV A, SLA LCALL WRBYT LCALL CACK

JB F0, RDNBYT RDN: MOV R1, #MRD RDN1: LCALL RDBYT MOV @R1, A DJNZ R3, ACK LCALL MNACK

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

LCALL STOP RET

ACK: LCALL MACK INC R1 SJMP RDN1 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; DISPLAY PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 显示程序。显示BCD码在70H-73H单元内,采用共阴LED数码管 DISPLAY: MOV R1, #70H ; 显示单元首址 MOV R2, #0FEH ; 扫描字 PLAY: MOV A, R2 ; 扫描字入A MOV P2, A ; 放到端口 MOV A, @R1 ; 取显示数据

ANL A, #0FH ; 去掉高四位(为0) MOV DPTR, #TAB ; 取段码表首址 MOVC A, @A+DPTR ; MOV P0,A ; 段码输出

LCALL DL1MS ; 点亮1毫秒

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 ; 扫描结束 ;共阴段码表(可显示0-F)

TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H DB 00H ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SSS PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 里程处理程序,将自行车圈数据换算成公里数

SSS: MOV 19H, #64H ; 除数最高位赋值 MOV 18H, #00H ; 除数赋值 MOV 17H, #00H ; 除数赋值 MOV 16H, #00H ; 除数赋值 MOV 11H, #00H ; 被除数赋值

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

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 ; 子程序返回 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; VVV PROGRAM ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 时速处理程序,最大显示速度为99公里/小时(用作自行车) 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(高二位LED显示0) MOV 73H, #00H ;73H为0

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

RET ;子程序返回 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DL1MS ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;1毫秒延时程序,LED点亮用

DL1MS: MOV R6, #14H DL1: MOV R7, #19H DL2: DJNZ R7, DL2 DJNZ R6, DL1 RET ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DL0.5S ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;出错闪烁用延时(255毫秒)

DL5S: MOV R5, #0FFH DL3: LCALL DL1MS DJNZ R5, DL3 RET ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 除法子程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;除法子程序,用作四位除法,除数在16H-19H,被除数在11H-15H。 DIVST: CLR C ;运算开始 MOV A, 13H SUBB A, 18H MOV A, 12H SUBB A, 17H MOV A, 11H SUBB A, 16H JNC LOOP4 MOV B, #10H NDIV1: CLR C MOV A, 15H RLC A MOV 15H, A MOV A, 14H RLC A

MOV 14H, A MOV A, 13H RLC A

MOV 13H, A

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

MOV A, 12H RLC A MOV 12H, A MOV A, 11H RLC A

MOV 11H, A MOV F0, C CLR C MOV A, 13H SUBB A, 18H MOV 1AH, A MOV A, 12H SUBB A, 17H MOV 19H, A MOV A, 11H SUBB A, 16H JB F0, NDIV2 JC NDIV3

NDIV2: MOV 11H, A MOV A, 19H MOV 12H, A MOV A, 1AH MOV 13H, A INC 15H

NDIV3: DJNZ B, NDIV1 CLR F0 DIVEND: RET

LOOP4: SETB F0 SJMP DIVEND ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; BCD码转换程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;将14H、15H单元内数据转换成十进制BCD码放在24H、25H单元内。 BCDST: MOV R7, #10H CLR C

MOV 25H, #00H MOV 24H, #00H KKK: MOV A, 15H RLC A

MOV 15H, A MOV A, 14H RLC A MOV 14H, A MOV A, 25H ADDC A, 25H

--完整版学习资料分享----

-----WORD格式--可编辑--专业资料-----

DA A RET

END

DA A MOV 25H, A MOV A, 24H ADDC A, 24H

MOV 24H, A DJNZ R7, KKK ;程序结束

--完整版学习资料分享----

因篇幅问题不能全部显示,请点此查看更多更全内容

Top