第一篇:关于开展出租车计价器计量专项监督检查的
关于开展出租车计价器计量专项监督检查的
通
告
各出租车营运公司、个体业主:
为进一步加强对我县出租车计价器的管理,保护广大消费者和经营者的合法利益,营造放心的乘车环境,根据《中华人民共和国计量法》、《中华人民共和国强制检定的工作计量器具检定管理办法》相关规定,我局将对全县出租车计价器开展专项计量监督检查工作,现就相关事宜通告如下:
一、各出租车营运单位要强化自身主体责任意识,建立健全计量管理制度(包括计价器的安装、使用、周期检定、维修、日常检查等方面),建立和完善计价器台帐和书面维修记录,加强对出租车驾驶员的管理,强化从业人员的法制计量意识教育和培训,坚决杜绝利用计价器进行作弊的违法行为。
二、各出租车营运单位及个体业主要对出租车计价器开展自查活动,对计价器铅封、合格标志、检定周期等情况进行检查,发现铅封、合格标志和一次性封贴破坏或脱落,超检定周期使用计价器等不符合规定的,应立即停止营运,主动向质量技术监督局检测中心申请检定,经检定合格后方可投入营运;对发现存在私拆铅封、改变计价器原有功能、利用计价器进行作弊的行为,应主动向我局报告并接受处理。
三、此次检查重点为出租车计价器的铅封是否有损坏现象;计价器是否按周期检定,检定证书是否在有效期内;出租车计价器的参数是否改变,是否有破坏计价器准确度的违法行为;出租车计价器是否有因芯片设定有误出现死机等现象;利用作弊手段破坏计价器准确度等坑害消费者利益的计量违法行为。
四、自2012年5月15日起,我局将对全市出租车进行专项计量执法检查,依法对违反计量法律、法规的行为进行严肃查处并通过新闻媒体向社会通报。
质监部门提醒广大乘客,若对出租车计价器收费有疑问,可首先看计价器铅封是否完好,其次看计价器是否归零,然后看是否有质监部门出具的检定证书,如有上述疑义,务必记录车牌号,并拨打12365进行投诉举报。希望广大市民在消费过程中起到监督作用,以维护自己的合法权益。
监利县质量技术监督局
二〇一二年四月十五日
第二篇:出租车计价器
基于单片机的出租车计价器设计
摘要
出租车计价器的数字系统的设计正是基于一些专用的芯片,才发挥其有效特性,从而实现出租车的计价功能。此数字系统主要分为三个单元,即里程计数及显示单元、价格计数及显示单元、脉冲产生。本设计是一个基于单片机AT89C51的出租车自动计费设计,附有复位电路,时钟电路等。关键词:出租车计费器;单片机;控制
Abstract Taximeter design digital system is based on some special chip, to play their effective characteristics, thus realizing the taxi valuation function.This system is mainly pided into there modules, namely the mileage counting and display unit, and display unit price counting, pulsing.The design is based on a single chip AT89C51taxis design, a reset circuit, clock circuit.Keywords:taximeter,a single-chip microcomputer,control
1引言
1.1 设计目的
近几年来,出租汽车行业在各地得以蓬勃发展,但采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强。
1.2 功能要求
(1)用前4位数码管实时显示里程数,单位为千米,最后一位为小数位;用后4位数码管时时显示金额数,单位为元,最后一位为小数位。
(2)规定出租车里程小于2千米收费5元,超过2千米收费为8*(way-20)/5。
1.3 设计方法
本设计采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。设计方案及原理
2.1 设计方案
采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器/定时器T1工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。本电路设计的计价器不但能实现基本的计价,而且
单片机原理及系统课程设计报告
还能根据里程来调节单价。
2.2 设计原理
出租车计价是根据车所行驶的路程以及乘客乘车的里程综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。通过计数接收到的脉冲个数,计算出当前所行驶的路程。同时,通过数码管显示当前的行驶里程和需支付的车费。出租车计价器用于记录里程、起步公里数与价格的关系。模拟出租车计价器能根据总里程数、起步公里数的情况作出相应报价等。这个系统以AT89C51单片机为主控器,单片机的计数器/定时器T1工作在方式1下来对外部脉冲计数,最后通过集成的8位7段LED数码管显示里程数和价钱。总体模块框图如图1所示。
总金额显示单价显示AT89C51脉冲产生动态扫描数码管显示
图1 总体框图 硬件设计
对于AT89C51的计数器/定时器T1,通过对寄存器TCON的设置,即使它的M1M0=01,计数器/定时器T1工作在方式1下,构成16位计数器/定时器。此时TH0、TL0都是8位加法计数器。此设计中,T1为计数工作方式,计数范围为1~2^16=1~65536(个外部脉冲)。当计数溢出时则置位并申请中断,进入中断服务 执行中断程序。
通过74HC138接P20、P21、P22输出来对8位7段的智能扫描LED进行段选,并且通过P1口对LED进行位选,最后将结果显示在LED上。硬件设计图如图2所示。
74HC138是三八译码器,在工作之前,使74HC138的使能端有效,再使74HC138的A、B、C接P20、P21、P22的输出达到对LED位选线的控制,使相应的位显示相应的结果。硬件总设计图如图2所示。
第三篇:关于开展2005计量认证专项监督检查的总结
我市关于开展2005计量认证专项监督检查的总结省计量处:根据《xx省质量技术监督关于开展2005计量认证专项监督检查工作的通知》(x质监局[2005]150号)的文件要求及工作安排部署,我局领导重视,精心组织,重点落实,对辖区内的食品检验机构进行了认真、全面的计量认证专项监督检查。
领导重视,精心组织,确定方案,认真开展计量认证专项监督检查。我局接文后,对前阶段的工作进行了认真的总结及分析,对辖区内的食品检验机构进行全面的检查,并摸清了食品检验机构的底数和现状,为了巩固前阶段的工作成效,我局成立由xxx副局长为组长,以xxx等四人组成的计量认证专项监督检查组,分别对我市质量技术监督检测中心,xx省xx市食品药品检验所及xx市疾病预防控制中心进行了认真、细致的检查。实事求是,认真检查,把这次计量认证专项监督检查工作落到实处。12月2日至12月6日,我局检查组对xx市质量技术监督检测中心,xx省xx市食品药品检验所,xx市疾病预防控制中心的食品检验检测实验室的仪器设备、人员、环境、方法、标准物质及标准液进行逐项的技术能力核查,对实验室的组织和管理,仪器和设备等6个大项32个小项进行了认真的监督检查考评。各实验室的非食用蛋白水解液、工业冰醋酸、胭脂红等11个检测项目的仪器设备、标准物质或标准液的能力检查基本达不到满足要求,检验项目的人员、环境等条件、能力检查基本达到要求。实验室的组织和管理,仪器和设备等6个大项32个小项的监督检查考评基本符合考评要求。通过对实验室的技术能力核查及监督检查考评,检查组综合分析认为,各实验室存在的问题:一是检验项目的仪器设备需要改进或增加;二是人员素质和检验方法需要进一步提高;三是标准物质或标准液需要进一步加强。同时还对实验室的有关问题做出了记录或建议:一是实验室无能力验证计划;二是实验室无标品标签;三是实验室无留样室或样品专用柜;四是检验报告信息量不齐全。但各实验室管理基本规范,基本满足计量认证要求,个别项目需要改进,各实验室负责人接受了改进意见。经检查组全体成员的共同研究,一致同意通过监督检查并同意上报。x市质量技术监督局2005年12月9日
第四篇:关于开展计量器具专项监督检查的通知
关于开展计量器具专项监督检查的通知
海拉尔区各用能企业:
为落实国家、自治区计量工作会议精神,加强对煤矿等部分行业在用计量器具的监督管理,按照自治区局的统一部署和安排,在全市范围内组织开展煤矿等部分行业(含国家和自治区重点监控的高耗能企业,盟市控制的重点耗能企业)在用计量器具的计量专项监督检查工作。
请各用能企业按照《内蒙古自治区煤矿等部分行业开展在用计量器具专项监督检查方案》的要求,针对检查的有关项目开展自查工作,并填报《企业计量监督检查通知书》(一式两份,并加盖公章,随报告一起上报,质监局盖章,交企业1份留存)、《企业计量管理情况自查表》。自查企业要在8月8日前完成自查工作,向海拉尔区质监局综合办提交书面自查报告(电子版发到邮箱yym19830425@126.com)。报告应包括以下几部分内容:计量器具配备情况及存在的问题、检定情况及存在的问题、管理情况及及存在的问题、建议等。
8月10日至8月25日,海拉尔区质量技术监督局将根据企业、旗市区局的自查结果进行抽查。
内蒙古自治区煤矿等部分行业 开展在用计量器具专项监督检查方案
一、总体要求和工作目标
全面贯彻全区质检工作会议和全区经济工作会议精神,以加快发展为主题,以“抓质量、保安全、强质检、促发展”为主线,以深入开展包括辖区内煤矿、石油石化、冶金、化工等部分行业在用计量器具的计量专项监督检查为抓手,坚持安全第一,预防为主的方针,按照企业全面自查,盟市跟踪检查,自治区重点抽查的原则,达到防范煤矿等部分行业重特大事故发生、维护广大人民群众的身体健康和生命财产安全。同时也为全面推动城市能源计量中心(内蒙古)建设提供基础信息,为实现我区节能减排工作目标提供技术保障。
二、检查范围和内容
国家和自治区重点监控的高耗能企业全部列入检查范围。盟市控制的重点耗能企业涉及煤矿、石油化工、冶金、化工的也列入检查范围。具体内容如下。
(一)计量器具的配备情况
应配备安全防护用强检计量器具数,已配备安全防护用强检计量器具,配备的安全防护用强检计量器具是否有出厂产品合格证、制造计量器具许可证标志等。
(二)计量器具的检定情况
安全防护用强检计量器具是否依法申请了强制检定,是否有未经检定、检定不合格或者超过检定周期继续使用的情况。其他计量器具是否自行检定或者送其他计量检定机构检定。执行检定工作的计量技术机构。当地计量检定机构能够完成检定所占的比例。
(三)计量器具的管理情况
是否配备了专(兼)职的计量管理人员。是否建立了计量器具周期检定、报废、更新制度和自查制度。
三、检查方式
企业自查与质量技术监督部门抽查相结合,以企业自查为主的方式。自治区局将抽调相关行业的专家,按照10-15%的比例进行抽查。
四、具体要求
(一)《企业计量监督检查通知书》由各盟市局根据情况自行印刷,内容可以增加。企业计量管理情况自查表中,出现不符合规定项时,要在自查不符合项栏说明情况。企业名单有与当地企业不符合的情况,请及时与计量处沟通,以便调整。
(二)加强煤矿等部分行业计量监督管理工作,确保煤矿等部分行业在用安全防护用强检计量器具量值的准确可靠,直接关系到煤矿等部分行业的安全生产,是防范煤矿等部分行业重特大事故发生的重要措施。各地要从维护广大人民群众的身体健康和生命财产安全的高度出发,充分认识做好煤矿等部分行业计量监督管理工作的重要意义,进一步增强责任意识,加大计量监管力度,充分发挥计量工作在煤矿等部分行业中的基础保障作用。
(三)通过此次检查,各地要帮助企业查找在计量管理方面存在的薄弱环节,制定有效监管对策,督促企业做好安全防护用强检计量器具的依法检定工作,引导和帮助企业建立和完善计量器具的周期检定制度,计量器具报废和更新制度,以及各种日常的不定期自查制度。对此次检查中发现的未按照规定申请检定、经检定不合格或者超过检定周期继续使用计量器具的企业,各地要督促其及时改正并依法予以处理。
(四)在此次检查中,要加大对计量法律法规的宣传力度,提高企业的计量法制意识,督促企业不断进行自我规范。在此基础上,各地要逐步建立和完善煤矿等部分行业计量监督管理工作的长效机制,特别对安全防护用强检计量器具要进行重点监督,督促企业确保安全防护用强检计量器具依法处于受控状态。
(五)各地要主动和当地煤矿等部分行业的管理部门沟通,积极争取其支持和配合,共同做好对煤矿等部分行业的计量监督管理工作。在此次检查中,各地还要指导有关计量检定机构切实做好安全防护用强检计量器具的检定工作,认真履行检定工作职责,按时完成检定任务,确保检定工作质量。
第五篇:出租车计价器设计
出租车计价器课程设计(1)
(2009-07-20 12:10:25)
转载
标签: 杂谈 分类:技术资料
目录
前言
1、系统工作原理 1.1 功能说明 1.2 基本原理
2、硬件设计
2.1 单片机最小系统单元 2.2 A44E霍尔传感器检测单元 2.3 AT24C01存储单元 2.4 键盘调整单元 2.5 显示单元
3、软件设计 3.1 系统主程序 3.2 中断程序
3.2.1 里程计数中断程序 3.2.2 中途等待中断程序 3.3 计算程序 3.4 显示程序 3.5 键盘程序
4、总结 参考文献
附录A 系统原理图 附录B 系统源程序
前言
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
第一章 系统工作原理
1.1 功能说明
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
1.2 基本原理
计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。
霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。
图1 系统结构图
第二章 硬件设计
2.1 单片机最小系统单元
主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2所示。
图2 单片机最小系统图
AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。
2.2 A44E霍尔传感器检测单元
A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理如图3所示。
图3 A44E霍尔传感器原理
里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。
图4 传感器测距示意图
本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可
以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。
图5 A44E霍尔元件接线图
2.3 AT24C01存储单元
存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。AT24C02芯片引脚配置如图6所示。
存储单元电路连接如图7所示。
图 7 存储单元电路原理图
图中R4、R5 是上拉电阻,其作用是减少AT24C01 的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。
每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。
2.4 键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。
图8 键盘调整单元接线图
S1:接P1.0口,对上一次的计费进行清零,为下次载客准备
S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
2.5 显示单元
显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。电路如图9所示。
图9 数码管显示图
第三章 软件设计
3.1 系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图10所示。
图10 主程序流程图 图11 计算程序流程图
3.2 中断程序
3.2.1 里程计数中断程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。
3.2.2 中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。
3.3 计算程序
计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图11所示。
3.4 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
3.5 键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图12。
图12 键盘程序流程图
第四章 总结
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
参考文献
[1] 马淑华,王凤文,张美金编著.单片机原理与接口技术(第二版).北京:北京邮电大学出版社,2007.[2] 谭浩强著.C程序设计(第三版).北京:清华大学出版社,2005.源程序
#include
#define uchar unsigned char #define uint unsigned int #define delayNOP();{_nop_();_nop_();_nop_();_nop_();_nop_();};
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sbit exter=P3^3;//外部中断
sbit key0=P1^0;//清零 sbit key1=P1^1;//切换/+ sbit key2=P1^2;//-sbit key3=P1^3;//功能键
sbit p30=P3^0;//数码管各位控制 sbit p31=P3^1;sbit p32=P3^2;sbit p34=P3^4;sbit p35=P3^5;sbit p36=P3^6;sbit p37=P3^7;sbit SDA=P2^3;//IIC引脚 sbit SCL=P2^2;
uint inter,aa,bb,temp,temp1;uint zongjine,licheng,dengdai;uint key3num,qiehuantemp,delaytemp;uchar danjia1,danjia2,danjia3,danjia,qibu;
void delay(uint x)//延时时基为1ms { int i,j;for(i=x;i>0;i--)for(j=340;j>0;j--);}
void start()//IIC开始位 { SDA = 1;SCL = 1;delayNOP();SDA = 0;delayNOP();SCL = 0;}
void stop()// IIC停止位 { SDA = 0;delayNOP();SCL = 1;delayNOP();SDA = 1;}
void respons()//IIC{ uchar i;SCL=1;delayNOP();while((SDA==1)&&(i<250))i++;SCL=0;delayNOP();}
uchar read_byte()// { uchar i,j;for(i=0;i<8;i++){ SCL=1;j<<=1;
应答位 从EEPROM读到MCU j|=SDA;SCL=0;} return(j);}
void write_byte(uchar date)// { uchar i,temp;temp=date;for(i=0;i<8;i++){ temp=temp<<1;SCL=0;delayNOP();SDA=CY;delayNOP();SCL=1;delayNOP();} SCL=0;delayNOP();SDA=1;delayNOP();}
从MCU写到EEPROM void write_data(uchar addr, uchar date)// 在指定地址addr处写入数据date { start();write_byte(0xa0);respons();write_byte(addr);respons();write_byte(date);respons();stop();}
uchar read_data(uchar addr)// { uchar date;start();write_byte(0xa0);respons();write_byte(addr);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;
在指定地址addr读取数据 }
void display(uint zongjine0,uint licheng0,uint danjia0)//数码管显示 { uint jbai,jshi,jge,lshi,lge,dshi,dge;uint numwei,numshu;//数码管位置分配
jbai=zongjine0/100;jshi=zongjine0%100/10;jge=zongjine0%100%10;lshi=licheng0/10;lge=licheng0%10;
dshi=danjia0/10;dge=danjia0%10;
//数码管动态显示 if(aa){ aa=0;numshu++;if(numshu==7)numshu=0;P3=0xff;switch(numwei){ case 0:p30=0;P0=table[jbai];break;case 1:p31=0;P0=table[jshi]&0x7f;break;case 2:p32=0;P0=table[jge];break;case 3:p34=0;P0=table[lshi];break;case 4:p35=0;P0=table[lge];break;case 5:p36=0;P0=table[dshi]&0x7f;break;case 6:p37=0;P0=table[dge];break;} numwei++;if(numwei==7)numwei=0;} }
void keyscan()//键盘扫描 { if(key3==0)//功能键调节 { delay(5);if(key3==0){ key3num=1;while(!key3);delay(5);while(!key3);while(key3num){ if(key3num==1)//调白天单价
{ if(key1==0){ delay(5);if(key1==0){ danjia1++;if(danjia1==100)danjia1=0;while(!key1);delay(5);while(!key1);} } if(key2==0){ delay(5);if(key2==0){ danjia1--;if(danjia1==-1)danjia1=99;while(!key2);delay(5);while(!key2);} } display(1,0,danjia1);}
if(key3num==2)//调夜晚单价
{ write_data(1,danjia1);
if(key1==0){ delay(5);if(key1==0){ danjia2++;if(danjia2==100)danjia2=0;while(!key1);delay(5);while(!key1);} } if(key2==0){ delay(5);if(key2==0){ danjia2--;if(danjia2==-1)danjia2=99;while(!key2);delay(5);while(!key2);} } display(2,0,danjia2);} if(key3num==3)//调等待单价
{ write_data(2,danjia2);
if(key1==0){ delay(5);if(key1==0){ danjia3++;if(danjia3==100)danjia3=0;while(!key1);delay(5);while(!key1);} } if(key2==0){ delay(5);if(key2==0){ danjia3--;if(danjia3==-1)danjia3=99;while(!key2);delay(5);while(!key2);} } display(3,0,danjia3);}
if(key3num==4)//步价
{ write_data(3,danjia3);
if(key1==0){ delay(5);if(key1==0){ qibu++;if(qibu==100)qibu=0;
调起 while(!key1);delay(5);while(!key1);} } if(key2==0){ delay(5);if(key2==0){ qibu--;if(qibu==-1)qibu=99;while(!key2);delay(5);while(!key2);} } display(4,0,qibu);}
if(key3num==5)//功能键
{ write_data(4,qibu);
退出 key3num=0;}
if(key3==0){ delay(5);if(key3==0){ key3num++;while(!key3);delay(5);while(!key3);} } } } } }
void init(){ SDA=1;SCL=1;
zongjine=0;licheng=0;dengdai=0;
danjia1=read_data(1);danjia2=read_data(2);danjia3=read_data(3);qibu=read_data(4);
aa=0;//数码管动态扫描的定时器时基个数 bb=0;//判断是否等待的时基个数 inter=0;
EA=1;//开总中断 EX1=1;//开外部中断1 IT1=1;//触发方式下降沿
TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;//开定时器T0中断 TR0=1;//开定时器T0
P3=0x08;P0=table[0];} void jisuan(){ if(licheng>3)zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3;//金额计算 else zongjine=qibu+dengdai*danjia3;//计算 }
void qiehuan(){ if(key1==0)// { delay(5);// if(key1==0)qiehuantemp=!qiehuantemp;while(!key1);delay(5);while(!key1);} if(qiehuantemp==0)danjia=danjia2;if(qiehuantemp==1)danjia=danjia1;}
起步公里内金额白天夜晚切换 键盘防抖
void main(){ init();qiehuantemp=1;key3num=0;while(1){ qiehuan();//晚单价
jisuan();//额
display(zongjine,licheng,danjia);keyscan();if(key0==0)// init();} }
void inter1()interrupt 2 //脉冲中断 { delay(5);// if(exter==0)// { // IT1=1;inter++;
切换白天夜计算总金清零键 if(inter==5){ inter=0;licheng++;} } // while(!exter);// delay(5);// while(!exter);// }
void timer0()interrupt 1 { TH0=(65536-1000)/256;TL0=(65536-1000)%256;aa++;bb++;temp1=licheng;// if(bb==10000)//10s { bb=0;if(temp=temp&temp1)dengdai++;temp=licheng;} }
测试是否进入等待 无反应进入等待计费
矩阵键盘及程序
(2009-08-20 22:40:21)
转载
标签: 杂谈 分类:技术资料
自己做了一个矩阵键盘,初次做,焊得还是比较丑和简陋的。矩阵键盘程序是从一个大的函数中截取的,基本思路可以看明白 //P1.0-P1.3是行线,P1.4-P1.7是列线 uchar keyscan(){ uchar cord_h,cord_l,key_code;P1=0x0f;//行线输出全为0 if((P1&0x0f)!=0x0f){ delay(10);if((P1&0x0f)!=0x0f){ cord_h=P1&0x0f;P1=cord_h|0xf0;//输出当前列线值 cord_l=P1&0xf0;key_code=cord_h|cord_l;delay(20);} } else key_code=0xff;return key_code;//返回键值 }
void get_code(uchar key_code){ switch(key_code){ case 0xee: key_temp='1';unit_price=read_price(1);break;//1 case 0xde: key_temp='2';unit_price=read_price(7);break;//2 case 0xbe: key_temp='3';unit_price=read_price(13);break;//3 case 0x7e: key_temp='4';unit_price=read_price(19);break;//4 case 0xed: key_temp='5';unit_price=read_price(25);break;//5 case 0xdd: key_temp='6';unit_price=read_price(31);break;//6 case 0xbd: key_temp='7';unit_price=read_price(37);break;//7 case 0x7d: key_temp='8';unit_price=read_price(43);break;//8 case 0xeb: key_temp='9';unit_price=read_price(49);break;//9 case 0xdb: key_temp='0';unit_price=read_price(55);break;//0 case 0xbb: key_temp='a';unit_price=read_price(61);break;//a case 0x7b: key_temp='b';unit_price=read_price(67);break;//b case 0xe7: key_temp='c';unit_price=read_price(73);break;//c case 0xd7: key_temp='d';break;//d case 0xb7: key_temp='e';break;//e case 0x77: key_temp='f';break;//f default : break;}