自行车里程及速度计课程设计.doc_第1页
自行车里程及速度计课程设计.doc_第2页
自行车里程及速度计课程设计.doc_第3页
自行车里程及速度计课程设计.doc_第4页
自行车里程及速度计课程设计.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

学 号 08700109 单机原理及接口技术 设计说明书 自行车里程/速度计的设计 起止日期: 2011 年 8 月 29 日 至 2011 年 9 月 2 日 电子与信息工程系电子与信息工程系 2011 年年 9 月月 2 日日 学生姓名 班级 成绩 指导教师 (签字 ) 自行车里程自行车里程/ /速度计的设计速度计的设计 摘要摘要:本文介绍了用 89c52 单片机设计自行车里程/速度计,运用单片机的运算和控制功能,并采用数码 管实时显示所测速度和里程的速度里程计设计方案,用分频器 tc4024 实现二分频,用来探讨 24c01 传感 器的用途,通过实用电路的设计来掌握速度及里程传感器的使用方法及一些性能参数。本系统含了电子 电路技术,以及常用的 at89c52 单片机工作原理,通过本系统的设计,把它们俩者有机结合。 关键词关键词:at89c52 数码管 tc4024 分频器 24c01 传感器 目目 录录 第一章第一章 绪绪 论论1 1 第二章第二章 芯片介绍芯片介绍2 2 2.12.1 at89c52 单片机 .2 2.1.1 at89c52 单片机简介 .2 2.1.2 at89c52 的管脚及其含义 .2 2.22.2 tc4024 分频器 3 2.32.3 24c01 芯片 .3 2.3.1 24c01 简介 .3 2.3.2 24c01 的特性: .4 第三章第三章 硬件电路的设计硬件电路的设计6 6 3.13.1 系统结构框图 .6 3.23.2 系统硬件电路 .6 3.33.3 系统的工作原理 .7 第四章第四章 软件设计软件设计8 8 4.14.1 系统内存的规划 .8 4.24.2 系统的主要程序设计 .8 第五章第五章 系统调试系统调试1010 5.15.1 硬件调试 10 5.25.2 软件调试 10 第六章第六章 心得体会心得体会1212 附录附录 1 1:元件清单:元件清单 1414 附录附录 2:2: 系统完整源程序系统完整源程序 1515 1 第一章第一章 绪绪 论论 传感器,英文名字为 sensor 或 transducer,亦称换能器、变换器。在科技迅速发展的今天,传感器 越来倍受重视。在日常生活、航天、航空,常规武器、交通运输,机械制造、化工、生物医学工程、自 动化检测工程及计量等各项领域都被广泛应用6。 目前,传感器已向新材料开发,集成化、智能化、数字化、新工艺,高精度化及高稳定、高可靠化 等技术发展。特别是霍尔传感器,鉴于它的价廉、易于使用,使它广泛运用于里程计、速度计等6。 单片微型计算机简称单片机,又称微控制器,特别适用于控制领域。通常单片机由单块集成电路构 成,内部包含有计算机的基本部件:cpu(中央处理器) ,存储器和 i/o 接口电路等。因此,单片机只需 要与适当的软件及外部设备相结合,便可以成为一个单片机控制系统4。 目前,场上销售的单片机有 4 位、8、16 位、32 位,并且单片机朝着高性能多种方向发展,尤其是 8 位单片机以经成为当前单片机的主流,主要体现在 cpu 功能增强、内部资源增多、引脚的功能化、低电 压和低功好耗化上4。 单片机因为其体积小、功能强,可靠性高,灵活方便等优点,所以可以用于各个领域,对各行各业 的技术改造和产品更新换代起到重要的推动作用。 本人经过学习,用 at89c52 设计了一个自行车里程/速度计。本设计可轮流显示自行车行使的里程和 速度, 采用 tc4024 芯片作为计数器以及 2c401 存储数据,3 个单级共阴数码管作为显示系统。本系统具 有超速信响提醒功能,里程数据自动记忆,也可应用于电动自行车、摩托车、汽车等机动车仪表上。 . 2 第二章第二章 芯片介绍芯片介绍 2.12.1 at89c52at89c52 单片机单片机 2.1.12.1.1 at89c52at89c52 单片机简介单片机简介 本设计选用 at89c52 单片机,at89c52 是一种低功耗、高性能 cmos 8 位微控制器。使用 atmel 公司 高密度非易失性存储器技术制造,可与工业 at89c51 产品指令和引脚完全兼容。 2.1.22.1.2 at89c52at89c52 的管脚及其含义的管脚及其含义 at89c52 的管脚及各管脚含义如下: 图 1 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 位地址; 3 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 则执行内部程序存储器的指令。 2.22.2 tc4024tc4024 分频器分频器 本程序采用 tc4024 芯片,它是一个 7 位的计数器,计数器具有分频的作用,它包含有 14 个管脚, 其 7 脚接地,14 脚接+5v,1 脚接 at89c52 的 int0,即 12 脚,在系统中此芯片起到了二分频的作用。 2.32.3 24c0124c01 芯片芯片 2.3.12.3.1 24c0124c01 简介简介 24c01 是一个 1k 位串行 cmos eeprom,内部含有 128 个 8 位字节,catalyst 的先进 cmos 技术实际 上减少了器件的功耗,24c01 是一个 8 位字节页写缓冲器,该器件通过 i2c 总线接口进行操作,即此芯片 4 采用 i2c 协议进行读写数据。有一个专门的写保护功能。 24c01 是 i2c 接口的,但标准 51 是不带 i2c 接口的,串口方式 0 是不行的,需要用 io 模拟,所以随 便接两个 io 都可以,而且都要接上拉电阻,大概几 k 就行了,因为不是总线方式,所以不能用 mov 指 令,也不能用 sbuf,要判断是否为满,可以在程序里设个变量。 在这里要注意 e2p 芯片的寿命(一般是读写 100 万次,足够了) 。 存储数据的时候,可以对操作数和 存储的数据进行比较,不相等则存储,这样可以增加使用寿命,比有些每隔 1 秒钟进行存储的会好多了。 以下是 24c01 的管脚图: 图 2 管脚图 表 1 24c01 的管脚描述 管脚名称功能 a0、a1、a2器件地址选择 sda 串行数据/地址 scl 串行时钟 wp 写保护 vcc +1.8v6.0v 工作电压 vss 接地 2.3.22.3.2 24c0124c01 的特性:的特性: 24c01 芯片具有以下特性: 1. 与 400khz 的 i2c 总线兼容; 5 2. +1.8-6.0v 工作电压范围; 3. 低功耗 cmos 技术; 4. 写保护功能:当 wp 为高电平时进入写保护状态; 5. 页写缓冲器; 6. 自定时擦写周期; 7. 1,000,000 编程擦除/周期; 8. 可保存数据 100 年; 9. 8 脚 dip、soic、tssop 封装; 10 温度范围:商业级、工业级和汽车级。 6 第三章第三章 硬件电路的设计硬件电路的设计 3.13.1 系统结构框图系统结构框图 89c52 显示电路 按键控制 指示灯电路 报警电路 里程、速 度测量电 路 显示电 里程、速 度测量电 路 图 3 按键控制部分功能:自行车转圈的大小设置,速度、里程显示选择设置。 指示灯部分功能:里程状态和速度状态显示。 报警部分功能:超速时采用声音报警提示。 里程、速度测量电路部分功能:速度及里程传感器采用霍尔传元件,实现对自行车里程及速度的计算。 显示部分功能:速度、里程用数码管动态扫描显示,由 p0 口送出段码,p2 口送出位选信号。 3.23.2 系统硬件电路系统硬件电路 自行车里程/速度计能自动显示自行车行驶的总里程数及行车速度,具有超速信响提醒功能,里程数 据自动记忆,也可应用于电动自行车、摩托车、汽车等机动车仪表上。其硬件电路原理图如图 4。 7 图 4 系统原理图 3.33.3 系统的工作原理系统的工作原理 本设计能实时地将所测的速度与累计里程数显示出来,主要是将 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 口分 别用于设置轮圈的大小。接口 10 口的开关用于确定显示的方式,当开关闭合时,显示速度;打开时显示 里程。第 12 脚外中断 0 用于对轮子圈数的计数输入,轮子每转一圈,霍尔传感器输出一个地电平脉冲。 第 13 脚外中断 1 用于控制定时器 t1 的启停,当输入为 0 时关闭定时器。此控制信号是将轮子圈数的计 数脉冲经二分频后形成(见图 5.1) ,这样,每次定时器 t1 的开启时间刚好为转一圈的时间。根据轮子的 周长就可以计算出自行车的速度。p1.4 和 p1.5 口用于 eeprom 存储器 24c01 的存取控制。11 脚输出用 于速度超速时的报警。 8 第四章第四章 软件设计软件设计 4.14.1 系统内存的规划系统内存的规划 由于本系统处理功能较多,因而一部分内存单元用于特定的用处。其主 要内存单元用处如下: 50h:eeprom 器件寻址字节存放单元; 51h:eeprom 传送字节数存放单元; 30h:eeprom 发送数据缓冲单元; 40h:eeprom 读出数据存放单元; 0a0h:eeprom 寻址字节字节写; 0a1h:eeprom 寻址字节字节读; 62 h:dptr 计数器扩展高 8 位; 6c h:定时器 t1 计数器扩展高 8 位; 6d h:定时器 t1 计数器扩展高 816 位; 60 h、61 h、62 h:里程计数单元; 68 h、69 h、6a h、6b h:存放自行车每圈时间数; 70 h、71 h、72 h、73 h:显示 bcd 码数据存放用; 11 h15 h:存放被除数; 16 h19 h:存放除数。 4.24.2 系统的主要程序设计系统的主要程序设计 1. 初始化程序 在本系统初始化程序中,主要完成以下工作:将 t1 设为外部控制定时器方式;外中断 0 及外中 断 1 设为边沿触发方式;将部分内存单元清零;设置轮子 周长值;开中断及定时器;将 eeprom 中 的数据调入内存等。 2. 轮圈设置出错处理程序 p1.2、 p1.3、 p1.6、p1.7 端口的开关用于设定轮子的周长,当没有设定时(至少让一个开关 闭合) ,能从 p3.1 口输出一个周期为 0.5s 的方波信号,用作发光管闪烁及信响器提醒。 3. 主程序 主程序根据 p3.0 的开关状态选择里程或速度显示,其流程图如图 6.2 所示。 9 图 5 主程序流程图 4.里程计数程序(外中断 0 服务程序) 外中断 0 服务程序用于对 12 脚输入的圈脉冲进行计数,为十六进制计数器。60h 为低位,62h 为高位。每计数一次后,对里程数据进行一次存储操作。 5.外中断 1 服务程序 外中断 1 服务程序用于处理轮子转动一圈后计时数据。当标志位(00h)为 1 时,说明计数器溢 出,放入最大时间值(为#0ffh);当标志位为 0 时,将计数单元(tl1、th1、6ch、6dh)的值放入 68h6bh 单元。 6.eeprom 存取程序 本系统使用归一化 i2c 串口存取子程序,使用一条数据线和时钟线,采用 atmel 公司的 24c01 串口存储器,应用简单方便。 7.显示子程序 当显示里程时,先要将圈数计数器中的数据进行运算,求出总里程。当要 显示速度时,要将轮子的这周长和转一圈的时间数相除,然后换算成 km/h 单位。最后放入 70h73h, 进行数据显示。 10 第五章第五章 系统调试系统调试 要完成一个产品的设计,有很多纷繁复杂的步骤和过程,其中最为重要 和最为关键的就是系统调试。调试的步骤和方法有很多。本人也看过不少,在这次系统调试的中调 试的过程我充分的发挥了仿真器的作用。 5.15.1 硬件调试硬件调试 硬件的焊接是一个比较繁琐的过程,繁琐的地方在于 3 个单联数码管的 连接,线路较多,在焊接时要特别的细心,在焊接完成并烧入程序之后通电发现数码管不亮,检查 了好几遍,电路无焊没有错误,于是我就怀疑可能是数码管的问题,拿去贝尔(学院的社团)测试 没问题,数码管并没有烧坏。 在插入芯片时要特别注意不能把芯片插反,否则就会把芯片烧掉;也要 注意极性电容的方向,长的脚为正,短的为负,不能把负的接+5v,正的接地;在焊接三极管时也要 注意其三个管脚的排布,还有为保护三极管不被烧换,所以 3 个三极管要各自接一个限流电阻(这 里为 4.7k) 。 5.25.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 11 end 结果数码管正确显示了 0、1、2 这三个数,显示系统调试成功。 软件测试要注意一下几点: 1.在编写 i2c 串行归一化存储子程序时本来出了点错,后经过多次调试才运行正确。 2.里程/速度控制程序是系统程序的重点,所以它当然也是软件调试的重点。 3.显示系统最好先调试。 4.用韦幅软件进行仿真时要充分利用其逐步调试功能。 12 第六章第六章 心得体会心得体会 通过这次单片机的课程设计,我进一步熟悉和掌握了单片机的结构及工作原理,单片机的接口技术 及相关外围芯片的外特性,控制方法和单片机核心的电路设计的基本方法和技术,通过实际程序设计和 调试,逐步掌握模块化程序设计方法和调试技术。这次的课程设计是很难得,其中也有很多不懂得地方, 但正是这样,我才能在从中学到很多的东西!通过完成一个包括电路设计和程序开发的完整过程,了解 开发一单片机应用系统的全过程,为今后从事相应打下基础。 本设计能自动显示自行车行驶的总里程数及行车速度,具有超速信响报警提醒以及里程数据自动记 忆的功能,也可应用于电动自行车、摩托车、汽车等机动车的仪表上。由于本系统采用的是动态扫描 led 显示且共阴数码管的驱动电流不是很大,所以数码管的显示不是特别亮。但可以通过更换小点的电阻增 大其驱动电流(最大驱动电流不能超过 20 毫安)使数码管变得更亮。 13 参考文献参考文献 1 李玉峰、倪虹霞. mcs-51 系列单片机原理与接口技术. 第一版. 北京: 人民邮电出版社. 2004 2 周兴华. 手把手教你学单片机. 第一版.北京:北京航空航天大学出版社. 2005 3 曾一江. 单片微机原理与接口技术. 第一版.北京:科学出版社. 2006 4 张俊谟. 单片机中级教程原理与应用. 第二版. 北京:北京航空航天大学出版社. 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),机械工业出版社 18 programming 8-bit pic microcontrollers in c with interactive hardware simulation, 8 位单片机 c 语言编程:基于 pic16 ,martin p. bates,人民邮电出版社 14 附录附录 1 1:元件清单:元件清单 元件型号数量元件型号数量 传感器 24c011 个瓷片电容30p2 个 分频器tc40241 个晶振12m1 个 单片机集成块at89c521 个覆铜板big 1 块 电阻3301 个led 数码管plt75361as3 个 电阻1 k2 个蜂鸣器passed1 个 电阻4.7k9 个三极管901210137 个 电阻8.2 k3 个发光二极管3 个 电阻1.8k3 个自锁开关6 个 电解电容10f1 个 15 附录附录 2:2: 系统完整源程序系统完整源程序 以下是控制系统完整源程序 ; ; ; speed/mile or ike program ; ; ; ; ; 60h,61h,62h 作里程计数单元,6ch,6dh 作 t1 计数扩充单元, ; 68h,69h,6ah,6bh 存放自行车每圈时间数,70h,71h,72h,73h ; 作显示 bcd 码存放数用,11h15h 存放被除数,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 中断程序入口 ljmp intex0;跳至 intex0 中断服务程序 org 000bh;定时器 t0 中断程序入口 reti ;中断返回 org 0013h;外中断 1 中断入口 ljmp intex1; 跳至 intex1 中断服务程序 org 001bh; 定时器 t1 中断程序入口 16 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 寸自行车周长值 17 ljmp clear2 ; clear2 key2: jb p1.6, key3 ; mov 21h, #14h ; 26 寸自行车周长值 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) 18 intex0out: lcall viicwrite ; 里程数据存入 eeprom setb ex1 ; 开外中断 1 pop psw ; 状态字恢复 pop acc ; 累加器恢复 reti ; 中断返回 ; ; ; intex1 program ; ; ; 每转 1 圈时间计数处理程序,每圈时间放在 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 ; 计时单元置 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 19 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(显示里程状态) 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 退出 ; ; 20 ; 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 ; ; ; 归一化 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 21 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 nop nop nop nop clr vsda clr vscl ret mack: clr vsda setb vscl nop nop nop 22 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 clr vsda ajmp wlp1 wr0: clr vsda setb vscl nop nop 23 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 24 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 ; ; ; 里程处理程序,将自行车圈数据换算成公里数 25 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 15

温馨提示

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

评论

0/150

提交评论