首页 > 哲学范文 > 三个代表 / 正文
出租车计价器毕业设计论文
2020-03-10 21:01:19 ℃
编号
XX职业技术学院
毕业论文
题
目 多功能出租车计价器
学生姓名
学
号
系
部 电 子 工 程 系 专
业 应 用 电 子 班
级
指导教师
顾问教师
二〇XX 年 X 月
摘
要 摘 要:随着人们生活水平的提高,科技不断进步,新一代多功能出租车计价器应运而生,介绍一种以单片机AT89S52 为核心的多功能出租车计价器的设计,阐述软硬件设计过程中关键技术的处理。该计价器具有集计程、计时、计费、存储、查看、统计等多种计量功能,并且具有超速提醒、防止司机作弊、语音、打印、显示、电子钟和电子温度计和实现对出租车计价月统计,同时采用AT24C64 实现在系统掉电的时候保存单价和系统时间等信息等多种功能。与已有的系统相比,该系统具有超速提醒等更强的功能。本电路设计的计价器不但能实现基本的计价,而且还能根据白天、黑夜、中途等待来调节单价,同时在不计价的时候还能作为时钟为司机同志提供方便。 关键词:AT89S52单片机
电子温度 数据黑匣子 显示
查询
票据打印
目
录 摘
要 I 第一章 绪
论 1 1.1整体方案 1 第二章
系统硬件设计 2 2.1核心控制器选择介绍
2 2.2 引脚介绍 3 2.3 硬件电路设计 3 2.3.1 电源部分设计 3 2.3.2 测量部分设计 4 2.3.3 数据显示部分设计 5 2.3.4 时钟部分设计 11 2.3.5 语音提醒部分设计 12 2.3.6 票据打印部分设计 14 2.3.7 数据存储部分设计 16 2.3.8 超速提醒与按键设置部分设计 19 2.3.9 DS18B20电子温度计设计 20 第三章 系统软件设计 22 3.1 主程序设计 22 3.1.1、程序功能介绍 22 3.2 几个关键子程序设计 23 3.2.1 中断T1 里程计数程序设计 23 3.2.2 T0 中途等待计时程序设计 24 3.2.3 键盘服务程序设计 25 3.2.4看门狗应用 26 3.3 时钟程序计 27 3.5语音提-打印醒程序设计 33 3.6电子温度计程序设计 33 第四章
系统调试 37 第五章
未来展望与小结 38 致
谢 39 参 考 文 献 40 附录 41
第一章 绪
论 1.1整体方案 整体方案设计方框图如图1 所示,整个系统由单片机A T89S52 控制电路、A44E 霍尔传感器电路、AT24C64 存储电路、DS1302 时钟电路、ISD2560 语音播报电路、票据打印电路、按键调整电路、MAX7219 驱动显示电路及电源电路组成。
图1-1 整体硬件设计电路示意图
片机采集并判断空车灯信号及路程检测传感器信号,当出租车启动时,单片机检测到霍尔传感器的脉冲信号并进行里程计算。当无乘客时,单片机调用实时时间芯片DS1302 程序MAX7220串口显示驱动程序,用12864液晶屏进行时钟等数据显示;当空车灯掰下乘客上车时: ISD2560 语音播报电路进行语音播报1 (欢迎乘客乘坐本出租车⋯) ,通过DS1302 获取时间信息分辨白天/ 晚上,然后调用A TAT24C64 程序获取白天/ 晚上的单价及起始价,便开始计价并显示时间、里程和金额等信息;当空车灯打上乘客下车时:进行播报2 (谢谢再次乘坐本出租车,请交金额 ⋯) ,并打印好票据,单片机将营运数据信息存储到AT24C64 中,等待出租车再次启动后单次金额与里程等信息清零复位, 就此完成一次计价。
第二章
系统硬件设计 2.1核心控制器选择介绍
1. AT89S52主要性能 A. l 与MCS-51单片机产品兼容 B. l 8K字节在系统可编程Flash存储器 C. l 1000次擦写周期 D. l 全静态操作:0Hz~33Hz E. l 三级加密程序存储器 F. l 32个可编程I/O口线 G. l 三个16位定时器/计数器 H. l 八个中断源 I. l 全双工UART串行通道 J. l 低功耗空闲和掉电模式 K. l 掉电后中断可唤醒 L. l 看门狗定时器 M. l 双数据指针 N.
掉电标识符 2、功能特性描述 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、
中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.2 引脚介绍
图2-1 引脚封装图
2.3 硬件电路设计 由电源部分、霍尔传感器路程测量部分、数据显示部分、时钟部分、语音播报部分、票据打印部分和数据存储部分等组成,各部分端口分别与单片机AT89S52 的输出口相连,通过单片机的控制来实现计价器的功能实现。
2.3.1 电源部分设计 由于计价器的工作环境比较差,它要求有抗振动、抗高低温、抗潮湿、抗电磁干扰等能力,特别是电源方面的干扰,如出租车启动时,发动机打火、电瓶充电等造成输入计价器的+ 12 V 电源不稳定。因此采用+ 12 V电瓶电源经过滤波和电源稳压管理芯片7805 后得到+ 5 V的稳定电压输出,保证整个系统能够正常工作。如图3.3-1 所示。
图2-2电源部分电路
2.3.2 测量部分设计 1、A44E霍尔传感器介绍 A44E集成霍耳开关,A44E集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)(mT)、差分放大器C、施密特触发器D和OC门输出E 五个基本部分组成在输入端输入电压VCC,经稳压器稳压后加在霍耳电势发生器的两端,根据霍耳效应原理,当霍耳片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍耳电势差H V 输出,该H V信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即BOP)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,通常称这种状态为开。当施加的磁场达到释放点(即BrP)时,触发器输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍耳开关完成了一次开关动作。BOP与BrP 的差值一定,此差值BH = BOP - BrP称为磁滞,在此差值内,V 0保持不变,因而使开关输出稳定可靠,这也就是集电成霍耳开关传感器优良特性之一。 2、A44E霍尔传感器应用 出租车中需要一个能准确获得车轮转动即路程计量信号的装置,以得到标准的脉冲信号送入单片机的定时/ 计数器T1 即P3. 5 引脚,利用单片机的T1 的计数功能完成100 次的计数后产生一中断来完成路程的测量。(设车轮周长为1 m ,则霍尔传感器每产生100 个脉冲便表示车已行程0. 1 km ,根据实际情况在程序中进行设置) 。汽车联轴器按圆周间隔嵌入磁钢,用霍尔传感器集成芯片A44E 检测并输出脉冲,其工作原理如图2-4 所示,霍尔传感器集成芯片A44E 有信号转换、电压放大、整形输出等功能,为增加其抗干扰的能力,经过74L S14 对信号整形后再通过光偶送入P3. 5 引脚。如图5 所示。而在此电路中为了防止司机作弊,可采用加密传感器的方法,先对霍尔传感器采集到的计数脉冲加密,使计费脉冲以密文方式传输,最后解密为明文脉冲,传送到计价器计费。在密码传感器中,加密器向解码器发送的是密码,只有加密器和解密器固有密码相同时,解码器才向计价器发送计数脉冲,计价器才计费,因此,密码传感器提高了计价器计费可靠性,不法出租车司机也无法使车费增加,同时司机也不能私自更换计价器传感器,实现了计价器由国家计量部门统一安装、维修和年检的统一管理。
图2-4 A44E霍尔传感器工作原理示意图
图2-5 A44E 霍尔传感器接口电路
2.3.3 数据显示部分设计 一、 12864液晶显示
1、概述
FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: A. 低电源电压(VDD:+3.0--+5.5V) B. 显示分辨率:128×64点 C. 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) D. 内置 128个16×8点阵字符 E. 2MHZ时钟频率 F. 显示方式:STN、半透、正显 G. 驱动方式:1/32DUTY,1/5BIAS H. 视角方向:6点 I. 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 J. 通讯方式:串行、并口可选 K. 内置DC-DC转换电路,无需外加负压 L. 无需片选信号,简化软件设计 M. 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃
2、模块接口说明
表2-1 LCD12864接口
*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 3、模块主要硬件构成说明 1、控制器接口信号说明:
表2-2 RS,R/W的配合选择决定控制界面的4种模式: RS R/W 功能说明 L L MPU写指令到指令暂存器(IR) L H 读出忙标志(BF)及地址记数器(AC)的状态 H L MPU写入数据到数据暂存器(DR) H H MPU从数据暂存器(DR)中读出数据
表2-3E信号
E状态 执行动作 结果 高——>低 I/O缓冲——>DR 配合/W进行写数据或指令 高 DR——>I/O缓冲 配合R进行读数据或指令 低/低——>高 无动作
a) 忙标志:BF
BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态。 b) 字型产生ROM(CGROM) 字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。 c) 显示数据RAM(DDRAM) 模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
d) 字型产生RAM(CGRAM)
字型产生RAM提供图象定义(造字)功能, 可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。 e) 地址计数器AC 地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。 f) 光标/闪烁控制电路 此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。 2、指令表说明 当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
3、指令控制指令
模块控制芯片提供两套控制命令,基本指令和扩充指令如下表: 指令表2-4:(RE=0:基本指令) 指令
指 令 码 功 能 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 清除 显示 0 0 0 0 0 0 0 0 0 1 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" 地址 归位 0 0 0 0 0 0 0 0 1 X 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 显示状态开/关 0 0 0 0 0 0 1 D C B D=1: 整体显示 ON C=1: 游标ON
B=1:游标位置反白允许 进入点 设定 0 0 0 0 0 0 0 1 I/D S 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 游标或显示移位控制 0 0 0 0 0 1 S/C R/L X X 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容
功能
设定 0 0 0 0 1 DL X RE X X DL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作
设定CGRAM
地址 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM 地址
设定DDRAM
地址 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 设定DDRAM 地址(显示位址) 第一行:80H-87H 第二行:90H-97H 读取忙标志和地址 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 写数据到RAM 1 0 数据 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) 读出RAM的值 1 1 数据 从内部RAM读取数据D7——D0 (DDRAM/CGRAM/IRAM/GRAM)
3、读写时序图 1)数据传输过程
图2-6
8位和4位数据线的传输过程
图2-7
串口数据线模式数据传输过程
2)时序图
图 2-8 MPU写资料到ST7920(8位数据线模式)
图2-9
MPU 从ST7920读资料(8位数据线模式) 3)串口读写时序:
图2-10 串口方式下MPU写数据到ST7920 4、应用说明 用FYD12864-0402B显示模块时应注意以下几点: ①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。 ②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。 ③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。 2.3.4 时钟部分设计 1、DS1302简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW,DS1302 是由DS1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1 为可编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域下面将主要的性能指标作一综合。 a) 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力 b) 31 8 位暂存数据存储RAM c) 串行I/O 口方式使得管脚数量最少 d) 宽范围工作电压2.0 5.5V e) 工作电流2.0V 时,小于300nA f) 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 g) 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 h) 简单3 线接口 i) 与TTL 兼容Vcc=5V j) 可选工业级温度范围-40 +85 k) 与DS1202 兼容 l) 在DS1202 基础上增加的特性 A、对Vcc1 有可选的涓流充电能力 B、双电源管用于主电源和备份电源供应 C、备份电源管脚可由电池或大容量电容输入 D、附加的7 字节暂存存储器
2、管脚说明
图2-11
DS1302引脚图 a. X1 X2 32.768KHz 晶振管脚
b. GND 地 c. RST 复位脚 d. I/O 数据输入/输出引脚 e. SCLK 串行时钟
f. Vcc1,Vcc2 电源供电管脚 3、硬件设计 计价器在出租车空车行驶时需要显示实时时钟,因为它的时钟是作为白天/ 晚上单价自动转换的一个基准,而且计价器的时钟显示能为司机和乘客提供方便,所以选择一个好的时钟芯片对计价器很重要。DS1302是美国DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,采用SPI 三线接口与CPU 进行同步通信;时钟可提供秒、分、时、日、星期、月和年; 通过设置DS1302 的控制/ 状态寄存器选择日历,时钟方式经过初始校准后即可工作使用;工作电压宽达2. 5~5. 5 V ,采用双电源供电(主电源和备用电源) ,并设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力,在没有主电源的情况下启用备用电源能保存时间信息及数据。如图3.3-15所示。
图2-12
DS1302硬件设计连线图 2.3.5 语音提醒部分设计 1、IDS2500简介
本设计采用美国ISD公司的2500芯片,按录放时间60秒、75秒、90秒和120秒分成ISD2560、2575、2590和25120四个品种。ISD2500系列和1400系列语音电路一样,具有抗断电、音质好,使用方便等优点。它的最大特点在于片内E2PROM容量为480K(1400系列为128K),所以录放时间长;有10个地址输入端(1400系列仅为8个),寻址能力可达1024位;最多能分600段;设有OVF(溢出)端,便于多个器件级联。 2、引脚图及介绍
图2-13 ISD2560引脚图 如图2-13 a. 1-7
A0/M0~A6/M6 地址
b. 8-10
A7~A9
地址 c. 11
AUX IN 辅助输入 d. 12,13
VSSD、VSSA 数字和模拟地 e. 14,15
SP+、SP- 扬声器输出 f. 16,28
VCCA 、VCCD 模拟、数字信号电源正极 g. 17,18
MIC、MIC REF 麦克风输入和输入参考端 h. 19 AGC
自动增益控制 i. 20,21
ANA IN、OUT 模拟信号输入和输出
j.
22
OVF\溢出 k. 23
CE\片选(低电平允许芯片工作) l. 24
PD芯片低功耗状态控制 m. 25
EOM\ 录放音结束信号输出 n. 26
XCLK 外部时钟 o. 27
P / R\ 录/放控制选择 2、硬件设计 考虑到计价器的微型化、智能化,语音芯片采用集成度较高ISD2560 芯片,其最大特点是采用E2 PROM进行模拟信息直接存取而不必经过A/ D 和D/ A 转换。它内部带有话筒放大器、自动增益控制时钟、扬声器驱动电路等,采用+ 5 V 电源供电。语音模块与单片机的接口如图8 所示,设计过程中,先将固定语音部分(上、下车用语、) 信息存储到ISD2560内部的不同起点地址中。营运过程中根据上、下车的不同营运状态来实现不同语音功能播放。在语音芯片工作时,系统首先主程序调用放音处理程序,根据发音地址寻找ISD2560 中的发音单元,然后将信号送到扬声器发出声音。
图2-14
ISD2560语音接口图 2.3.6 票据打印部分设计 当出租车到达指定地点,司机翻起空车牌,便产生一个信号通知单片机A T89S52 ,单片机启动打印服务,将行车的中途等待时间、营运里程、单价、金额、日期及上下车时间等数据打印成出租车专用发票,微型打印机接口电路如图9 所示。该电路采用接口插板方式与单片机相连,这一特点使得计价器的票据打印在功能上与主系统一体化,而在检查、维修时又可单独进行。本设计中所用微打是EPSON 公司生产的TPμp216 微型打印机,微打与单片机通过并行接口相连,当所需要打印的数据出现在打印机I/ O0~I/ O7 上时,STB 只要从高电平转到低电平,再从低电平转到高电平,就可把数据送入打印机。这时打印机将BUSY 线置为忙(高电平) ,禁止新数据输入;当打印机取走数据并处理完毕后,BUSY线被置为闲(低电平) ,同时送出回答脉冲ACK通知系统,可以再次输入数据。 打印功能是税控计价器的另一重要技术特色,在过去的出租车上都没有打印功能,引发了许多管理方面的投诉问题。现在开发的税控出租车计价器能在每次计价结算时,根据计价显示的应付车费,打印出统一车票。有的计价器还可以根据要求打印出各种类型的累计票。完成打印功能的设备是微型打印机,目前各个厂家用的打印机各不相同,有的厂家用的是针式打印头,有的则用轮式打印头。针式打印头的原理是用4 根打印针击打色带从而在发票上打印出结果,其最大特点是可打印少量汉字及字母。但众所周知其打印针易折断,以致造成缺点现象,而且因为需要用微型色带,其日常消耗也较高。我公司根据市场要求,综合各方面的技术,在大量实验下,选用了EPSON 公司的Model - 42V 型轮式打印头,此种打印头具有字符轮串行双色打印、进纸速度快(达到每秒8行) 、接触式上墨等特点。 打印机性能: ①字符轮式串行打印 ②打印字列为最大19 列(包括2 个符号) ③字符类型为符号12 位置+ 2 个空格,数字14 个位置 ④字符尺寸为116mm(W) ×218mm(H) ⑤字符间隔:数字之间119mm ,数字和符号间414mm ,行间隔416mm ⑥打印速(610VDC 下的平均速度) 为19字列下019 行/ 秒,17 字列下210 行/ 秒 ⑦纸张宽5715mm ⑧电机终端电压为610 + 0. 5- 2. 0 (直流) ,主电流为0123A ⑨工作温度为0 - 50 ℃ ⑩稳定性为MCBF = 700000 行lv尺寸为86mm (W) ×4915mm (D) ×19mm(H)此种打印头采用了与针式打印机完全不同的打印原理,它每次打印的不是一个点,而是整个一个数字。 它共有3 组字符轮,第一组字符轮上刻有各种字母,可以在最右边打印字母;第二三组字符轮上刻有数字,可以打印出0 - 9 各个数字。打印时,应先启动马达,此时字符轮开始旋转,程序根据要打印的数字,计算出相应的脉冲数,在要打印的字符正好对准打印位置时,给电磁铁发一个触发信号,于是这个字符就被印在打印纸上。重复以上步骤并配合回车、换行就可完整打印一份发票。因为一次打印的是一个字符,所以不用担心缺点问题,而且比用字点组成的字符要清晰。打印头上的油墨轮是用特殊材料制成的。当滴到上面的油墨太多时,它会自动吸入;当油墨太少时,则自动渗到轮子表面,这样字符轮上的字符表面始终都有浓淡相宜的油墨。一瓶油墨可用较长时间,且价格便宜,从而使打印头使用过程中的日常消耗较小。该打印头的缺点是不能打印汉字而且只能打印少量字母。因为出租车所用的发票是已印好的套票,上面已印好各种汉字提示,打印机只须将数字打印在上面即可,故而对打印并无妨碍。ETT - 1 型计价器的打印过程分两步:首先在按倒空车牌开始营运时,打印常规数据如公司代码、电话、车号、上车时间、日期等,而在运营结束时再打印运营里程、单价、总金额等,以完成一份发票的打印。这样做的目的是为了更节省时间,以使乘客在下车时不必等太长时间得到一份发票,提高了工作效率。另外,轮式打印机用的打印纸宽57. 5mm ,针式打印机用的则窄一些。ETT - 1 型计价器在进纸口加上一特殊设备,也可使用针式打印机用的窄行打印纸,即它可适应这两种类型的发票。
图2-15
微型打印机机接口图 2.3.7 数据存储部分设计
1、AT24c64简介 数据存储部分的作用是在电源断开时,存储当前设定的单价信息。A TAT24C64 是A TMEL 公司的2 kB 的电可擦除存储芯片,采用2 线串行的总线和单片机通讯,电压最低可以到2. 5 V ,额定电流为1 mA ,静态电流10Ua (5. 5 V) ,芯片内的资料可以在断电的情况下保存40 年以上,而且采用8 脚的DIP 封装,使用方便。 2、引脚图 表 2-6
引脚号 功能 引脚号 功能
A0、A1、A2 地址线 VSS 电源 SCL 时钟线 GND
接地端 SDA
数据线 WP 写保护
图2-16
AT24C64引脚图
3、操作时序及说明
(1)I2 C总线操作时序
图2-17
I2C总线操作时序图 (1)起始信号(S):在SCL高电平期间,SDA由高到低的变化,启动一次数据传送过程。在SDA变低后,SCL高电平应继续保持4µS以上。 (2)终止信号(P):在SCL高电平期间,SDA由低变高的变化,结束一次数据传送过程。SDA应在SCL高电平保持4µS以上开始由低到高变化。 (3)应答信号(A):应答信号有两种,一是在第9个时钟脉冲高电平期间,SDA是低电平,应答信号;另一是在第9个时钟脉冲高电平期间,SDA是高电平,应答非信号;应答非信号是主机在接收到从机发送数据,准备结束本次数据传送输出的应答信号。应答信号和应答非信号,SCL的高电平应大于4µS。
A、 24C64单字节写数据操作格式
图 2-18
单字节写数据操作格式 AT24C64是8引脚的集成块,其DIP封装如图7-11a所示, SDA、SCL为I2C总线接口,A2、A1、A0是器件的引脚地址,WP是芯片的写保护,WP=0时,允许向存储器中写操作,WP=1时,禁止写操作。Vcc、GND是芯片的电源引脚。用AT89S52作为虚拟主机的接口电路如图7-11b所示AT24C64 口电路 按照图中的接法,A2、A1、A0都接地,对AT24C64写操作时的器件地址为:A0H,读操作时的器件地址为:A1H。 AT24C64读操作分为随机读和连续读两种方式。其数据操作格式如图7-12所示。图中灰色部分由AT89S52发送,AT24C64接收。白色部分AT24C64发送,AT89S52接收。SLAW、SLAR为AT24C64写和读器件地址。SLAW=A0H=10100000B,SLAR=A1H=10100001B。SADR为AT24C64存储空间地址,范围为:00~FFH。DATA为从AT24C64内部单元中的数据。从读数据操作格式中可以看出,读操作分两步,先发送读出单元的地址,接着再启动读操作,并且在单片机停止操作之前应输出应答非信号。 B、 AT24C64的写操作分为单字节写和页写 AT24C64的写操作分为单字节写和页写,其数据操作格式如图7-13所示。AT24C64页写每次最多8个字节,并且应从空间地址能8整除的地址空间开始写,如:00H、08H、10H、……等。超过8字节应分多次页写,两次页写间需要间隔10ms左右的时间。 图2-19
AT24C64的写操作分为单字节写和页写 图中灰色部分由AT89S52发送,AT24C64接收。白色部分AT24C64发送,AT89S52接收。SLAW、SADR与读操作数据格式中的含义相同。 4、硬件设计
图2-20 AT24c64硬件连接 AT24C64中的时钟信号线SCL 与数据线SDA 需外接5. 1 kΩ的上拉电阻,其作用是减少A TAT24C64 的静态功耗,AT24C64 采用I2 C 总线与A T89S5相连,A T89S52的P1. 3 作为它的串行时钟线,P1. 4 作为它的串行数据线。当通过通过按键设定一次数据完毕后(如:昼夜单价、等候时间、起租里程、起租金额等) ,系统就自动调用存储程序,将数据信息保存在
芯片内;当系统重新上电时,自动调用读存储器程序,将存储器内的数据信息,图2-20 AT24C64接线图读到缓存单元中,供主程序使用。由于保存在AT24C64 中的数据是不能随意进行改动的,因此它具有防作弊功能。此外出租车营运过程中的一些营运数据,如:单次出租的营运额和营运里程、一段时间内的营运总额和总路程等,也存储在AT24C64 中,以便出租车公司及司机查询,使出租车司机更方便的管理营运数据,出租车行业得到更有效的管理。 2.3.8 超速提醒与按键设置部分设计 1、有些出租车司机为了获取更多的时间来多送一个乘客,他们在送客过程中以高速行驶来榨取时间,而引起一些交通事故,为了制止这些事故发生,在系统程序中通过软件检测行驶速度,当速度高于设置的最高速度时即超速时以红色L ED 显示,乘客观察后可以提醒司机不要超速行驶,以避免交通事故发生。如图11 所示,按键部分有营运数据查询键和数据设置键,营运数据查询按键置于计价器的外面,司机通过该查询键可以查看1 个月的总营运额与总营运里程,和单次的营运额与营运里程。 短按查看总营运数据,再次短按则循环依次往上翻阅过去单次的营运数据,长按3 s 则跳出数据查询。数据设置键则秘密安放于计价器内部,且必须对计价器多处进行铅封,以防止司机通过该按键对营运的重要数据进行设置而作弊,该按键由出租车公司的专业人员来调整数据,由功能设置/ 确认键、UP、DOWN 键组成,其中功能设置/ 确认键对系统时间、起步价、白天/ 晚上单价、等待时间等数据调整进行设置, 然后通过UP 与DOWN 来对数据值进行加与减。然后再通过功能设置/ 确认键来对所设数据的确认。 2、矩阵按键 每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 3、超速提醒 当出租车速度超过规定速度时单片机接收信号控制语音系统播放超速提醒。
图2-21 矩阵键盘原理图
2.3.9 DS18B20电子温度计设计 1、DS18B20说明 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 TO-92封装的DS18B20的引脚排列如图1,其引脚功能描述表。 2、详细引脚功能描述
图2-22 DS18b20引脚图 表2-7 序号 名称 引脚功能描述 1 GND 地信号 2 DQ 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。 3 VDD 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
2 、硬件原理图:
图2—23 DS18B20电子温度计原理图
第三章 系统软件设计
软件设计部分可分为: 主程序控制程序、外部中断0空车灯信号中断程序、外部中断1 里程计算程序、T0 等待时间计数中断程序、MAX7920 串口液晶显示程序、DS1302 时钟程序、ISD2560 语音播报程序、AT24C64 数据存储程序、打印程序和键盘服务程序等;在整个软件中一些变量使用全局变量形式,以供主程序的调用并进行显示。 3.1 主程序设计
3.1.1程序功能介绍 在主程序模块中, 需要完成对各芯片的初始化 (MAX7219 ,A TAT24C64 , ISD2560 语音芯片及微型打印机的初始化) 、各中断的初始化(外部中断0 、外部中断1 、T0 的初始化) ,另外,在主程序模块中还需要设置启动/ 清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。主程序流程图如图12 所示。当空车信号灯打下时,表示有乘客上车,就就进行语音播报1 ,并启动计价,将根据里程寄存器中的内容计算和判断出行驶里程是否已超过起价公里数。若已超过,则根据里程值、每公里的单价和起价来计算出当前的累计价格,并将结果存于价格寄存器中,然后将当前时间和累计价格送MAX7219 驱动的L ED 显示电路显示出来。当中途塞车(等待或低速行驶) 时,在一定时间内没有检测到传感器的脉冲信号就启动T0 计时器进行计时,当超过规定的等待时间后,计价器就根据等待价格进行当前金额的累加与显示,并在计价器上显示等待时间;当到达目的地的时候,司机把空车灯打上,就停止计价,显示当前所应该付的金额和对应的单价,并进行语音播报2 ,及票据打印。等乘客下车后,启动出租车,计价器检测到传感器的脉冲信号,系统自动对显示清零,并重新进行初始化过程,完成1 次计价。
3.1.2程序主流程图
图3-1 程序主流程图 3.2 几个关键子程序设计 3.2.1 中断T1 里程计数程序设计 1、中断简介
中断由与中断有关的特殊功能寄存器、中断入口、顺序查询逻辑电路等组成,包括5个中断请求源,4个用于中断控制的寄存器IE、IP、ECON和SCON来控制中断类弄、中断的开、关和各种中断源的优先级确定。 2、设计原理 霍尔传感器输出的脉冲信号输入到单片机的外部中断T1接口,车轮每转一圈就产生一个脉冲信号,单片机就进行一次中断,在中断程序中完成两项任务: (1) 启动定时器1,表示出租车启动; TR1=1; ET1=1; (2) 单次里程与总里程的累加计算并将结果存入寄存器中(设车轮转1 圈为1 m ,则每中断1 次,里程就增加1 m) 。 if(num_T1==1)//载客变量为
1 { Num_time++;//轮胎圈数 if(today==1)//白天价格 { Sum_money=10+ Num_time* perimeter * price_1;//总价格
} if(today==0)//夜晚价格 { Sum_money=10+ Num_time* perimeter * price_1;//总价格
} }
3.2.2 T0 中途等待计时程序设计 1、 定时器说明 80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。 2、等待时间计时 当外部中断1 进行中断时就启动改T0 开始计时,每当计时到达1 min ,等待时间累加器值就自加,而超过规定的等待时间后,就对当前金额加上额外的中途等待的价钱,以后每0. 1 min 都自动加上中途等待的单价。当中途等待结束的时候,也就自动切换到正常的计价。 等待计时程序
TR0=1;
ET0=1;
if(wait==1)//进入等待 {
Time_wait++;//时间单位秒
if(Time_wait==60)//换算成分钟计时
{
Time++;
}
if(Time>=10)//等待超过10分钟
{
Time_money= (Time-10)* price_time;//等待金额,小于10分钟免费 } }
3.2.3 键盘服务程序设计 1、 矩阵键盘工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键。矩阵式键盘的按键识别方法,确定矩阵式键盘上何键被按下介绍一种“行扫描法”。 行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下,判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。单片机的P口用作键盘I/O口,键盘的列线接到P口的低4位,键盘的行线接到P口的高4位。列线P.0-P.3分别接有4个上拉电阻到正电源+5V,并把列线P.0-P.3设置为输入线,行线P.4-P.7设置为输出线。4根行线和4根列线形成16个相交点。检测当前是否有键被按下。检测的方法是P.4-P.7输出全“0”,读取P.0-P.3的状态,若P.0-P.3为全“1”,则无键闭合,否则有键闭合。去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P.4-P.7按下述4种组合依次输出:P.7 1 1 1 0,P.6 1 1 0 1 ,P.5 1 0 1 1,P.4 0 1 1 1,在每组行输出时读取P.0-P.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值 。2、键盘功能介绍 键盘采用查询的方式,其放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。键盘服务包括司机查询与出租车管理人员对数据的调整、时间设定、数据翻页查询等。
图3-2 矩阵键盘工作程序 3.2.4看门狗应用
1、看门狗作用 看门狗又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。 2、注意事项: a. AT89S52的看门狗必须由程序激活后才开始工作。所以必须保证CPU有可靠的上电复位。否则看门狗也无法工作。 b. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。 c. AT89S52只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。以上程序我已调试通过。利用定时器把看门狗的喂狗时间延长几秒至几分钟。
d. 在reg52.h声明文件中增加一行 sfr WDTRST = 0xA6; 3、应用程序
Main() { WDTRST=0x1E; WDTRST=0xE1;//初始化看门狗。 While (1) { WDTRST=0x1E; WDTRST=0xE1;//喂狗指令 .......... } }
3.3 时钟程序计
1、DS1302操作时序图
图 3-3 DS1302操作时序图
2、 DS1302寄存器说明 表3-1 寄存器 寄存器名 写命令 取值范围 各位内容 写操作 读操作 7 6 5 4 3 2 1 0 秒寄存器 80H 81H 0-59 CH 10sec sec 分寄存器 82H 83H 0-59 0 10min min 时寄存器 84H 85H 1-12/0-23 12/24 0 10/ap hr hr 日寄存器 86H 87H 1-28、29、30、31 0 0 10Date date 月寄存器 88H 89H 1-12 0 0 0 10m month 周寄存器 8AH 8BH 1-7 0 0 0 0 0 day 年寄存器 8CH 8DH 0-99 10year year
在控制指令字输入后的下一个 SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位 0开始。同样,在紧跟 8位的控制指令字后的下一个 SCLK脉冲的下降沿读出 DS1302的数据,读出数据时从低位 0位至高位 7,数据读写时序见图3-3。 2、DS1302操作流程图
图3-4
DS1302操作流程图 3、 由图3-3程序示程
如:设置时钟时间地址函数
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00);
/* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock);
/* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80);
/* 控制命令,WP=1,写保护?*/ }
3.4显示程序设计
1、指示程序流程图
判断状态?
开
始 正常工作指示 空 车 载 客 白天 夜间 Y N
图3-5指示控制流程图
2、指示程序 void
zsd()//指示灯服务状态 {
if(num_T1= =1)//载客状态
{
//指示
} if(num_T1= =0)//空车状态 { //指示 } if(today==0)//夜晚状态 { //指示 } if(today==1)白天状态 { //指示 } } else {
// } } 3、由时序图2-6液晶程序示例 如:LCD数据读写函数 void wr_lcd(uchar dat_comm,uchar content) {
uchar a,i,j;
delay(50);
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1;
//data
else
std=0;
//command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i<4;i++)
{
sclk=1;
sclk=0;
}
} }
3.5语音提-打印醒程序设计 1、流程图
Y 开始 是否载客? 播放欢迎词 是否下车? Y Y N 播放下车提醒,打印 N 是否超速? 播放超速提醒 Y
图3-6 语音播放程序流程 2、程序
void
yytx() {
if(num_T1==1)
{
//播放欢迎词
}
if(chick_out==1)//结账下车,数据保存,票据打印 {
//播放下车提醒
} } 3.6电子温度计程序设计 1、DSl820工作过程中的协议 初始化 -> ROM操作命令 -> 存储器操作命令-> 处理数据 ① 初始化
单总线上的所有处理均从初始化开始 ② ROM操作命令总线主机检测到DSl820的存在便可以发出ROM操作命令这些如表3-2所示 表3-2 ROM操作命令表 指令 代码 Read ROM(读ROM) 33H Match ROM(匹配ROM) 55H Skip ROM(跳过ROM] CCH Search ROM(搜索ROM) F0H Alarm search(告警搜索) ECH
表3-3 存储器操作命令表 指令 代码 Write Scratchpad(写暂存存储器) 4EH Read Scratchpad(读暂存存储器) BEH Copy Scratchpad(复制暂存存储器) 48H Convert Temperature(温度变换) 44H Recall EPROM(重新调出) B8H Read Power supply(读电源) B4H 2、温度转换算法及分析 由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)。其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。也就说,本系统的温度精确到了0.1度。 算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
4、 DS18B20操作时序图
图3-7
DS18B20复位时序
图3-8
DS18B20写时序
图3-9 DS18B20读时序
5、 DS18B20操作流程图
图
DS18B20操作流程图 4、DS18B20程序示例 如: 根据时序图DS18B20读数据函数() byte read_byte(void) { byte i; byte value = 0; for (i=8;i>0;i--) { value>>=1; DQ = 0; //DQ拉低开始测量 DQ = 1; // 变为高
delay(1);
if(DQ)value|=0x80; delay(6); // 等待响应 } return(value);}
第四章
系统调试 4.1调试遇到问题
1、液晶操作出现乱码
问题原因是在写地址和操作后写显示数据时延时时间不正确。
2、测量车程是开始无信号
原因,电路阻抗不匹配信号衰减太大,以至于I/O口检测不到信号。
3、DS1302读取时间不正确 原因,单片机操作DS1302时序不正确,导致读取数据混乱。 4、 测量里程不准
数据计算处理有问题,采样点较少,产生误差较大,受到外界干扰较大
4.2主要功能测试 多功能计价器的主要功能测试: ①准确测量汽车移动的距离, 误差< ±1 %。 ②累计测量低速及等待时间,误差< 1 %。 ③自动判别速度高低,低于设定速度时,累计低速时间,测量误差< ±0. 5km/ h 。 ④可准确指示当前时刻。 ⑤一次运营结束自动打印发票,并可打印累计金额发票,乘客提醒等。 ⑥自动存储一月运营数据(包括时间,里程,金额)。 ⑦在空车时可查询以往每天运营总计及每次运营数据。 ⑧租价、K值等各重要运营参数均可由管理人员在机外调整,方便可靠。 ⑨数据统计功能:机外计算机可与计价器进行双向通讯,除进行参数设置外,还可以由主计算机取得计价器所贮存运营数据,并进行脱机数据统计,为上层车管领导提供第一手材料。 ⑩显示功能:在显示屏的不同位置分别显示总运营金额、当前营运单价(动态刷新) 、等候时间、运营里程和当前时钟、车内温度。同时,显示屏在不同状态下也可显示其他内容。
第五章
未来展望与小结
本文设计了以单片机AT89S52 为核心,以语音芯片ISD2560 、DS1302时钟芯片、MAX7920 、DS18B20、AT24C64存储器等芯片为外设的新型出租车计价器。功能包括存储、万年历、温度、查询、显示各车辆的有关数据如计价器参数、驾驶员资料等;结算车费;将计价器内部存储的运营数据转存到存储器上;电子锁机;单双号管理等。 本计价器的税控流程如下:计价器在营运过程中实时金将计价器内所存数据存入存储器。同时因加密卡内部硬件较简单,所以价格较低,具有较高的性能价格比。利用存储器的功能,可以进一步解决了收费复杂的问题,同时出租车管理存储器可以对车辆的各种营运数据进行统计处理,定期接受查询,也可以制成计税和报税的营运数据统计表,方便交税。本计价器可通过写数据到存储器及打印累计票,准确计税,防止税金流失。司机根据存储器数据及发票到相应管理部门交税,并由管理部门用专用设备将存储器内数据清除。若司机未在规定时间内交税,则计价器将不再正常工作;若存储器因损坏,管理部门可凭累计票或正式发票存根来收税,并可留票备案。本计价器全部由高可靠性元件器件构成,具有多种抗干扰措施,能经受各种恶劣情况(如强磁、高温、剧烈颠簸等) 的考验。总之,多功能计价器用高度可靠的存储功能开申报营业税,而用打印机打印出正式发票,其它附带有电子万年历,电子温度计、语音提醒等功能,构成了现今最为完善、先进的智能计价器,这为国家 “三金”工程在出租车行业的顺利实施奠定了技术基础。本系统的研制,为微打行业提供了新的应用领域,全国上千万辆出租车对微型票据打印机的市场需求给微型票据打印机经销商也带来无限商机。为国家运管部门在出租车乱收费、交税等提供方便。相信很受出租车公司,运管部门、出租车司机及广大乘客的青睐。
致
谢 随着毕业论文的结尾,短暂而又充实的三年学习生涯也将落下帷幕。同时感谢曾经教导过我的XX职业技术学院的各位老师以及给我帮助和支持的同学,感谢指导老师XX老师的培育和指导。是他们帮助我顺利地完成了大学里的各项课程,使我懂得了做人的道理!谢谢那些默默陪我走过三年的朋友们,在这里请接受我最真诚的谢意!时光荏苒,时间终是短暂,但是这三年我在淮安信息学院却经历了重要的人生蜕变。三年来,给我帮助的人太多太多,令我感动的时刻不胜数,岁月的脚步依然匆匆,我会把每一份关怀,每一份勉励都铭记、珍藏。 老师以渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。不仅使我树了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。本论文从选题到完成,每一步都是在老师的指导下完成的,倾注了导师大量的心血。在此,谨向导师表示崇高的敬意和衷心的感谢!
参 考 文 献 [1] 徐江海. 单片机实用教程. 北京:机械工业出版,2008. [2] 何立民. 单片机应用技术选编[M] . 北京:北京航空航天大学出版,1999. [3] 陈小忠. 单片机接口技术实用子程序[M] . 北京:人民邮电出版,2005.
[4]杨恢先,黄辉先. 单片机原理及应用[M] . 长沙:国防科技大学出版,2003. [5] 陈 星. 出租车计价器防作弊方法构想[J ] . 中国计量出版, 2002 . [6] 王 力. 出租车计价器抗干扰措施的研究[J ] . 上海计量测试, 2002 [10]
[7] 吴承琦,孙培生,出租汽车计价器检定规程. 北京:中国计量出版,2003 [8] 何立民 单片机应用系统设计系统配置与接口技术. 北京:北京航空航天大学出版,2002 [9] AT89S52单片机使用说明书. Atmel Corporation 2000. [10]闫玉德,愈虹 MCS-51单片机原理与应用(c语言版).北京:机械工业出版,2002 [11] 12864带字库说明书 . 广州.广州唯创电子有限公司.2003
附录 DS1302电子时钟模块子程序 /********************************************************************* 模块名称:DS1302.c 功
能:实时时钟模块
时钟芯片型号:DS1302
说
明: 程序设计:张奇
设计时间:2010.01.02
*********************************************************************/
sbit
T_CLK
= P2^7;
/*实时时钟时钟线引脚 */ sbit
T_IO
= P1^4;
/*实时时钟数据线引脚 */ sbit
T_RST
= P1^5;
/*实时时钟复位线引脚 */
sbit
ACC0 = ACC^0; sbit
ACC7 = ACC^7;
void
RTInputByte(uchar);
/* 输入 1Byte */ uchar
RTOutputByte(void);
/* 输出?1Byte */ void
W1302(uchar, uchar); uchar
R1302(uchar); void
Set1302(uchar *);
/* 设置时间 */ void
Bcd2asc(uchar,uchar *); void
Get1302(uchar curtime[]); /* 读取1302当前时间 */
/********************************************************************
函 数 名:RTInputByte() 功
能:实时时钟写入一字节 说
明:往DS1302写入1Byte数据 (内部函数) 入口参数:d 写入的数据
返 回 值:无
设
计:张奇
日
期:2010-01-2
***********************************************************************/ void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0;
/*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
} /********************************************************************
函 数 名:RTOutputByte() 功
能:实时时钟读取一字节 说
明:从DS1302读取1Byte数据 (内部函数) 入口参数:无
返 回 值:ACC 设
计:张奇
日
期:20010-01-2
***********************************************************************/ uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
/*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
} /********************************************************************
函 数 名:W1302() 功
能:往DS1302写入数据 说
明:先写地址,后写命令/数据 (内部函数) 调
用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址, ucData: 要写的数据 返 回 值:无 设
计:张奇
日
期:2010-01-2 ***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) {
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr);
/* 地址,命令 */
RTInputByte(ucDa);
/* 写1Byte数据*/
T_CLK = 1;
T_RST = 0; }
/********************************************************************
函 数 名:R1302() 功
能:读取DS1302某地址的数据 说
明:先写地址,后读命令/数据 (内部函数) 调
用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址 返 回 值:ucData :读取的数据 设
计:张奇
日
期:2010-01-2
***********************************************************************/ uchar R1302(uchar ucAddr) {
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr);
/* 地址,命令 */
ucData = RTOutputByte();
/* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData); } /********************************************************************
函 数 名:BurstW1302T() 功
能:往DS1302写入时钟数据(多字节方式) 说
明:先写地址,后写命令/数据 调
用:RTInputByte()
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B
1B
1B 1B 返 回 值:无 设
计:张奇
日
期:2010-1-2 ***********************************************************************/ void BurstW1302T(uchar *pWClock) {
uchar i;
W1302(0x8e,0x00);
/* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbe);
/* 0xbe:时钟多字节写命令 */
for (i = 8; i>0; i--)
/*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
RTInputByte(*pWClock); /* 写1Byte数据*/
pWClock++;
}
T_CLK = 1;
T_RST = 0; }
/********************************************************************
函 数 名:BurstR1302T() 功
能:读取DS1302时钟数据 说
明:先写地址/命令,后读数据(时钟多字节方式) 调
用:RTInputByte() , RTOutputByte() 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B
1B
1B 返 回 值:无 设
计:张奇
日
期:2010-01-2
***********************************************************************/ void BurstR1302T(uchar *pRClock) {
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbf);
/* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pRClock = RTOutputByte();
/* 读1Byte数据 */
pRClock++;
}
T_CLK = 1;
T_RST = 0; } /********************************************************************
函 数 名:BurstW1302R() 功
能:往DS1302寄存器数写入数据(多字节方式) 说
明:先写地址,后写数据(寄存器多字节方式) 调
用:RTInputByte() 入口参数:pWReg: 寄存器数据地址 返 回 值:无 设
计:张奇
日
期:2010-01-2 修
改:
日
期:
***********************************************************************/ void BurstW1302R(uchar *pWReg) {
uchar i;
W1302(0x8e,0x00);
/* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xfe);
/* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--)
/* 31Byte 寄存器数据 */
{
RTInputByte(*pWReg);
/* 写1Byte数据*/
pWReg++;
}
T_CLK = 1;
T_RST = 0; }
/********************************************************************
函 数 名:BurstR1302R() 功
能:读取DS1302寄存器数据 说
明:先写地址,后读命令/数据(寄存器多字节方式) 调
用:RTInputByte() , RTOutputByte() 入口参数:pRReg: 寄存器数据地址 返 回 值:无 设
计:张奇
日
期:2010-01-2 ***********************************************************************/ void BurstR1302R(uchar *pRReg) {
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xff);
/* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--)
/*31Byte 寄存器数据 */
{
*pRReg = RTOutputByte();
/* 读1Byte数据 */
pRReg++;
}
T_CLK = 1;
T_RST = 0; } /********************************************************************
函 数 名:Set1302() 功
能:设置初始时间 说
明:先写地址,后读命令/数据(寄存器多字节方式) 调
用:W1302() 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B
1B
1B 返 回 值:无 设
计:张奇
日
期:2010-01-2 ***********************************************************************/ void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00);
/* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock);
/* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80);
/* 控制命令,WP=1,写保护?*/ } /********************************************************************
函 数 名:Get1302() 功
能:读取DS1302当前时间 说
明: 调
用:R1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)
1B 1B 1B 1B 1B
1B
1B 返 回 值:无 设
计:张奇
日
期:2010-01-2 ***********************************************************************/ void Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
} }
DS18B20温度测试模块子程序
/********************************************************************* 模块名称:DS1820.c 功
能:实时测温 模块
测温芯片型号:DS18B20
说
明:这里以12M晶体为例,不同的晶体速度可能需要调整延时的时间: 程序设计:张奇
设计时间:2010.02.06
*********************************************************************/
sbit DQ =P2^1;//定义端口
typedef unsigned char byte; typedef unsigned int word;
/********************************************************************
函 数 名:delay() 功
能:延时 说
明: 返 回 值:无
设
计:张奇
日
期:2010-02-6 ***********************************************************************/ void delay(word useconds) { for(;useconds>0;useconds--); } /********************************************************************
函 数 名:read_byte() 功
能:复位 说
明:使ds18b20 复位 返 回 值:无
设
计:张奇
日
期:2010-02-6 ***********************************************************************/ byte ow_reset(void) { byte presence; DQ = 0; // DQ=0; delay(29); // 延时 DQ = 1; // DQ为高 delay(3); // 等待 presence = DQ; // 给一个状态信号
delay(25); // 等待最后状态 return(presence); // 返回状态 }
/********************************************************************
函 数 名:read_byte() 功
能:延时 说
明:从 总线上读取一个字 返 回 值:无
设
计:张奇
日
期:2010-02-6 ***********************************************************************/ byte read_byte(void) { byte i; byte value = 0; for (i=8;i>0;i--) { value>>=1; DQ = 0; //DQ拉低开始测量 DQ = 1; // 变为高
delay(1);
if(DQ)value|=0x80; delay(6); // 等待响应 } return(value); } /********************************************************************
函 数 名:write_byte(char val) 功
能:写一个字节 说
明:向 1-WIRE 总线上写一个字节 返 回 值:无
设
计:张奇
日
期:2010-02-6 ***********************************************************************/ void write_byte(char val) { byte i; for (i=8; i>0; i--) // 写一个字节时间 { DQ = 0; // 把DQ拉低开始取字节 DQ = val&0x01; delay(5);
DQ = 1; val=val/2; } delay(5); } /********************************************************************
函 数 名:Read_Temperature(void) 功
能:读取温度 说
明:读取温度 返 回 值: temp.x/2 设
计:张奇
日
期:2010-02-6 ***********************************************************************/ char Read_Temperature(void) { union{ byte c[2]; int x; }temp;
ow_reset(); write_byte(0xCC);
write_byte(0xBE);
temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset(); write_byte(0xCC);
write_byte(0x44); // 开始转化 return temp.x/2; }
lcd12864液晶显示模块子程序
/********************************************************************* 模块名称:MAX7219.c 功
能:液晶串口显示模块
液晶芯片型号:ST7920和LCD12864 说
明: 程序设计:张奇
设计时间:2010.02.25
*********************************************************************/
#include <reg52.h>
#define uint
unsigned int #define uchar unsigned char #define x1
0x80 #define x2
0x88 #define y
0x80 #define comm
0 #define dat
1
sbit cs
= P2^1; sbit std
= P2^2; sbit sclk = P2^4;
sbit rst
= P2^3;
//Reset Signal 低电平有效
void wr_lcd (uchar dat_comm,uchar content); void delay (uint us); /******************************* 在下列数组中填写 需要显示的开机画
及其他显示内容 ********************************/ uchar code tab1[]={
"欢迎乘坐宝马出租车" "
欢 迎 你
" "
祝你乘坐愉快
"
};
uchar code tab31[]={ "淮安信息职业 " "
技术学院 "
"
张
奇" }; /********************************************************************
函 数 名:LCM_init() 功
能:初始化LCM 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void init_lcd(void) {
rst=1;
psb=0;
wr_lcd(comm,0x30);
/*30---基本指令动作*/
wr_lcd(comm,0x01);
/*清屏,地址指针指向00H*/
delay(100);
wr_lcd(comm,0x06);
/*光标的移动方向*/
wr_lcd(comm,0x0c);
/*开显示,关游标*/ } /********************************************************************
函 数 名:chn_disp() 功
能:显示汉字或字符 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void chn_disp(uchar code *chn) {
uchar i,j;
wr_lcd(comm,0x30);
wr_lcd(comm,0x80);
for(j=0;j<4;j++)
{
for(i=0;i<16;i++)
wr_lcd(dat,chn[j*16+i]);
} } /********************************************************************
函 数 名:chn_disp1() 功
能:初始化LCM 说
明: 上半屏显示汉字或字符
入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void chn_disp1(uchar code *chn) {
uchar i,j;
wr_lcd(comm,0x30);
wr_lcd(comm,0x80);
j=0;
for(i=0;i<16;i++)
wr_lcd(dat,chn[j*16+i]);
wr_lcd(comm,0x90);
j=1;
for(i=0;i<16;i++)
wr_lcd(dat,chn[j*16+i]); }
/********************************************************************
函 数 名:con_disp() 功
能:当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl. 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void con_disp(uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl) {
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,y0+j);
wr_lcd(comm,x0+i);
wr_lcd(comm,0x30);
wr_lcd(dat,data1);
wr_lcd(dat,data2);
}
}
wr_lcd(comm,0x36); } /********************************************************************
函 数 名:clrram() 功
能:清DDRAM 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void clrram(void) {
wr_lcd(comm,0x30);
wr_lcd(comm,0x01);
delay(180); }
/********************************************************************
函 数 名:wr_lcd() 功
能:读写 说
明: 参数名称: 输入/输出? 类型
描述 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void wr_lcd(uchar dat_comm,uchar content) {
uchar a,i,j;
delay(50);
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1;
//data
else
std=0;
//command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i<4;i++)
{
sclk=1;
sclk=0;
}
} } /********************************************************************
函 数 名:delay() 功
能:通用延时 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void delay(uint us)
//delay time {
while(us--); } /********************************************************************
函 数 名:delay1() 功
能:通用延时几毫秒
(11.0592mhz) 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/
void delay1(uint ms) {
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1); } /********************************************************************
函 数 名:main() 功
能:调用上述函数显示内容 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2010-2-25
***********************************************************************/ void main() {
SP=0x5f;
init_lcd(); //初始化
while(1)
{
lat_disp(0x00,0x00); //显示点阵地址
chn_disp(tab1); // 显示欢迎汉字
con_disp(0xff,0xff,0x8c,0x80,2,16);//反显,正常选择
delay1(8000);//延时
clrram();//清屏
lat_disp(0xcc,0xcc);//显示点阵地址
delay1(8000);
lat_disp(0x00,0x00);//显示点阵地址
chn_disp1(tab31);//
img_disp1(tab32);//显示图像下
delay1(8000);
clrram();
lat_disp(0xff,0x00);//显示点阵地址
delay1(8000);
img_disp(tab5);
//显示图像上,tab5,为图像取模数组
delay1(8000);
} } AT24C64存储模块子程序模块 /********************************************************************* 模块名称:AT24C64 功
能:实时存储模块
存储芯片型号:AT24C64 说
明: 程序设计:张奇
设计时间:209.5.20
*********************************************************************/
#include"reg52.h" #include "intrins.h"
sbit scl=P;//时钟线 sbit sda=P;//数据线
/********************************************************************
函 数 名:flash() 功
能:延时 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ void flash()
//时序延时 {
unsigned char i;
for(i=0;i<10;i++){ _nop_ ();
} } /********************************************************************
函 数 名:start()
功
能:AT24C64 启动子程序 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ void start()
//AT24C64 启动子程序 {
scl=1;
//时钟高
sda=1;
//
flash();
sda=0;
//1--0
flash();
scl=0;
//
flash(); } /********************************************************************
函 数 名: stop()
功
能:停止 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ void stop()
// { scl=1;
//时钟高 sda=0; flash() ; sda=1;
//0--1 flash(); } /********************************************************************
函 数 名:empty()
功
能:主应答信号,非 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ void empty()
{ sda=1; scl=1;
//时钟高 flash() ; scl=0;
//时钟低 sda=0; flash() ; } /********************************************************************
函 数 名:writex() 功
能:写字节函数,芯片应答检测 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ void writex(unsigned char j)
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
if ((temp&0x80)!=0)
{
sda=1;
}//判最高位数据,1
else
{
sda=0;
}
//0
flash();
scl=1;flash();scl=0;
// 时钟
flash();
temp=temp<<1; //
数据左移1位
}
sda=1;
//置为输入口
scl=1;
//时钟高
while((sda==1)&&(i<255))
{
i++;
}
//等芯片输出低并延时
scl=0;
//时钟低
sda=0;
//为启动做准备 } /********************************************************************
函 数 名:readx()
功
能: 读字节函数 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:2009-05-20
***********************************************************************/ unsigned char readx()
{
unsigned char i,j,k=0;
sda=1;
//置为输入口
for (i=0;i<8;i++)
{
scl=1;
//时钟高
if (sda==1) j=1;
//读
else j=0;
k=(k<<1)|j;
//取数据
flash();
scl=0;
//时钟低
flash();
}
return(k);
//返回测量值
} /********************************************************************
函 数 名:xAT24C64_read() 功
能:读单字节函数 说
明: 入口参数: 返 回 值:无
设
计:XX
日
期:2009-05-20
***********************************************************************/ unsigned char xAT24C64_read(unsigned char address) { unsigned char i; start();
//启动 writex(0xa0);
//写器件地址,写 writex(address);
//写芯片地址 start();
//启动 writex(0xa1);
//写器件地址,读 i=readx();
// 读数据 empty();
//应答,主应答 stop();
//停止 return(i);
//返回 } void xAT24C64_write(unsigned char address,unsigned char info1,unsigned char info2)//根据保存数据多少可添加相应地址 {
start();
//启动
writex(0xa0);
//写器件地址,写
writex(address);
//写芯片地址
writex(info1);
//数据
writex(info2);
//数据 stop();//停止
}
IDS2560语音提醒模块子程序 /********************************************************************* 模块名称:ids2560.c 功
能:语音提醒模块
语音芯片型号:IDS2560 说
明: 程序设计:张奇
设计时间:2009.11.28
*********************************************************************/
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
void record(void); void playback(void);
uchar count;
// 重复播放次数计数器 uchar StartFlag;
// 开始键按下标志 uchar IdleFlag;
// 系统是否处于空闲状态标志
/* 定义语音芯片ISD2560的控制引脚 */ sbit START = P1^0; sbit EOM = P1^4; sbit PR = P1^5; sbit PD = P1^6; sbit CE = P1^7;
/********************************************************************
函 数 名:delay() 功
能:延时 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:209-11-28
***********************************************************************/ void delay(uint t) {
uint i;
while(t--)
{
for (i=0;i<125;i++)
{}
} } /********************************************************************
函 数 名:record() 功
能:
录音函数 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:209-11-28
***********************************************************************/ void record(void) {
CE = 0;
PD = 0;
PR = 0;
} /********************************************************************
函 数 名:playback(void) 功
能: 放音函数 说
明: 入口参数: 返 回 值:无
设
计:张奇
日
期:209-11-28
***********************************************************************/
void playback(void) {
CE = 0;
PD = 0;
PR = 1;
} 打印模块程序 /********************************************************************* 模块名称:打印程序模块 功
能:
说
明: 程序设计:张奇
设计时间:2010.01.30
*********************************************************************/
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit BUSY = P1^0; uchar data A[]={0x1b,0x38,0x04, //初始化命令 /*0xd0,0xc2,0xc8,0xd9,0xb4,0xef,*/ //需要打印汉字内内容 0x0d}; //打印命令 void main() { int i; SCON = 0xd0; //串口初始化 1 位起始位,9 位数据位,1 位停止位 TMOD |= 0x20; // PCON |= 0x00; TH1=0xf4; //波特率2400 TL1=0xf4; TR1=1; ES=1; TI=0; for (i=0;i<10;i++) {ACC=A[i]; TB8=P; //计算奇偶校验位 while(BUSY){BUSY = 1;} SBUF = A[i]; //发送打印数据 while (!TI) { } TI=0; } }
猜你喜欢
- 2024-01-02 2024年度居民代表述职报告(全文)
- 2023-10-30 2023年谢师宴学生代表致辞10篇【精选推荐】
- 2023-10-25 元旦晚会学生代表的发言稿3篇
- 2023-10-24 2023年实用员工代表发言稿6篇
- 2023-09-26 老员工员工代表发言稿8篇(2023年)
- 2023-08-10 2023年谢师宴学生代表致辞10篇【精选推荐】
- 2023-08-06 2023年学生代表发言稿6篇【优秀范文】
- 2023-07-15 优秀共产党员代表发言(范文推荐)
- 2023-07-12 2023入党思想汇报
- 2023-07-08 教师代表在毕业典礼上发言
- 搜索
-
- 宝贝 我想听你娇喘_听不了,你这样呻吟 01-17
- 学习第二次中央新疆工作座谈会精神心得 06-13
- 落实意识形态工作责任制方面存在的问题 04-14
- 【银行内控总结】 银行金点子创意实例 01-02
- 社区党群服务中心经验做法 05-10
- 2023年度代表爱情红包数字3篇 03-02
- 党代会“次数”和委员会“届数”是如何 08-13
- “净网”工作总结 04-30
- “学习强国”典型个人事迹材料 04-23
- 党员民主评议自我评价24篇 03-23
- 网站分类
-
- 标签列表
-