出租车计费器设计课程设计论文内容摘要:

平状态。 由真值表可以看出,当 OE 为高电平时,无论 LE 与 D 端为何电平状态,其输出均为高阻态,此时芯片处于不可控状态。 做设计时必须使其处于可控状态,即 OE 应 13 该接低电平。 当 OE 为低电平时,若 LE 为 H,则 D 与 Q 同时为 H 或者 L,数据实现直通传送;而当 LE 为 L 时,无论 D 为何状态 Q 都保持上一次的数据状态,数据被锁存住, 利用此特性即可实现对数码管的控制。 本次设计中:段选信号 LE 接 ,对应图中标号 ;位选信号 LE 接 ,对应图中标号。 控制显示时先给 高电平,使通道打开,接着送字码,然后把 电平拉低,使字码保持住;之后打开 (送高电平),紧接着送位码,控制要显示的位,然后把 拉低,数据被保持。 最后延时 5ms;依次循环扫描;利用数码管点亮后的余晖和人眼视觉暂留 效应即可实现动态显示。 数码 管动态显示电路如图 27 所示。 OE11D22D33D44D55D66D77D88D9GND10LE118Q127Q136Q145Q154Q163Q172Q181Q19V C C20U274H C 57 3OE11D22D33D44D55D66D77D88D9GND10LE118Q127Q136Q145Q154Q163Q172Q181Q19VCC20U374H C 57 3V C C40P 39P 38P 37P 36P 35P 34P 33P 32EA31A L E30P S E N29P 21P 22P 23P 24P 25P 26P 27P 28P 1P 2P 3P 4P 5P 6P 7P 8R S T9P 10P 11P 12P 13P 14P 15P 16P 17X T A L 218X T A L 119GND20U1S T C 89C 5211 7 4 2 1 10 5 3129 8 6a b c d e f g d pc om 1 c om 2 c om 3 c om 4L E D ?7S E G ( 0 .36) X 411 7 4 2 1 10 5 3129 8 6a b c d e f g d pc om 1 c om 2 c om 3 c om 4L E D ?7S E G ( 0 .36) X 412345678161514131211109排阻R E S P A C K 4排阻R E S 8AGNDGND40 V C CV C CP P GNDGNDV C CV C C 图 27 数码管动态显示电路 14 第 3 章 软件设计 系统主程序 在主程序模块中,需要完成对各参量和接口的初始化、出租车起步价和单价的初始化以及中断、计算、循环等工作。 另外,在主程序模块中还需要设置启动 /清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。 然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和 计费 等不同的操作。 当出租车运行后,就启动 计费 器,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。 若已超过,则根据里程值、每公里的单价值和起步价来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不 产生中断,当时间超过等待设定值时,开始进行计时,并把等待金额加到总金额里,然后将总金额、里程、等待时间和单价送数码管显示出来。 程序流程如图 31 所示。 金 额 计 算显 示NYNY清 零夜 晚 单 价切 换开 始初 始 化按 键 扫 描 图 31 主程序流程图 里程计数中断程序 每当霍尔传感器输出一个低电平信号,单片机定时器 0(工作在计数模式)就对其计数一次,相应的变量设为 inter 就自加 1,当里程计数器 inter 对里程脉冲计满 500次时,对其自身进行清零操作,为下一次计数做准备,同时进入里程计数中断服务程 15 序中,里程变量 加 1,总金额根据此时所设单价做出相应的变化。 里程中断子程序如图 32 所示。 I N T 0计 数 达 到 5 0 0。 增 加 1 公 里调 用 价 格 子 程 序达 到 最 大 里 程。 返 回NNY开 始Y 图 32 里程中断服务子程序 中途等待中断程序 在中途等待中断程序中,定时器 1 每 50ms 计一次数,每计够 100 次 (5sec),便将当前里程值送入某个缓存变量,与前一个 5 秒的值进行比较,如果两者相同,则表明霍尔传感器没有输出信号,认为出租车停了下来,进入等待计时,计时中间变量 dd自加 1,计够 12 次为一分钟, dd 自清零,同时根据所设的等待单价刷新总金额。 计数初值可 有以下公式获得: X=(65536t)**10^6/12。 TH=X/256。 TL=X%256。 其中: X 表示计数初值, TH、 TL 分别为 16 位计数器高 8 位和低 8 位应装入的初值。 16 用定时器作为基准,可使测试的等待时间更为精确(可以精确到 uS 级);且每隔 5 秒比较一次,能有效减小误判率,避免把汽车低速行驶误认为静止等待处理。 中途等待子程序流程图如图 33 所示。 C C = 1 0 0。 二 者 相等 吗。 5 0 m s了 吗。 变 量 c c + +YYN与 前 一个 5 s 比 较变 量 d d + +YND D = 1 2。 等 待 时 间 + +YN返 回T 1 计 时 开 始N开 始 图 33 中途等待中断子程序流程图 计算程序 计算程序根 据里程数分别进入不同的计算公式。 如果里程大于 3 公里,则执行公式:总金额 =起步价 +(里程 3) *单价 +等待时间 *等待单价;否则,执行公式:总金额 =起步价 +等待时间 *等待单价。 程序流程图如图 34 所示。 17 开 始里 程 3总 金 额 = 起 步 价总 金 额 + = ( 里 程 3 )* 起 步 价总 金 额 + = 等 待 时 间 *等 待 单 价总 金 额 = 起 步 价总 金 额 + = 等 待 时 间 *等 待 单 价返 回NY 图 34 计算程序流程图 显示程序 由于 8 位数码管所有段选皆有 8 位的 P0 口进行控制,因此,在每一瞬间, 8 位LED 会显示同一个数字。 要想每位显示不同的字符,就必须采用动态扫描的方法轮流点亮各位 LED,即在每一时刻只使某一位显示字符。 在此瞬间, 段选控制 I/O 口输出相应字符段选码(字符码),而位选则控制 I/O 口在该显示的位送入选通电平,以保证该位显示显示相应字符。 如此循环操作,使每位分时显示该位应该显示的字符 [7]。 在本次设计中显示程序利用延时程序,每隔 5ms 刷新一次,相应的数码管点亮,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,给人看上去每个数码管总是在亮,以实现动态显示。 18 键盘程序 键盘采用查询的方式,放在主程序中,当有按键按下的时候,在相应 I/O 口产生一次低电平,当单片机查询出该低电平后 便转入进行处理,处理结束返回。 键盘程序流程图如图 35。 19 K e y 3 = 0 ?白 天 单 价 + 1返 回K e y 3 n u m 为 真K e y 3 n u m = 1 ?K e y n u m = 2。 K e y 1 = 0 ?NYYNk e y 3 n u m = 0 ?K e y 2 = 0。 YYN白 天 单 价 1Y显 示k e y 3 n u m + +开 始N储 存 白 天 单 价K e y 1 = 0 ?夜 晚 单 价 + 1YK e y 2 = 0。 YNNK e y 3 n u m = 3。 N储 存 夜 晚 单 价K e y 1 = 0 ?等 待 单 价 + 1YK e y 2 = 0。 夜 晚 单 价 1等 待 单 价 1K e y 3 n u m = 4。 储 存 等 待 单 价K e y 1 = 0 ?起 步 单 价 + 1K e y 2 = 0。 起 步 单 价 1K e y 3 n u m = 5。 储 存 起 步 单 价K e y 3 n u m = 0YYYNNNNYNYNNYNNK e y 4 = 0 ?白 天 、 夜 晚 单价 切 换YK e y 0 = 0 ?仅 显 示 总 金 额与 起 步 价 YNNY图 35 键盘程序 按键检测流程图 36 所示 20 开 始YYYNNN寄 存 器 , I \ O端 口 初 始 化检 测 是 否 有 键 按 下延 时 5 m s执 行 相 应 代 码检 测 是 否 有 键 按 下检 测 是 否 有 键 释 放 图 36 按键检测子程序流程图 21 第 4 章 调试改进过程及运行结果分析 动态扫描的调试和分析 动态扫描是单片机编程中最基本的知识,虽对其原理有比较清晰的掌握,也曾用汇编语言写过程序,但此次用 C 语言编写还是出现了错误。 第一就是把段码和位码顺序送反,结果是只有在 延时时间较长时才能显示正常,当然这样的代价是没有静态的效果;第二就是用动态扫描时给八个数码管送了 10 个数,显然这样做结果必定混乱;最后就是开始时用 switch、 case 语句实现动态扫描,当程序较小时可以正常工作,但当后期程序较大时,出现了时序混乱的问题。 最后解决的方法是用了锁存器,显示结果正常为固定的预设的八个数字。 AT24C02 的编程与调试 对 AT24C02 编程对我来说是一个比较新知识点,遇到了不少问题, 这里仅把经验教训简要介绍一下。 首先是一定要对 I2C 总线时序有较深刻了解后再尝试编程,第二就 是要注意向 AT24C02 写一个字和读一个字的区别,当从 AT24C02 读数据时一定要注意,当读完时从机 AT24C02 一定要发送一个非应答信号表示数据读完。 调试的方法是在指定地址写一个数字再看能是否读出,当显示程序编写好后,可以在 Ptoteus 中用数码管显示看是否与分析一致,也可以把读出的数据赋给某个变量,再通过在 keil中执行 view/watchamp。 call stack window 调出相应变量观察。 按键查询功能的实现 按键查询比较容易实现,只要注意 1. 按键结束后注意退出按键处理; 陷入死循环,即避免显示一个数据后退不出来; 放去抖。 按键去抖可通过以下语句实现 : if(key==0) { delay(5)。 if(key==0) { while(!key)。 delay(5)。 while(!key)。 {按键处理程序 22 } } } 计算程序的分析与设计 由于里程和单价都精确的小数点后一 位,而显示时仍按整数显示,只不过人为的加入 amp。 0x7f(共阳极时加入 amp。 0x7f,共阴极时加入 ||0x)控制是否显示小数点儿,故实际计算时要做适当改动。 改动如下: 1. 当里程值大于 30(实际对应大于 3 公里)且无进位时,溢出指示灯不亮,总金额 =起步价 +(里程十位数字 2) *运行单价 +等待单价 *等待时间; 2. 当里程值小于 30(实际对应小于 3 公里),肯定无进位,溢出指示灯不亮,总金额 =起步价 +等待单价 *等待时间; 3. 有进位,溢出指示灯点亮,表示里程一定大于三公里,只需执行总金额 =起步价 +7*运行单价 +(里程十位数字 +1) *运行单价 +等待单价 *等待时间 即:总金额 =起步价 +(里程十位数字 +8) *运行单价 +等待单价 *等待时。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。