51单片机电子钟设计

2024-07-10

51单片机电子钟设计(精选6篇)

篇1:51单片机电子钟设计

毕业设计(论文)

(2015届)

题 目:基于51单片机的电子秤设计

专业名称:应用电子技术

姓 名:谢玉夏

学 号:1210401038 班 级:2012级应用电子技术

指导教师:刘志芳

2014年 12 月 30 日

摘要

称重技术是人类生活中不可缺少的部分,自古以来就被人们所重视。作为一种计量手段,被广泛应用于工业、农业、贸易等各个领域。随着现代文明和科学技术的不断进步,人们对称重技术的准确度要求也越来越高,电子秤产品技术水平的高低,直接影响各行各业的现代化水平和社会经济效益的提高。近年来,电子称重技术取得了突飞猛进的发展,电子秤在称重计量领域中也占有越来越重要的地位,其应用领域也在不断地扩大。尤其是商用电子秤,由于其具有准确度高、反应灵敏、结构简单等优点,被广泛应用于工商贸易、轻工食品、医药卫生等领域。目前,机械秤正在逐步被电子秤取代,这就促使电子秤的研究需要进一步的深入。

本设计是以AT89S51为核心的一种高精度电子秤,系统采用模块化设计法,其硬件结构主要包括:数据采集模块、最小系统模块、电源模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统部分主要包括AT89S51和扩展的外部数据存储器;键盘由4×4位矩阵键盘组成;显示部分LM4229液晶显示。软件部分由C语言编程,实现对各部分的控制。该电子秤可以能够显示商品的名称、价格、总量、总价等;能够自动完成商品的价格计算;能够储存几种简单商品的价格;能够具有超重提醒功能。其称重范围为0~5Kg,分度值为0.001g。整个系统结构简单,使用方便。

关键词:电子秤;AT89S51单片机;称重传感器;A/D转换电路;液晶显示II

目录 绪论...........................................................1

1.1 选题的背景与意义.........................................1

1.1.1 选题的背景..........................................1 1.1.2 选题的意义..........................................2 1.2 电子秤的研究现状及发展趋势...............................2

1.2.1 电子秤的研究现状....................................2 1.2.2 电子秤的发展趋势....................................3 1.3 本文的结构...............................................4 2 系统总体方案设计...............................................5

2.1 电子秤的基本知识介绍.....................................5

2.1.1 电子秤的基本结构....................................5 2.1.2 电子秤的工作原理....................................5 2.1.3 电子秤的计量参数....................................6 2.2 总体方案设计.............................................7 2.3 系统各部分设计方案论证...................................8

2.3.1 电子秤分度数的设定..................................8 2.3.2 称重传感器的选定....................................8 2.3.3 A/D转换器的选定....................................14 2.3.4 单片机型号的选定...................................16 硬件设计......................................................18

3.1 系统硬件结构图..........................................18 3.2 单片机主控单元的设计....................................18

3.2.1 单片机引脚说明.....................................18 3.2.2 AT89S51最小系统设计................................20 3.3 数据采集模块设计........................................22

III

3.3.1 传感器单元设计.....................................22 3.3.2 A/D转换单元设计....................................22 3.4 键盘和显示电路单元设计..................................24

3.4.1 键盘电路设计.......................................24 3.4.2 显示电路设计.......................................25 3.5 系统总体原理图..........................................25 3.6 硬件抗干扰设计..........................................26 4 系统软件设计..................................................29

4.1 主程序设计..............................................29 4.2 LM4229液晶显示驱动程序..................................30 4.3 ADC0832采样程序.........................................31 4.4 键盘程序................................................31 5 系统仿真......................................................33

5.1 欢迎界面的仿真..........................................33 5.2 无重物情况仿真..........................................34 5.3 称量物体仿真............................................35 5.4 最大量程仿真............................................36 5.5 仿真总结与问题补充......................................37

5.5.1 仿真总结...........................................37 5.5.2 问题补充...........................................37 总结与展望....................................................39 附录程序.........................................................40 参考文献.........................................................49

IV 绪论

1.1 选题的背景与意义

1.1.1 选题的背景

(1)电子技术渗入衡器制造业

随着第二次世界大战后的经济繁荣,为了把称重技术引入生产工艺过程中去,对称重技术提出了新的要求,希望称重过程自动化,为此电子技术不断渗入衡器制造业。在1954年使用了带新式打印机的倾斜杠杆式秤,其输出信号能控制商用结算器,并且用电磁铁机构与代替人工操作的按键与办公机器联用。在1960年开发出了与衡器相联的专门称重值打印机。当时的带电子装置的衡器其称量工作是机械式的,但与称量有关的显示、记录、远传式控制器等功能是电子方式的。(2)电子秤步入社会

电子秤的发展过程与其它事物一样,也经历了由简单到复杂、由粗糙到精密、由机械到机电结合再到全电子化、由单一功能到多功能的过程。特别是近30年以来,工艺流程中的现场称重、配料定量称重、以及产品质量的监测等工作,都离不开能输出电信号的电子衡器。这是由于电子衡器不仅能给出质量或重量信号,而且也能作为总系统中的一个单元承担着控制和检验功能,从而推进工业生产和贸易交往的自动化和合理化。

近年来,电子秤已愈来愈多地参与到数据处理和过程控制中。现代称重技术和数据系统已经成为工艺技术、储运技术、预包装技术、收货业务及商业销售领域中不可缺少的组成部分。随着称重传感器各项性能的不断突破,为电子秤的发展奠定了基础,国外如美国、西欧等一些国家在20世纪60年代就出现了0.1%称量准确度的电子秤,并在70年代中期约对75 %的机械秤进行了机电结合式的电子化改造。

我国的衡器在20世纪40年代以前还全是机械式的,40年代开始发展了机电结合式的衡器。50年代开始出现了以称重传感器为主的电子衡器。80年代以来,我国通过自行研制、引进消化吸收和技术改造,已由传统的机械式衡器步入集传感器、微电子技术、计算机技术于一体的电子衡器发展阶段。目前,由于电子衡器具有称量快、读数方便、能在恶劣环境下工作、便于与计算机技术相结合而实现称重技术和过程控制的自动化等

特点,已被广泛应用于工矿企业、能源交通、商业贸易和科学技术等各个部门。随着称重传感器技术以及超大规模集成电路和微处理器的进一步发展,电子称重技术及其应用范围将更进一步的发展,并被人们越来越重视。

1.1.2 选题的意义

电子秤是日常生活中常用的电子衡器,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。目前市场上使用的称量工具,或者是结构复杂,或者运行不可靠,且成本高,精度稳定性不好,调整时间长,易损坏,维修困难,装机容量大,能源消耗大,生产成本高。而且目前市场上电子秤产品的整体水平不高,部分小型企业产品质量差且技术力量薄弱,设备不全,缺乏产品的开发能力,产品质量在低水平徘徊。因此,有针对性地开发出一套有实用价值的电子秤系统,从技术上克服上述诸多缺点,改善电子秤系统在应用中的不足之处,具有现实意义。

1.2 电子秤的研究现状及发展趋势

1.2.1 电子秤的研究现状

近几年,我国的电子称重系统从最初的机电结合型发展到现在的全电子型和数字智能型。电子称重技术逐渐从静态称重向动态称重发展,从模拟测量向数字测量发展,从单参数测量向多参数测量发展。电子称重系统制造技术及其应用得到了新发展。国内电子称重技术基本达到国际上20世纪90年代中期的水平,少数产品的技术已处于国际领先水平。

在研究方法上,电子称重系统的工作原理一般是将作用在承载器上的质量或力的大小,通过压力传感器转换为电信号,并通过控制电路来处理该电信号。其中压力传感器大多数采用电阻应变片压力传感器,由于应变片的体积较小,市场上有多种规格可供选择,而且可以针对弹性敏感元件的形式可以灵活设计来适应各种应用场合的要求,所以

应变片式压力传感器得到广泛的应用。但是电阻应变片压力传感器的一个严重缺陷是应变灵敏度、应变片本身的电阻都随温度变化,而且灵敏度随温度变化较大。在不同的环境中,应变片的阻值发生变化,输出零点漂移明显。并且应变片的输出信号很小、线性范围窄,而且动态响应较差,有待进一步开发。

在国际上,一些发达国家在电子称重方面,从技术水平、品种和规模等方面都达到了较高的水平。特别是在准确度和可靠性等方面有了很大的提高。其中梅特勒.托利多公司生产的BBK4系列高精度电子秤精度达到了lmg,速度大约为1次/秒。目前,电子秤在称量速度方面需要进一步的研究。

在称重传感器方面,国外产品的品种和结构又有创新,技术功能和应用范围不断扩大。

1.2.2 电子秤的发展趋势

电子秤的称重功能是基于微处理器这一核心技术来实现的。由于目前在设计电子称重系统时大量地采用集成芯片,因此电子称重系统已经摆脱了以往的电子模式,正向小型化、模块化、智能化、集成化发展;其技术性能趋向于高速率、高准确度、高稳定性、高可靠性;其应用性趋向于综合性、组合性。

小型化:体积小、高度低、重量轻,即小薄轻。为使电子衡器的承载器达到小、薄、轻,开始采用重量轻且刚度大的空心波纹铜板和方形闭合截面的薄壁型材。

模块化:电子衡器的承载器采用模块式一体组合或分体组合,产生新的品种和规格。这种模块化组合不但提高了产品的通用性和可靠性,而且也大大提高了生产效率,降低了成本。

智能化:与电子计算机组合或开发称重用计算机,利用计算机的智能来增加称重显示控制的功能,使其在原有功能的基础上增加推理、判断、自诊断、自适应、自组织等功能。

集成化:对于某些品种和结构的电子衡器,可以实现承载器与称重传感器一体化或承载器、称重传感器与称重显示控制器一体化。

综合性:电子称重技术和电子衡器产品的应用范围不断扩大,它已渗透到一些学科和工业自动控制领域。对某些商用电子计价秤而言,只具备称重、计价、显示、打印功能还远远不够,现代商业系统还要求它能提供各种销售信息,把称重与管理自动化紧密

结合,使称重、计价、进库、销售管理一体化,实现管理自动化。这就要求电子计价秤能与电子计算机联网,把称重系统与计算机系统组成一个完整的综合控制系统。

组合性:在工业生产过程或工艺流程中,不少称重系统还应具有可组合性,即:测量范围可以任意设定;硬件能够依据不定的程序进行修改和扩展;输入输出数据与指令可使用不同的语言,并能与外部的控制和数据处理设备进行通信。

今后, 随着电子高科技的飞速发展, 电子秤技术的发展定将日新月异。同时, 功能更加齐全的高精度的先进电子秤将会不断问世, 其应用范围也会更加拓宽。

1.3 本文的结构

本设计是以AT89S51为核心的一种高精度电子秤,系统采用模块化设计法,其硬件结构主要包括:数据采集模块、最小系统模块、电源模块、键盘和显示模块。软件部分由C语言编程,实现对各部分的控制。可以实现称重、去皮、置零、计价和显示等功能。其称重范围为0~5Kg,分度值为0.001g。整个系统结构简单,使用方便。全文共分为五章,各章主要内容如下:

第一章为绪论部分,简要介绍了选题的背景及意义、电子秤的研究现状及发展趋势以及本文的主要内容及结构;

第二章为总体设计部分,简要介绍了电子秤的结构及工作原理,论证了系统总体方案的设计,以及对各种方案的选择做出了比较;

第三章为系统硬件设计部分,主要是通过对各种模块的介绍以及对电路功能的分析,对系统硬件进行了选型和设计,得出系统硬件结构图;

第四章为系统软件设计部分,主要介绍了系统各部分软件的设计流程,给出了简单的程序;

第五章为系统软件仿真;

第六章为总结与展望,主要是对本课题的总结,以及对存在的问题进行归纳和进一步研究的方向。系统总体方案设计

2.1 电子秤的基本知识介绍

2.1.1 电子秤的基本结构

电子秤是利用物体的重力作用来确定物体质量(重量)的测量仪器,也可用来确定与质量相关的其它量大小、参数、或特性。不管根据什么原理制成的电子秤均由以下三部分组成:

(1)承重、传力复位系统

它是被称物体与转换元件之间的机械、传力复位系统,又称电子秤的秤体,一般包括接受被称物体载荷的承载器、秤桥结构、吊挂连接部件和限位减振机构等。(2)称重传感器

即由非电量(质量或重量)转换成电量的转换元件,它是把支承力变换成电的或其它形式的适合于计量求值的信号所用的一种辅助手段。

按照称重传感器的结构型式不同,可以分直接位移传感器(电容式、电感式、电位计式、振弦式、空腔谐振器式等)和应变传感器(电阻应变式、声表面谐振式)或是利用磁弹性、压电和压阻等物理效应的传感器。

对称重传感器的基本要求是:输出电量与输入重量保持单值对应,并有良好的线性关系;有较高的灵敏度;对被称物体的状态的影响要小;能在较差的工作条件下工作;有较好的频响特性;稳定可靠。

(3)测量显示和数据输出的载荷测量装置

即处理称重传感器信号的电子线路(包括放大器、模数转换、电流源或电压源、调节器、补偿元件、保护线路等)和指示部件(如显示、打印、数据传输和存贮器件等)。这部分习惯上称载荷测量装置或二次仪表。在数字式的测量电路中,通常包括前置放大、滤滤、运算、变换、计数、寄存、控制和驱动显示等环节。

2.1.2 电子秤的工作原理

当被称物体放置在秤体的秤台上时,其重量便通过秤体传递到称重传感器,传感器

随之产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系(一般成正比关系)的电信号(电压或电流等)。通常此电压信号很小,需要通过前端信号处理电路进行准确的线性放大,放大后的模拟电压信号经过滤波电路和A/D转换电路转换成数字信

1号被送入到主控电路的单片机中○,单片机不断扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行必要的判断、分析、由仪表的软件来控制各种运算。运算结果送到内存贮器,需要显示时,单片机发出指令,从内存贮器中读出送到显示器显示。

2.1.3 电子秤的计量参数

电子秤的计量性能涉及的主要技术指标有:量程、安全载荷、额定载荷、允许误差、分度值、分度数、准确度等级等。

(1)量程:一台电子秤不计皮重,所能称量的最大的载荷Max,即电子秤在正常工作情况下,所能称量的最大值。

(2)安全载荷:为电子秤正常称量案范围的120%。(3)额定载荷:电子秤的正常称量范围。(4)允许误差:等级检定时允许的最大偏差。

(5)分度值:电子秤的测量范围被分成若干等份,每份值即为分度值。用e或d来表示。

(6)分度数:衡器的测量范围被分成若干等份,总份数即为分度数用n表示。电子衡器的最大称量Max可以用总分度数n与分度值d的乘积来表示,即Max=n*d。

(7)准确度等级:国际法制计量组织把电子秤按照不同的分度数分成Ⅰ、Ⅱ、Ⅲ、Ⅳ四类等级,分别对应不同准确度的电子秤和分度数n的范围,如表

1因为本设计采用软件仿真而不能进行实际的称量,故信号的放大滤波电路部分舍去,直接输入模拟电压信号,○放大滤波部分内容会在第五章仿真总结与问题补充中进行后续介绍。

2-1所示。

表2-1 电子秤等级分类

标志及等级 特种准确度

电子秤种类 基准衡器

分度数范围 n>100,000

高准确度 中准确度 普通准确度

精密衡器 商业衡器 粗衡器

10,000

按照设计的基本要求,可以确定系统共分为五大模块,数据采集模块、最小系统模块、超重报警模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统模块由AT89S51单片机及其外围电路组成;键盘由4×4位矩阵键盘组成,可以控制显示商品种类和价钱等信息;显示部分采用LM4229液晶显示,显示当前商品的名称、单价、重量及总价等信息。软件部分由C语言编程,实现对各部分的控制。该电子秤可以实现显示商品的名称、单价、重量、总价等功能。其称重范围为0~5Kg,分度值为0.001g。在扩展功能上,本设计增加了一个超重报警提示。其总体设计的框图如图2-1所示:

数据采集模块单片机最小系统超重报警模块键盘模块显示模块

图2-1 总体设计方框图

系统工作原理:把所称物体放到秤台上,物体的重力通过秤体传给称重传感器,传感器受到压力使电阻发生变化引起电压变化,再将电压值送到A/D转换电路,将模拟量转换成数字量,转换后的数字量送至单片机进行处理,并显示结果。单片机最小系统由AT89S51和外围的时钟电路及复位电路组成。显示电路设计采用LM4229液晶显示,对各部分的控制由采用C语言编程的软件来实现。

2.3 系统各部分设计方案论证

2.3.1 电子秤分度数的设定

当前,一些单位为了提高Ⅲ级商贸秤的准确度,尝试改小电子秤的分度值,扩大电子秤的分度数,以便达到高精度称量的目的。这样做非但不能进行高精度称量,还会破坏电子秤原有的计量性能,降低电子秤的准确度,有损电子秤的可靠性,使电子秤出现更多的计量误差。

现在我国已经完全与OIML规定接轨,衡器计量检定规程完全按OIML规定而来。表2-2为Ⅲ级商业秤误差要求。

表2-2 Ⅲ级数字显示商用衡器允差表

m <500e 500e< m≤2000e 2000e< m≤Max

允差e(检定分度值)

检定要求 ±0.5e ±1.0e ±1.5e

使用中要求 ±1.0e ±2.0e ±3.0e 由表2-2可知,它的整个称量范围允差规定是变化的,误差是从大到小再变大,最高准确度在中间。从0~500分度数为低精度称量段,到高于3000个分度数之后的实际称量精度逐渐变低,实际误差不断加大。分度数再高其允差也是不变的。从国外电子秤的准确度和分度数设置、国内原先衡器的检定标准和现在我们统计的电子秤分度数的准确度以及OIML对Ⅲ级秤的允差规定看,说明现有Ⅲ级商业秤的分度数设置为2000~3000是比较理想的,属于最佳分度数。这样设置决定了电子秤的准确度首检为±0.05%,使用中为±0.1%的正确性、合理性与必要性。

2.3.2 称重传感器的选定

称重传感器在电子秤中占有十分重要的位置,被喻为电子秤的心脏部件,它的性能好坏很大程度上决定了电子秤的精确度和稳定性。考虑到不同使用地点的重力加速度和空气浮力对转换的影响,称重传感器的性能指标主要有线性误差、滞后误差、重复性误差、蠕变、零点温度特性和灵敏度温度特性等。在各种衡器和质量计量系统中,通常用

综合误差带来综合衡量传感器准确度,并将综合误差带与衡器误差带联系起来,以便选用对应于某一准确度衡器的称重传感器。国际法制计量组织(OIML)规定,传感器的误差带δ占衡器误差带Δ的70%,称重传感器的线性误差、滞后误差以及在规定温度范围内由于温度对灵敏度的影响所引起的误差等的总和不能超过误差带δ。若在环境恶劣的条件下(如高低温、湿热),传感器所占的误差比例就更大,因此,在人们设计电子秤时,正确地选用称重传感器非常重要。1.常用各种称重传感器

称重传感器按转换方法分为光电式、液压式、电磁力式、电容式、磁极变形式、振动式、陀螺仪式、电阻应变式等8类,以电阻应变式使用最广。

光电式传感器包括光栅式和码盘式两种。光栅式传感器利用光栅形成的莫尔条纹把角位移转换成光电信号。光栅有两块,一为固定光栅,另一为装在表盘轴上的移动光栅。加在承重台上的被测物通过传力杠杆系统使表盘轴旋转,带动移动光栅转动,使莫尔条纹也随之移动。利用光电管、转换电路和显示仪表,即可计算出移过的莫尔条纹数量,测出光栅转动角的大小,从而确定和读出被测物质量。码盘式传感器的码盘是一块装在表盘轴上的透明玻璃,上面带有按一定编码方法编定的黑白相间的代码。加在承重台上的被测物通过传力杠杆使表盘轴旋转时,码盘也随之转过一定角度。光电池将透过码盘接受光信号并转换成电信号,然后由电路进行数字处理,最后在显示器上显示出代表被测质量的数字。光电式传感器曾主要用在机电结合秤上。

液压式传感器:在受被测物重力P作用时,液压油的压力增大,增大的程度与P成正比。测出压力的增大值,即可确定被测物的质量。液压式传感器结构简单而牢固,测量范围大,但准确度一般不超过1/100。

电磁力式传感器:它利用承重台上的负荷与电磁力相平衡的原理工作。当承重台上放有被测物时,杠杆的一端向上倾斜;光电件检测出倾斜度信号,经放大后流入线圈,产生电磁力,使杠杆恢复至平衡状态。对产生电磁平衡力的电流进行数字转换,即可确定被测物质量。电磁力式传感器准确度高,可达1/2000~1/60000,但称量范围仅在几十毫克至10千克之间。

电容式传感器:工作原理是利用电容器振荡电路的振荡频率f与极板间距d成正比的关系。极板有两块,一块是固定不动的,另一块是可移动的。在秤体加载重物时,两

极板间的距离发生变化,随之,电路的振荡频率也改变。只要测出频率的变化便可求出被测物的质量。电容式传感器耗电量少,造价低,准确度为1/200~1/500。

磁极变形式传感器:原理为铁磁元件在被测物体重力下发生形变,产生应力引起导磁率的变化,随之,绕在铁磁元件两侧的次级线圈的感应电压也变化。这样测出电压的变化量便可求出加到磁极上的力,从而确定物体的质量。磁极变形式传感器的准确度不高,一般为1/100,称量范围为几十至几万千克。

振动式传感器弹性元件受力后,其固有振动频率与作用力的平方根成正比。测出固有频率的变化,即可求出被测物作用在弹性元件上的力,进而求出其质量。振动式传感器有振弦式和音叉式两种。

振弦式传感器的弹性元件是弦丝。当承重台上加有被测物时,V形弦丝的交点被拉向下,且左弦的拉力增大,右弦的拉力减小。两根弦的固有频率发生不同的变化。求出两根弦的频率之差,即可求出被测物的质量。振弦式传感器的准确度较高,可达1/1000~1/10000,称量范围为100克至几百千克,但结构复杂,加工难度大,造价高。

音叉式传感器的弹性元件是音叉。音叉端部固定有压电元件,它以音叉的固有频率振荡,并可测出振荡频率。当承重台上加有被测物时,音叉拉伸方向受力而固有频率增加,增加的程度与施加力的平方根成正比。测出固有频率的变化,即可求出重物施加于音叉上的力,进而求出重物质量。音叉式传感器耗电量小,计量准确度高达1/10000~1/200000,称量范围为500g~10kg。

陀螺仪式传感器,转子装在内框架中,以角速度ω绕X轴稳定旋转。内框架经轴承与外框架联接,并可绕水平轴Y倾斜转动。外框架经万向联轴节与机座联接,并可绕垂直轴Z旋转。转子轴(X轴)在未受外力作用时保持水平状态。转子轴的一端在受到外力(P/2)作用时,产生倾斜而绕垂直轴Z 转动(进动)。进动角速度ω与外力P/2成正比,通过检测频率的方法测出ω,即可求出外力大小,进而求出产生此外力的被测物的质量。陀螺仪式传感器响应时间快(5秒),无滞后现象,温度特性好(3ppm),振动影响小,频率测量准确精度高,故可得到高的分辨率(1/100000)和高的计量准确度(1/30000~1/60000)。

电阻应变式传感器利用电阻应变片变形时其电阻也随之改变的原理工作。主要由弹性元件、电阻应变片、测量电路和传输电缆4部分组成。电阻应变片贴在弹性元件上,弹性元件受力变形时,其上的应变片随之变形,并导致电阻改变。测量电路测出应变片电阻的变化并变换为与外力大小成比例的电信号输出。电信号经处理后以数字形式显示出被测物的质量。电阻应变式传感器的称量范围为300g至数千Kg,计量准确度达1/1000~1/10000,结构较简单,可靠性较好,大部分电子衡器均使用此传感器。2.称重传感器的选择

传感器种类繁多,分类方式也千差万别,它们都有各自的特点,但在设计电子秤时,选择一种合适的传感器非常重要,传感器的性能在很大程度上决定了电子秤的精确度和稳定性。称重传感器的选择主要从以下几个方面考虑。(1)对传感器数量和量程的选择

传感器数量的选择是根据电子秤的用途、秤体需要支撑的点数(支撑点数应根据使秤体几何重心和实际重心重合的原则而确定)而定。一般来说,秤体有几个支撑点就选用几只传感器,但是对于一些特殊的秤体,如电子吊秤,就只能采用一个传感器,一些机电结合秤就应根据实际情况来确定选用传感器的个数。传感器的量程选择可依据秤的最大称量值、选用传感器的个数、秤体自重、可产生的最大偏载及动载因素综合评价来决定。一般来讲,传感器的量程越接近分配到每个传感器的载荷,其称量的准确度就越高。但是在实际的使用当中,由于加在传感器上的载荷除被称物体外,还存在秤体自重、皮重、偏载及振动冲击等载荷,因此选用传感器时,要考虑诸多方面的因素,保证传感器的安全和寿命。公式2-1给出了传感器量程选择的计算公式。

K0K1K2K3WmaxWC

N(2-1)

式中C—单个传感器的额定量程;W—秤体自重;Wmax一被称物体净重的最大值;N—秤体所采用支撑点的数量;K0—保险系数,一般取1.2~1.3之间;K1—冲击系数;K2—秤体的重心偏移系数;K3—风压系数(2)传感器准确度等级的选择

传感器的准确度等级概括了传感器的非线性、蠕变、蠕变恢复、滞后、重复性、灵敏度等技术指标。称重传感器已按准确度等级划分,且已考虑了0.7倍误差因子,非自动衡器称重传感器的准确度等级要选择与电子秤相对应的准确度等级。称重传感器按综合性能分为A、B、C、D四个准确度等级,分别对应于衡器Ⅰ、Ⅱ、Ⅲ、Ⅳ四个准确度等级。

(3)各种类型传感器的使用范围

称重传感器形式的选择主要取决于称重的类型和安装空间,保证安装合适,称重安全可靠;另一方面要考虑厂家的建议。对于传感器制造厂家来讲,它一般规定了传感器的受力情况、性能指标、安装形式、结构形式、弹性体的材质等。譬如铝合金悬臂梁传感器适合于电子计价秤、平台秤、案秤等;钢式悬臂梁传感器适用于电子皮带秤、分选秤等;钢质桥式传感器适用于轨道衡、汽车衡等;柱式传感器适用于汽车衡、动态轨道衡、大吨位料斗秤等。(4)使用环境

称重传感器实际上是一种将质量信号转换成可测量的电信号输出装置。用传感器首先要考虑传感器所处的实际工作环境,这点对于正确选用传感器至关重要,它关系到传感器能否正常工作以及它的安全和使用寿命,乃至整个衡器的可靠性和安全性。一般情况下,高温环境对传感器造成涂覆材料融化、焊点开化、弹性体内应力发生结构变化等问题;粉尘、潮湿对传感器造成短路的影响;在腐蚀性较高的环境下会造成传感器弹性体受损或产生短路现象;电磁场对传感器输出会产生干扰。相应的环境因素下我们必须选择对应的称重传感器才能满足必要的称重要求。3.电阻应变式称重传感器

按照称重传感器选择的指标要求,以及对各种传感器的比较,本设计选定电阻应变片式传感器,下面对此类传感器做详细介绍。

电阻应变式称重传感器是把电阻应变计粘贴在弹性敏感元件上,弹性体(弹性元件,敏感梁)在外力作用下产生弹性变形,使粘贴在他表面的电阻应变片(转换元件)也随同产生变形,电阻应变片变形后,它的阻值将发生变化(增大或减小),再经相应的测量电路把这一电阻变化转换为电信号(电压或电流),从而完成了将外力变换为电信号的过程。

电阻应变式称重传感器包括两个主要部分,一个是弹性敏感元件:利用它将被测的重量转换为弹性体的应变值;另一个是电阻应变计:它作为传感元件将弹性体的应变,同步地转换为电阻值的变化。电阻应变片所感受的机械应变量一般为10-6~10-2,随之而产生的电阻变化率也大约在10-6~10-2数量级之间。这样小的电阻变化用一般测量电阻的仪表很难测出,必须采用一定形式的测量电路将微小的电阻变化率转变成电压或电流的变化,才能用二次仪表显示出来。在电阻应变式称重传感器中通过桥式电路将电阻的变化转换为电压变化。当传感器不受载荷时,弹性敏感元件不产生应变,粘贴在其上的应变片不发生变形,阻值不变,电桥平衡,输出电压为零;当传感器受力时,即弹性敏感元件受载荷P时,应变片就会发生变形,阻值发生变化,电桥失去平衡,有输出电压。图2-2为电阻应变式称重传感器桥式测量电路。

图2-2 电阻应变式称重传感器桥式测量电路

R1、R2、R3、R4为4个应变片电阻,组成了桥式测量电路,Rm为温度补偿电阻,e为激励电压,V为输出电压。若不考虑Rm,在应变片电阻变化以前,电桥的输出电压为:

R4R1Ve

R1R2R3R4(2-2)

由于桥臂的起始电阻全等,即R1=R2=R3=R4=R,所以V=0。当应变片的电阻R1、R2、R3、R4变成R+△R1、R+△R2、R+△R3、R+△R4时,电桥的输出电压变为: RR1RR4Ve

RR1RR2RR3RR4(2-3)

通过化简,上式则变为: VeR1R2R3R4

4RRRR(2-4)

也就是说,电桥输出电压的变化与各桥臂电阻变化率的代数和成正比。如果四个桥臂应R变片的灵敏系数相同,且=Kε,则上式又可写成:

R

VeK1234 4(2-5)

式中K为应变片灵敏系数,ε为应变量。式2-5表明,电桥的输出电压和四个轿臂的应变片所感受的应变量的代数和成正比。在电阻应变式称重传感器中,4个应变片分别贴在弹性梁的4个敏感部位,传感器受力作用后发生变形。在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被压缩,阻值减小,△R2、△R4为负值。再加之应变片阻值变化的绝对值相同,即

因此

VeK4eK 4R1R3R或13 R2R4-R或24

(2-6)(2-7)

(2-8)

若考虑Rm,则电桥的输出电压变成: 令Su V,则 eSuRK

R2RmRRRRRRVeKe 2RR2RmR2Rm2R(2-9)

(2-10)

Su称为传感器系数或传感器输出灵敏度。

对于一个高精度的应变传感器来说,仅仅靠4个应变片组成桥式测量电路还是远远不够的。由于弹性梁材料金相组织的不均匀性及热处理工艺、应变片性能及粘贴工艺、温度变化等因素的影响,传感器势必产生一定的误差。为了减少传感器随温度变化产生的误差,提高其精度和稳定性,需要在桥路两端和桥臂中串入一些补偿元件。如:初始不平衡值的补偿、零载输出温度补偿、输出灵敏度温度补偿等。

2.3.3 A/D转换器的选定

在实际的测量和控制系统中检测到的常是时间、数值都连续变化的模拟量,模拟量要输入到单片机中进行处理,首先要经过模拟量到数字量的转换,单片机才能接收、处理。目前有多种类型的A/D转换器,其类型有积分型、逐次逼近型、并行比较型、Σ-

Δ调制型、压频变换型等。多种类型的ADC各有其优缺点,并能满足不同的具体要求。1.A/D转换器的分类:(1)积分型

积分型ADC工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。初期的单片AD转换器大多采用积分型,现在逐次比较型已逐步成为主流。(2)逐次逼近型

逐次逼近型ADC由一个比较器和D/A转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置D/A转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。其优点是速度较高、功耗低,在低分辩率(<12位)时价格便宜,但高精度(>12位)时价格很高。(3)并行比较型/串并行比较型

并行比较型ADC采用多个比较器,仅作一次比较而实行转换,又称Flash(快速)型。由于转换速率极高,n位的转换需要2n-1个比较器,因此电路规模也极大,价格也高,只适用于视频AD转换器等速度特别高的领域。串并行比较型AD结构上介于并行型和逐次比较型之间,最典型的是由2个n/2位的并行型AD转换器配合DA转换器组成,用两次比较实行转换,所以称为 Half flash(半快速)型。还有分成三步或多步实现AD转换的叫做分级型ADC,而从转换时序角度又可称为流水线型ADC,现代的分级型AD中还加入了对多次转换结果作数字运算而修正特性等功能。这类AD速度比逐次比较型高,电路规模比并行型小。(4)Σ-Δ调制型

Σ-Δ型AD由积分器、比较器、1位DA转换器和数字滤波器等组成。原理上近似于积分型,将输入电压转换成时间(脉冲宽度)信号,用数字滤波器处理后得到数字值。电路的数字部分基本上容易单片化,因此容易做到高分辨率。主要用于音频和测量。(5)压频变换型

压频变换型是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然后用计数器将频率转换成数字量。从理论上讲这种AD的分辨率几乎可

以无限增加,只要采样的时间能够满足输出频率分辨率要求的累积脉冲个数的宽度。其优点是分辩率高、功耗低、价格低,但是需要外部计数电路共同完成AD转换。2.A/D转换器选用的原则:

(1)A/D转换器的位数。A/D转换器决定分辨率的高低,在系统中,A/D转换器的分辨率应比系统允许引用误差高一倍以上。

(2)A/D转换器的转换速率。不同类型的A/D转换器的转换速率大不相同。积分型的转换速率低,转换时间从几豪秒到几十毫秒,只能构成低速A/D转换器,一般用于压力、温度及流量等缓慢变化的参数测试。逐次逼近型属于中速A/D转换器,转换时间为纳秒级,用于个通道过程控制和声频数字转换系统。

(3)是否加采样/保持器。

(4)A/D转换器的有关量程引脚。有的A/D转换器提供两个输入引脚,不同量程范围内的模拟量可从不同引脚输入。

(5)A/D转换器的启动转换和转换结束。一般A/D转换器可由外部控制信号启动转换,这一启动信号可由CPU提供。转换结束后A/D转换器内部转换结束信号触发器置位,并输出转换结束标志电平,通知微处理器读取转换结果。

(6)A/D转换器的晶闸管现象。其现象是在正常使用时,A/D转换器芯片电流骤增,时间一长就会烧坏芯片。

2.3.4 单片机型号的选定

1.单片机选定准则

市场上的单片机型号很多,功能也有差异,在选择单片机型号的时候主要应该注意以下几个方面:(1)市场货源

系统设计者只能在市场上能够提供的单片机中选择,特别是作为产品大批量生产的应用系统,所选的单片机型号必须有稳定、充足的货源。(2)单片机性能

应根据系统的功能要求和各种单片机的性能,选择最容易实现系统技术指标的型号,而且能达到较高的性能价格比。单片机性能包括片内硬件资源、运行速度、可靠性、指令系统功能、体积和封装形式等方面。影响性能价格比的因素除单片机的性能价格外,还包括硬件和软件设计的容易程度、相应的工作量大小,以及开发工具的性能价格比。(3)研制周期

在研制任务重、时间紧的情况下,还要考虑所选的单片机型号是否熟悉,是否能马上着手进行系统的设计。与研制周期有关的另一个重要因素是开发工具,性能优良的开发工具能加快系统地研制进程。2.AT89S51单片机介绍

根据以上对单片机选型知识的介绍,本设计选用AT89S51单片机,下面对此型号单片机进行简介。

AT89S51是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机。AT89S51是一种带4K字节闪烁可编程可擦除只读存储器的单片机,其指令集和传统的51单片机指令集是一样的。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。硬件设计

3.1 系统硬件结构图

图3-1为系统总体硬件结构方框图,系统共分为三大部分:数据采集模块、单片机控制模块以及键盘和显示模块。各模块所采用的主要芯片型号已于图中有所标示。

AD转换ADC0832AT89S51单片机最小系统超重报警模块4*4矩阵键盘LM4229液晶显示

图3-1 系统总体硬件设计方框图

3.2 单片机主控单元的设计

3.2.1 单片机引脚说明

AT89S51单片机芯片为40个引脚,图3-2为单片机AT89S51引脚图。下面简单叙述各引脚的功能。

VCC/GND:电源/接地引脚;

P0口:P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端;P0还可以用作总线方式下的地址数据复用管脚,用来操作外部存储器。在这种工作模式下,P0口具有内部上拉作用。对内部Flash程序存储器编程时,接收指令字节、校验程序、输出指令字节时,要求外接上拉电阻;

P1口:P1是一个带有内部上拉电阻的8位双向I/0端口,输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用; 另外,P1.0、P1.1可以分别被用作定时器/计数器2的外部计数输入(P1.0/T2)和触发输入(P1.1/T2EX);对内部Flash程序存储器编程时,接收低8位地址信息;

P2口:P2是一个带有内部上拉电阻的8位双向I/0端口;输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用; P2口在存取外部存储器时,可作为高位地址输出;内部Flash程序存储器编程时,接收高8位地址和控制信息;

P3口:P3是一个带有内部上拉电阻的8位双向I/0端口,输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P3引脚功能复用见表3-1所示:

表3-1 P3口引脚功能复用

P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

串行通讯输入(RXD)串行通讯输出(TXD)外部中断0(INT0)外部中断1(INT1)定时器0输入(T0)定时器1输入(T1)外部数据存储器写选通WR 外部数据存储器写选通RD

RST:在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此管脚时,将使单片机复位。只要这个管脚保持高电平,51芯片便循环复位。复位后P0—P3口均置1,管脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序;

XTAL1、XTAL2:XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz至24MHz内选择,电容取30PF左右。

ALE/PROG:访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节,即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6),在访问外部数据存储器时,出现一个ALE脉冲;

PSEN:外部程序存储器的选通信号输出端。当AT89S51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲,即两次有效。但访问外部数据存储器时,将不

会有脉冲输出;

EA/Vpp:外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。

图3-2单片机AT89S51引脚图

3.2.2 AT89S51最小系统设计

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统包括:单片机、晶振电路、复位电路。其中复位电路采用上电复位。其最小系统电路图见图3-3所示:

图3-3 单片机最小系统图

对于AT89S51单片机,其最小系统只需要电源、复位电路、时钟电路就能工作。由于我们的程序存储器(ROM)采用内部Flash存储单元,所以单片机上的EA接高。

微处理器系统在开始工作时必须对微处理器内部的寄存器等进行复位,使各个寄存器的值设为预定状态才能顺利开始工作。复位电路的好坏决定着单片机能否正常工作。复位电路基本功能是在系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。复位电路可以使用专用复位芯片,也可以用电阻电容搭建。本文从可靠性和成本考虑最终选用电阻电容来搭建复位电路。对于51内核的单片机,RST是复位信号输入端,高电平有效。当此输入端保持两个机器周期(24个时钟振荡周期)的高电平时,可以完成复位操作。

3.3 数据采集模块设计

3.3.1 传感器单元设计

根据第二章对各种类型传感器特性的介绍,本设计决定采用L-psⅢ型称重传感器,该传感器为双孔平衡梁形式,是制作电子计价秤的专用产品,也可用于制造由单只传感器构成的电子案秤、台秤及专用衡器等。其主要技术指如表3-2所示:

表3-2 L-psⅢ型称重传感器技术指标

额定载荷 灵敏度 准确度等级 最大分度数 最小检定分度值 综合误差 重复性 蠕变 最小静载荷 最大安全载荷 极限过载荷 输入电阻 输出电阻 温度补偿范围 使用温度范围 接线方式

Kg mV/V

%F.S.%F.S.%F.S./30min %Fmax %Fmax %Fmax

3,6,10,20,30,50 1.8±0.08 C3 3000 Fmax/10000

0.02 0.01 ±0.017 1 150 200 415~445 349~355-10~+50-20~+60

 ℃ ℃

输入(+):红,输入(-):白,输出(+):绿

输出(-):蓝,屏蔽:黄

3.3.2 A/D转换单元设计

根据对各种A/D转换器的介绍与分析,本设计选定ADC0832作为本设计的A/D转

换模块。下面对该芯片的情况进行简要的介绍。

ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。具有体积小,兼容性强,性价比高的特点,具体参数如下:  8位分辨率;  双通道A/D转换;

 输入输出电平与TTL/CMOS相兼容;  5V电源供电时输入电压在0~5V之间;  工作频率为250KHZ,转换时间为32uS;  一般功耗仅为15mW;

 8P、14P-DIP(双列直插)、PICC多种封装;

 商用级芯片温宽为0℃~70℃,工业级芯片温宽为-40℃~85℃;

1、下面对ADC0832的引脚进行说明,图3-4为该芯片的引脚图:

图3-4 ADC0832引脚图

 CS—:片选端,低电平芯片使能;

 CH0:模拟输入通道0,或作为IN+/-使用;  CH1:模拟输入通道1,或作为IN+/-使用;  GND:芯片参考零点位(地);  DI:数据信号输入,选择通道控制;  DO:数据信号输出,转换数据输出;  CLK:芯片时钟输入;

 Vcc/REF:电源输入及参考电压输入(复用)。

2、ADC0832的接口电路

正常情况下,ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI,但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO与DI并联在一根数据线上使用。单片机与ADC0832的接口电路如图3-5所示。

图3-5 单片机与ADC0832连接图

当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可以任意,当要进行A/D转换时,须先将CS使能端置于低电平并保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。

3.4 键盘和显示电路单元设计

3.4.1 键盘电路设计

在本设计中,采用的是4×4的矩阵式键盘,将单片机的P1.0-P1.3作为键盘的行线接口,P1.4-P1.7作为列线接口,列线通过电阻接+5V。商品的单价已由程序设定好,并

号连接。3.4.2 显示电路设计

3.5 系统总体原理图 可由键盘选择各种商品的价格。

图3-6所示,为完善其功能,电路中添加了上拉电阻。

图3-6 液晶显示模块LM4229与单片机接线图 在系统各部分的设计完成后,把各模块根据其功能和信号处理的流程连接起来,便得到系统总体设计的原理图,如图3-7所示,为简洁起见,其中的接线部分采用网络标本设计中显示部分采用了当今常用的LM4229液晶显示模块。其与单片机的接线如

措施。3.6 硬件抗干扰设计

图3-7 系统总体原理图

方面,但更重要的方面是外界干扰和接地引起的异常。

度。就单片机测控系统来讲,其主要干扰是来自电源和信号传输通道的干扰。用到称重传感器,所采用的应变式传感器是高阻抗器件,其绝缘性能、机械结构的稳定性等,直接影响工作特性的稳定。因此,应变片传感器的绝缘材料必须有很高的绝缘性统的可靠性更倍受人们的关注,这是因为系统的可靠性决定了系统能否达到所需要的精能、足够的机械强度、高形状稳定性及良好的抗湿性能。下面重点介绍单片机的抗干扰随着科学技术的迅速发展,人们对单片机测控系统的各种性能要求越来越高。而系本电子称重器的核心部件是单片机,所以我们的抗干扰措施主要是针对单片机。还电子秤在使用中,常常会出现各种各样的异常现象,电子秤本身的质量问题是一个

1、电源的抗干扰措施

普通用电中含有多种高次谐波,它们很容易经电源进入单片机系统,还有一些射频发射、电磁波等也会由电源线感应反馈进入单片机系统造成干扰。因此,在电源电路中必需采取有效地滤波措施,来抑制这些高频干扰的侵入。电源滤波的一般方法是在电源变压器初、次级分别设置低通滤波器和线间电容滤波器,使50Hz市电基波通过,而抑制掉高频信号。此外在变压器的初、次级之间均采用屏蔽层隔离,其中初级屏蔽层接大地,次级屏蔽层接系统逻辑地,以减少其分布电容,提高抗共模干扰的能力。

2、信号传输通道的抗干扰措施

信号传输通道包括系统的前向通道和后向通道,其主要干扰有:杂散电磁场通过感应和辐射方式进入通道的干扰;由于地阻抗耦合、漏电流等因素产生的加性干扰;以及因传输线衰减、阻抗失配等因素引起的乘性干扰。对于这三类干扰,可以采用以下几种措施加以排除。(1)光电隔离技术

光电耦合器对干扰信号具有良好的隔离性能,一是它的输入阻抗很小,约为100fl-lldl,而干扰源内阻则很大,通常为105Q~108Q,因此能分压到光电耦合器输入端的噪声很小;二是光电耦合器输入部分的发光二极管是在电流状态下工作的,即使干扰噪声有较高的电压幅度,但由于能量小,不能提供足够的电流使发光二极管发光而被抑制掉;三是光电耦合器的输入回路与输出回路之间分布电容极小,绝缘电阻很大,回路一边的干扰很难通过光电耦合器馈送到另一边去。因此,采用光电耦合器可将单片机与前向通道、后向通道及其他部分从电气上隔离开来,能有效地防止干扰信号的侵入。(2)接地技术

本系统既有模拟电路又有数字电路,因此数字地与模拟地要分开,最后只在一点相连,如果两者不分,则会互相干扰。(3)输入输出信号线采用屏蔽双绞线

屏蔽双绞线对于静电干扰和电磁干扰有很好的抑制作用,有条件的话应尽量采用。但使用中应注意:

 线缆敷设时不要过分用力或使电缆打结、避免弯曲超过900、避免过紧地缠绕电缆,以保护双绞47线的扭绞状态;

 做线时,避免损坏线缆的外皮、不要切坏线缆内的导线;  接线时,双绞线的开绞长度尽量小,不要超过20mm;  双绞线的屏蔽层采用设备端单端接地方式。系统软件设计

本系统程序使用模块化的程序设计思想,主程序通过调用子程序以实现各部分功能。先进行软件的总体设计,然后进行各功能模块设计。

4.1 主程序设计

电子秤需要有数据采集、处理、存结果、送显示的运行过程。根据这一要求,电子秤的信息采集与处理分三个阶段:在微处理器的控制下,经传感器转换的电压信号通过输入电路送入A/D转换器处理,存入到数据存储器中;微处理器对采集的测量数据进行必要的数据处理,把数据信号处理为显示所要求的信号格式,通过输出接口电路输出并显示。主流程图见图4-1所示:

开始单片机初始化、LM4229进入欢迎界面、ADC0832初始化载物台是否有重物Y单片机存储ADC0832采样值N是否输入商品代码按键Y单片机执行计算并将结果送LM4229显示N测量结束键是否按下Y结束N

图4-1 主程序流程图

4.2 LM4229液晶显示驱动程序

开始写入控制字写入初始行Y是否换行?N全部数据已写完?Y结束N

图4-2 LM4229液晶显示驱动程序流程图

LM4229液晶能够显示比较复杂的汉字和图形,首先必须对其写入控制操作字,包括图形的显示方式,字体的模式。然后写入初始行地址,指针自动左移,直到写完全部数据为止。

write_data(place&0xff);//写入地址高位 write_data(place/256);//写入地址低位 write_com(0x24);//地址设置 write_com(0xb0);//设置数据自动写

write_data(ASC_MSK[(c1-0x20)*16+k]);/*---例如:0的ASCII码为0x30, 在ASC_MSK中的位置为0x10*16---16字节字码依次写入LCD---*/ write_com(0xb2);//自动复位 place=place+30;

4.3 ADC0832采样程序

开始拉低CS、拉高CLKDATA右移八位?Y拉高CS、拉低CLK,返回数据N结束

图4-3 ADC0823采样程序流程图

单片机通过拉低CS、拉高CLK来启动ADC0832进行外部压力传感转换后的电压信号进行采样,每产生8个CLK脉冲,DATA获得一位完整的8bit数据,此时MCU发送中断请求,拉高CS,拉低CLK,并将数据DAT返回。

4.4 键盘程序

本设计中采用了4×4矩阵式键盘,单片机定时进行查询。首先单片机发送行扫描代码,然后进行列扫描,当发现某一列出现了低电平时,即返回相应的键盘值。若没有发现则说明当前行没有键按下,行扫描右移一位,继续执行列扫描。

开始发送行扫描码发送列扫描码右移一位右移一位列扫描完毕?NYN行扫描完毕?Y返回键值结束图4-4 键盘程序流程图

系统仿真

在系统硬件与软件全部设计完成的情况下,将系统在protues7.5环境下进行了软件仿真,以确保本设计方案的可行性与准确性。因为在仿真时不能实际的把物体放到称重台上,所以在仿真时采用直接输入模拟电压信号的方法,来代替信号的采集。

5.1 欢迎界面的仿真

开始仿真时,先将用C语言编写的程序用Keil软件进行编译,生成可执行程序,然后装入单片机中进行仿真,按开始按钮,单片机及其他各部分电路开始工作,单片机调用内部存储数据对各部分接口电路初始化。200ms后LM4229进入欢迎界面,如图5-1所示。

图5-1 电子秤欢迎界面仿真

5.2 无重物情况仿真

欢迎界面过后,电子秤进入称重界面。此时,ADC0832不断对外部数据进行采样交给单片机进行处理,一旦有物品放入载物台,ADC0832立即发送中断请求,并将本次采集数据交给单片机进行处理。调节压力传感模拟电路电压,将电压设为0.00表示此时载物台上没有物体。此时LM4229显示指示“实用电子秤,名称······单价:0.000元/千克,总重量:0.000千克,总价:00.000元”。如图5-2所示。

图5-2 无重物称重界面仿真

5.3 称量物体仿真

上调压力传感电压,表示已有商品放在载物台上,ADC0832立即发送中断请求,并将本次采集的数据交给单片机进行处理,之后送入LM4229显示相应数据量。在此过程中,键盘不断进行扫描,一旦有键按下,单片机便对其数据进行相应处理,然后将对LM4229进行写操作。此时,按下键盘,选择相应的商品。如按下3号键,选择草莓,此时LM4229上显示“名称:草莓,单价:3.6元/千克,总重量:2.499千克,总价:“8.999元”(实际3.6×2.499=8.999元)。达到基本要求。如图5-3所示。当要称量下一种不同商品的时候,只需按下0键,选择商品代码,再按下相应商品键。

图5-3 称重情况仿真

5.4 最大量程仿真

将称重传感器调节到最大,显示最大称量,其结果如图5-4所示。由于元件及系统的误差,使得最大量程不能达到预定的5Kg,而是4.980Kg,这是在误差允许范围内的,符合要求。因为本设计添加了超重报警模块,所以在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴····”,警报声告诉工作人员,所称量物品超重。

图5-4 最大量程仿真

5.5 仿真总结与问题补充

5.5.1 仿真总结

以上,我们进行了几种基本情况的仿真,总结仿真的过程,我们可以得出以下结论:

1、该电子秤设计简单,操作方便,可以很容易的进行称量;

2、由于元件设置的原因,使电子秤的量程未达到预设的范围;

3、各商品的价格已在程序中设定好,既给称量带来了方便,也带来了麻烦,使得称量其他物品时需要修改程序。

5.5.2 问题补充

因为本设计采用软件仿真的方法,而不能进行实际的称量,所以采用了直接输入电压信号的方式代替了传感器采集的信号。但是经传感器采集的信号通常很小,需要通过前端信号处理电路进行准确的线性放大。放大后的模拟电压信号经过滤波电路和A/D转换电路转换成数字信号才被送入到主控电路的单片机中进行处理。在实际称量中,可以加入放大滤波电路如图5-5所示。

图5-5 放大滤波电路

图5-5为放大滤波电路的设计。放大器采用放大芯片AD620电容C1、C3用来滤除

采样信号电压中的低频噪声,选用22uF的普通独石电容;电容C2、C4用来滤除采样信号电压中的高频噪声,选用0.1uF的普通独石电容。因为采样信号电压值只有毫伏级,所以电阻R1、R2选用较小的阻值,否则导致放大器由于输入电流太小而放大效果不明显。微弱信号Vi1和Vi2被分别放大后从AD620的第6脚输出。

总结与展望

电子称重器是贸易市场中的常见的称重计量仪器。本文先说明了称重器的设计思路,并介绍了几种设计方案,选择了其中一种简单可行的方案。然后从电子秤的核心部件称重传感器的介绍开始,逐个进行各个模块器件的论证与选择。后面详细介绍了电子秤的硬件以及软件设计。

本设计为小量程(0~5Kg)称量器件,可以广泛应用于商店、菜市场等场合。在硬件部分设计过程中选用了A/D转换芯片ADC0832和LM4229液晶显示,大大简化了硬件电路及软件编程,并提高了系统的准确性和稳定性。人机界面部分由液晶显示与4×4位矩阵键盘组成,可以由键盘控制显示商品名称、重量和价格等信息,操作简单方便。软件设计中使用了C语言编程,便于修改和应用。

本次设计的电子称重器还存在一些缺点与不足,主要以下这两点:一是量程仅是5Kg,从而限制了该电子秤的使用范围。可采用大量程的称重传感器,但同时需要提高A/D转换芯片的位数,以保持精度。二是商品的种类与价格已编入程序,给称量其它的商品带来不便。三是本次设计没有完成实物的制作,从而不能预见商业产品开发中的所有问题,需要进一步研究。

通过这次电子秤的设计,我对所学的专业课知识有了更深的理解,尤其是单片机方面。在设计过程中,查阅了大量的中外文资料,解决了不少难题。另外本次设计提升了我分析问题解决问题的能力,增强了对学习的信心,相信这对我以后的工作和学习有重要的帮助。

附录程序

#include #include #include #include #include #define uchar unsigned char #define uint

unsigned int sbit ADCS =P3^5;sbit ADDI =P3^7;

sbit ADDO =P3^7;

sbit ADCLK =P3^6;

uint x1,y1,z1=0,w1;uchar ad_data,k,n,m,e,num,s;

//采样值存储 uint temp1;sbit beep =P3^0;

char press_data;

//标度变换存储单元 float press;unsigned char ad_alarm,temp;

//报警值存储单元unsigned char abc[5]={48,46,48,48,48};unsigned char price_all[6]={48,48,46,48,48,48};float price_unit[10]={5.5,2.8,3.6,4.5,2.4,4.2,3.8,6.0,1.5,0};

//商品初始单价 uchar price_danjia[5]={48,46,48,48,48};float price;uint price_temp1,price_temp2;

//商品总价 uchar Adc0832(unsigned char channel);

void alarm(void);void data_pro(void);void delay(uint k);void keyscan();

void disp_init();void price_jisuan();/************ 主函数

************/ void main(void){

delay(500);

//系统延时500ms启动

//ad_data=0;

//采样值存储单元初始化为0

lcd_init();

//显示初始化

disp_init();

//开始进入欢迎界面

delay(1000);

//延时进入称量画面

clear_lcd(0,4,40);

clear_lcd(16,0,100);

clear_lcd(28,0,40);

clear_lcd(44,0,100);

clear_lcd(56,0,40);

clear_lcd(72,0,100);

clear_lcd(84,0,40);

clear_lcd(100,0,100);

clear_lcd(112,0,40);

write_lcd(0,8,“实用电子秤”);

while(1)

{

ad_data =Adc0832(0);

//采样值存储单元初始化为0

alarm();

data_pro();//读取重量

keyscan();//查询商品种类

write_lcd(40,0,“------------------------------”);

write_lcd(56,0,“单 价:”);

write_lcd(56,11,price_danjia);

write_lcd(56,20,“元/千克”);

write_lcd(72,0,“总重量:”);

write_lcd(72,11,abc);

write_lcd(72,20,“千克”);

write_lcd(88,0,“总 价:”);

price_jisuan();

//计算出价格

write_lcd(88,10,price_all);

write_lcd(88,20,“元”);

write_lcd(112,0,“设计学生:1210401038 谢玉夏”);} } /************ 读ADC0832函数 ************/

//采集并返回

uchar Adc0832(unsigned char channel)

//AD转换,返回结果 {

uchar i=0;

uchar j;

uint dat=0;

uchar ndat=0;

if(channel==0)channel=2;

if(channel==1)channel=3;

ADDI=1;

_nop_();

_nop_();

ADCS=0;//拉低CS端

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿1

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=channel&0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿2

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=(channel>>1)&0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿3

ADDI=1;//控制命令结束

_nop_();

_nop_();

dat=0;

for(i=0;i<8;i++)

{

dat|=ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

dat<<=1;

if(i==7)dat|=ADDO;

}

for(i=0;i<8;i++)

{

j=0;

j=j|ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

j=j<<7;

ndat=ndat|j;

if(i<7)ndat>>=1;

}

ADCS=1;//拉搞CS端

ADCLK=0;//拉低CLK端

ADDO=1;//拉高数据端,回到初始状态

dat<<=8;

dat|=ndat;

return(dat);

//return ad k

}

void data_pro(void){

unsigned int;

if(0

{

int vary=ad_data;

press=(0.019531*vary);

temp1=(int)(press*1000);

//放大1000倍,便于后面的计算

abc[0]=temp1/1000+48;

//取压力值百位

abc[1]=46;

abc[2]=(temp1%1000)/100+48;

//取压力值十位

abc[3]=((temp1%1000)%100)/10+48;

//取压力值个位

abc[4]=((temp1%1000)%100)%10+48;//取压力值十分位

}

} /*****************报警子函数*******************/

void alarm(void){

if(ad_data>=256)

beep=0;

//则启动报警

else

beep=1;

}

void delay(uint k){

uint i,j;

for(i=0;i

for(j=0;j<100;j++);}

//开机欢迎界面 void disp_init(){

write_lcd(0,8,“欢迎使用电子秤”);

write_lcd(16,0,“------------------------------”);

write_lcd(28,0,“设计学生:谢玉夏”);

write_lcd(44,0,“------------------------------”);

write_lcd(56,0,“班级学号:1210401038”);

write_lcd(72,0,“------------------------------”);

write_lcd(84,0,“指导老师:刘志芳”);

write_lcd(100,0,“------------------------------”);

write_lcd(112,0,“设计日期:2014年12月”);

}

//键盘服务程序 void keyscan(){

P1=0xfe;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:num=1,price=price_unit[0], write_lcd(24,0,“名

break;case 0xde:num=2,price=price_unit[1],write_lcd(24,0,”名

break;case 0xbe:num=3,price=price_unit[2],write_lcd(24,0,“名

break;case 0x7e:num=4,price=price_unit[3],write_lcd(24,0,”名

break;

}

while(temp!=0xf0)

{

称:

杏称:

李 称:

草 称:

仁“);子”);莓“);萄”);

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfd;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{ case 0xed:num=5,price=price_unit[4],write_lcd(24,0,“名

break;case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,”名

break;case 0xbd:num=7,price=price_unit[6],write_lcd(24,0,“名

break;case 0x7d:num=8,price=price_unit[7],write_lcd(24,0,”名

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfb;

temp=P1;

temp=temp&0xf0;

称:

西称:

苹称:

雪称:

瓜“);果”);梨“);桃”);

篇2:51单片机电子钟设计

单片机课程设计

题目:用51单片机实现电子时钟

院 部 物理与电子信息工程学院 专 业 名 称 电子信息科学与技术 班 级 1111 姓 名 杨庆月 学 号 2011111136 指 导 教 师 李刚

2013年12月09日

目录

摘要------------------------------1 1 单片机的相关知识------------1 1.1 单片机的简介--------------------1 1.2 单片机的特点--------------------1 1.3 89C52单片机的基本特点------------2 2 电子时钟--------------------3 2.1电子时钟的基本特点----------------3 2.2电子时钟的原理-------------------4 控制系统的硬件设计---------4 3.1单片机型号的选择-----------------4 3.2 lcd1602工作的原理---------------4 3.3 键盘电路的设计------------------6 3.4 复位电路设计-------------------------6

3.5 时钟电路设计-------------------7 3.6 整体电路原理图-----------------7 控制系统的软件的设计------8 4.1程序的设计----------------------8 4.2程序源代码----------------------8 5 仿真结果和实物图---------------19 5.1仿真结果------------------------------19 5.2实物图-19 6 总结--20

参考文献------------------------21

摘要:单片计算机即单片微型计算机。由 RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而 51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

本设计主要设计了一个基于 AT89C52单片机的电子时钟。并在 1602上显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。

具有时钟和日历的功能,年限显示范围是2013-2099(可修改),且具有闰年自动修正功能

关键字:单片机;子时钟;键盘控制;LCD1602。单片机识的相关知识 1.1 单片机简介

MCS-51是 INTEL公司在成功推广的 MCS-48单片机基础上加以改进而成的 8位单片机。

这种单片机大约是上世纪 70年代末推出的,内部程序可重写的为 8751,外扩程序的是 8031,一次性生产,不可改变程序的是 8051。外形一般为 DIP40封装。不久又推出了增强型的 8052,其资源更加丰富。以后又采用 CHMOS技术推出了 80c51,耗电大大降低。到了 90年代,INTEL公司把精力放到更赚钱的计算机上,将 51单片机技术转让给了一此其它公司,如 ATMEL Philips等半导体制造公司,使 51系列单片机的市场份额不断扩大。

尽管十多年前就有人认为 51单片机会很快淘汰,但事实证明 51单片机经过不断的改进后,由于技术成熟,使用方便,至今在 8位单片机市场仍然拥有庞大的用户。特别是 MCS-51技术的 20年专利期限到期后,大量的兼容型号不断推出。从上世纪 90年代后期开始,美国 ATMEL公司在掌握快速擦写的存储器后,推出了 AT89C系列,此系列在中国获得了广泛的应用。

在此之前,由于可擦写的 8751价格昂贵,国内长时间采用 8031+27C64这样的外扩存程序储器方式。

51单片机最初只有 DIP40这种很古老的封装,后来推出了 CHMOS工艺的80C51后开始有了 PLCC44这种相对较小的方形封装。AT89C系列中开始有 20脚的 DIP20的精简型封装,这极大方便了在一些相对简单的单片机应用,缩小了 PCB的体积。20脚的有 AT89C1051、AT89C1051、AT89C1051,对应程序存储器分别为 1K、2K、4K。

标准的 51为 4K程序空间,128字节的 RAM,32条端口,5个中断,2个定时/计数器,12个时钟周期执行一条基本指令,最长的除法为 48个周期。52为 8K程序空间,256字节的 RAM,32条端口,6个中断,3个定时/计数器。AT89S51是可在板上直接下载程序的改进型号,并增加了看门狗功能,AT89C51只能在编程器下写入程序,所以经常会有人在 PCB上安装 IC插座,以便取下来编程更新程序。

AT的 51系列后来也推出了单周期的 51,但价格没什么优势,国内很少使用。最近几年宏晶在国内大量推广 STC51系列单片机,最近又推出不少所谓 1T的单

片机,价格较低

STC采用串口直接下载程序,写入程序很方便。

1.2 单片机的特点.单片机的存储器ROM 和RAM 时严格区分的。ROM 称为程序存储器,只存放 程序,固定常数,及数据表格。RAM 则为数据存储器,用作工作区及存放用户数 据。2.采用面向控制的指令系统。为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力。.单片机的I/O 口通常时多功能的。由于单片机芯片上引脚数目有限,为了 解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于 何种功能,可由指令来设置或由机器状态来区分。.单片机的外部扩展能力很强。在内部的各种功能部件不能满足应用的需求 时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带 来了很大的方便。

1.3 89C52单片机介绍

P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当 P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储 器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入 口,当FIASH 进行校验时,P0 输出原码,此时P0 外部必须被拉高。

P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接 收输出4TTL 门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地址接收。

P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且 作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由 于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器 进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优 势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的 内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3 口:P3 口管脚是8 个带内部上拉电阻的双向I/O 口,可接收输出4 个TTL 门电流。当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输 入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89C52 的一些特殊功能口,如下表所示: 口管脚备选功能

P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0 外部输入)P3.5 T1(记时器1 外 部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3 口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时 间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的 地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不

变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外

部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE 禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机 器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号

将不出现。

EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不

管是否有内部程序存储器。注意加密方式1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加 12V 编程电源(VPP)。电子时钟

2.1 电子时钟的基本特点

现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英 钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要 经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用用液晶显 示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示 时间的功能,还可以进行时和分的校对,片选的灵活性好。

2.2 电子时钟的原理

该电子时钟由89C52,1602 液晶等构成,采用晶振电路作为驱动电路,由延时程序和循环程序达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中有四个控制按键,一个是选择,一个进行加数,一个进行减数,还有一个保存。例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时。控制系统的硬件设计 3.1 单片机型号的选择

通过对51单片机的学习,认为STC89C52 是最理想的电子时钟开发芯片。STC89C52,最终认为89C52是一种带8K 字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用高密度非易失存储器制造技术制造,与工业标准的MCS-52指令集和输出引脚相兼容。还有一点重要原因,就是采用AT89C52时不能用开发板进行程序的下载,所以最终选用STC89C52进行设计。

3.2 1602 工作原理及显示电路

字符型LCD 通常有14 条引脚线或16 条引脚线的LCD,多出来的2 条线是背 光电源线VCC(15 脚)和地线GND(16 脚),其控制原理与14 脚的LCD 完全一样 1602液晶的基本的操作分为以下四种:

状态字读操作:输入RS=低、RW=高、EP=高; 输出:DB0~7 读出为状态字; 数据读出操作:输入RS=高、RW=高、EP=高; 输出:DB0~7 读出为数据; 指令写入操作:输入RS=低、RW=低、EP=上升沿; 输出:无; 数据写入操作:输入RS=高、RW=低、EP=上升沿; 输出:无。

如图 1602模块的引脚

LCD1602正面

LCD1602背面

1602与单片机连接图 3.3 键盘电路设计

本时钟采用四个按键控制,一个(实物图蓝色线24号引脚)是选择,一个进行加数(实物图紫色线25号引脚),一个进行减数(实物图灰色线26号引脚),还有一个保存(实物图白色线27号引脚)。例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时。

3.4 复位电路设计

单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利用RC充电来实现复位。手动复位是通过人为干预,强制系统复位。

连接至9号复位引脚

复位电路如图所示,可以实现上电复位和手动复位功能。

3.5 时钟电路设计

系统时钟源由内部时钟方式产生,时钟电路由12MH晶振和两个30PF瓷片电容组成,构成自激振荡,形成振荡源提供给单片机。电容可在5PF到30PF之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。

3.6整体电路原理图 控制系统的软件设计 4.1 程序设计

由于C 语言程序设计较汇编可读性强,可移植性,且可以大大降低编程的难 度和缩短开发周期,本系统程序采用c 语言设计。

4.2 程序源代码

#include

//包含单片机寄存器的头文件 #include //包含_nop_()函数定义的头文件

#define uchar unsigned char #define uint unsigned int

sbit RS=P2^0;

//寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1;

//读写选择位,将RW位定义为P2.1引脚 sbit E=P2^2;

//使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7;

//忙碌标志位,将BF位定义为P0.7引脚

uchar code table[]=“2013-12-07 WEEK6”;

//初始化液晶显示 16 uchar code table1[]=“TIME: 19-27-50”;

//14

uchar count,s1num;char second,minute,hour,day,month,year,week;

sbit s1=P2^3;

//功能键

sbit s2=P2^4;

//加键 sbit s3=P2^5;

//减键

sbit s4=P2^6;

//保存并退出

/*

延时若干毫秒

*/ void delay(uchar n){ uchar i,a,b;for(i=0;i

for(b=199;b>0;b--)

for(a=1;a>0;a--);}

/*********************************************** 函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

************************************************/ uchar BusyTest(void){ bit result;RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;E=1;

//E=1,才允许读写

_nop_();

//空操作

_nop_();_nop_();_nop_();

//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result E=0;

//将E恢复低电平

return result;}

/******************************************** 函数功能:写指令 入口参数:dictate *********************************************/ void WriteInstruction(uchar dictate){ while(BusyTest()==1);

//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;E=0;

//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置“0” _nop_();

_nop_();

//空操作两个机器周期,给硬件反应时间

P0=dictate;

//将数据送入P0口,即写入指令或地址

_nop_();_nop_();_nop_();_nop_();

//空操作四个机器周期,给硬件反应时间

E=1;

//E置高电平

_nop_();_nop_();_nop_();_nop_();

//空操作四个机器周期,给硬件反应时间

E=0;

//当E由高电平跳变成低电平时,液晶模块开始执行命令 }

/********************************************* 函数功能:写数据

入口参数:y(为字符常量)**********************************************/ void WriteData(uchar y){ while(BusyTest()==1);RS=1;

//RS为高电平,RW为低电平时,可以写入数据

RW=0;E=0;

//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置“0” P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();_nop_();_nop_();_nop_();

//空操作四个机器周期,给硬件反应时间

E=1;

//E置高电平

_nop_();_nop_();_nop_();_nop_();

//空操作四个机器周期,给硬件反应时间

E=0;

//当E由高电平跳变成低电平时,液晶模块开始执行命令 }

/****************************************** 函数功能:对LCD的显示模式进行初始化设置 *******************************************/ void LcdInitiate(void){ uchar num;

second=50;minute=27;hour=19;week=6;day=7;month=12;year=13;count=0;s1num=0;E=0;delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置:16×2显示,//5×7点阵,8位数据接口 delay(5);//延时5ms?,给硬件一点反应时间 WriteInstruction(0x38);delay(5);WriteInstruction(0x38);//连续三次,确保初始化成功 delay(5);WriteInstruction(0x0c);//显示模式设置:显示开,无光标,//光标不闪烁 delay(5);WriteInstruction(0x06);//显示模式设置:光标右移,字符不移 delay(5);WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delay(5);WriteInstruction(0x80);for(num=0;num<16;num++)//让液晶显示日期 { WriteData(table[num]);delay(5);} WriteInstruction(0x80+0x40);for(num=0;num<14;num++)//让液晶显示时间 { WriteData(table1[num]);delay(5);} TMOD=0x01;

//定时器中断初始化 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;

ET0=1;TR0=1;}

//-------写年月日---------------void write_nyr(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+add);WriteData(0x30+i);WriteData(0x30+j);}

//--------写时分秒---------------void write_sfm(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+0x40+add);WriteData(0x30+i);WriteData(0x30+j);}

//-------------写星期-------------void write_week(uchar add,uchar date){ WriteInstruction(0x80+add);WriteData(0x30+date);}

//---------该年是否是闰年-------------bit leap_year(){ int leap;if((year%4==0&&year%100!=0)||year%400==0)

leap=1;

//是闰年

else

leap=0;

//非闰年

return leap;}

//----------键盘扫描--------------------void keyscan(){ if(s1==0)

//第一个键是否按下

{

delay(5);

if(s1==0)

{

while(!s1);

s1num++;

if(s1num>7)

s1num=1;

if(s1num==1)

//第一个键被按一次

{

TR0=0;

WriteInstruction(0x80+0x40+13);

WriteInstruction(0x0f);

}

if(s1num==2)

{

WriteInstruction(0x80+0x40+10);

}

if(s1num==3)

{

WriteInstruction(0x80+0x40+7);

}

if(s1num==4)

{

WriteInstruction(0x80+9);

}

if(s1num==5)

{

WriteInstruction(0x80+6);

}

if(s1num==6)

{

WriteInstruction(0x80+3);

}

if(s1num==7)

{

WriteInstruction(0x80+15);

}

} }

if(s1num!=0)

//如果功能键被按下 { if(s2==0)//第二个按下

{

delay(5);

if(s2==0)

{

while(!s2);

if(s1num==1)

//第一个键被按一次,秒钟加一

{

second++;

if(second==60)

second=0;

write_sfm(12,second);

WriteInstruction(0x80+0x40+13);

}

if(s1num==2)

//第一个键被按二次,分钟加一

{

minute++;

if(minute==60)

minute=0;

write_sfm(9,minute);

WriteInstruction(0x80+0x40+10);

}

if(s1num==3)

//第一个键被按三次,时钟加一

{

hour++;

if(hour==24)

hour=0;

write_sfm(6,hour);

WriteInstruction(0x80+0x40+7);

}

if(s1num==4)

//日期加一

{

day++;

if(day==32)

day=1;

write_nyr(8,day);

WriteInstruction(0x80+9);

}

if(s1num==5)

//月加一

{

month++;

if(month==13)

month=1;

write_nyr(5,month);

WriteInstruction(0x80+6);

}

if(s1num==6)

//年加一

{

year++;

if(year==99)

year=0;

write_nyr(2,year);

WriteInstruction(0x80+3);

}

if(s1num==7)

//星期加一

{

week++;

if(week==8)

week=1;

write_week(15,week);

WriteInstruction(0x80+15);

} } } if(s3==0)

//第三个键被按下 { delay(5);if(s3==0){

while(!s3);

if(s1num==1)

//秒减一

{

second--;

if(second==-1)

second=59;

write_sfm(12,second);

WriteInstruction(0x80+0x40+13);

}

if(s1num==2)

//分减一

{

minute--;

if(minute==-1)

minute=59;

write_sfm(9,minute);

WriteInstruction(0x80+0x40+10);

}

if(s1num==3)

//时减一

{

hour--;

if(hour==-1)

hour=23;

write_sfm(6,hour);

WriteInstruction(0x80+0x40+7);} if(s1num==4)

//日减一

{

day--;

if(day==0)

day=31;

write_nyr(8,day);

WriteInstruction(0x80+9);} if(s1num==5)

//月减一

{

month--;

if(month==0)

month=12;

write_nyr(5,month);

WriteInstruction(0x80+6);} if(s1num==6)

//年减一

{

year--;

if(year==-1)

year=99;

write_nyr(2,year);

WriteInstruction(0x80+3);} if(s1num==7)

//日期减一

{

week--;

if(week==0)

week=7;

write_week(15,week);

WriteInstruction(0x80+15);

} } } if(s4==0)

//保存并退出 {

s1num=0;

WriteInstruction(0x0c);

TR0=1;

} } }

/******************************************

main function *******************************************/ void main(void){ uchar k=0;LcdInitiate();

//调用LCD初始化函数

while(1){

keyscan();

k=1;} }

/***************************************** 函数功能:定时器T0的中断服务函数

******************************************/ void timer0()interrupt 1 { count++;if(count==13){

count=0;

second++;

if(second==60)

//秒计满60,秒归0,分+1

{

second=0;

minute++;

if(minute==60)//分计满60,分归0,时+1

{

minute=0;

hour++;

if(hour==24)//时计满24,时归0,星期+1,日+1

{

hour=0;

week++;

day++;

if(week==8)

week=1;//星期计满7,星期归1

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月三十一天

{

if(day==32)

//大月天数计满31,日归1,月+1

{

day=1;

month++;

}

}

if(month==4||month==6||month==9||month==11)//小月三十天

{

if(day==31)

{ //小月天数计满30,日归1,月+1

day=1;

month++;

}

}

if(month==2)

{

if(leap_year())

{

if(day==30)//闰年二月29天??计满,日归1,月+1

{

day=1;

month++;

}

}

else

{

if(day==29)//非闰年二月28天 计满,日归1,月+1

{

day=1;

month++;

}

}

}

if(month==13)//月计满12,月归1,年+1

{

month=1;

year++;

}

if(year==99)//年计满99,年归0

{

year=0;

}

write_nyr(2,year);

}

write_nyr(5,month);

}

write_nyr(8,day);

write_week(15,week);

}

write_sfm(6,hour);

} write_sfm(9,minute);} write_sfm(12,second);5 仿真结果和实物图 5.1 仿真结果

5.2 实物图 总结:

说句实话,这个时钟在硬件上没有什么太多的技术含量,只有一个单片机的最小系统和一个显示电路,其实它们可以结合在一起,但是为了以后的方便,我还是将它们设计了两个部分,方便以后最小系统的其他方面的应用。还有就是程序,这个时钟程序如果让我自己写的话那我肯定不能再规定时间内完成,所以还是靠外界力量的帮忙。也正是如此,我找到我学习单片机的弱点,那就是程序的编写,记得室友百度开玩笑说:“程序是单片机的灵魂”,想想当时很搞笑,但仔

细一想,那还真是个恰当的比喻,如果说单片机没有程序的输入,那么它不能完成任何事情。虽然本学期的单片机课程即将结束,但是我学习单片机的过程还没有结束,以后还是要在程序的编写上多多下工夫。

此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争。当遇到不会或是设计不出来的地方,我们就会在QQ 群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。

参考文献

篇3:基于51单片机电子密码锁设计

关键词:AT89S51单片机,C51语言,3-8译码器,数码管

引言

传统锁在安全方面有很多隐患, 为了保证人们的生命财产安全, 提高锁的安全等级非常必要, 现如今越来越多的人开始应用安全信息系统, 在财产安全、隐私保护、机密保护等方面的需求非常迫切。

在此我们研究了电子密码锁, 电子密码锁种类繁多, 既有简单的电路控制产品, 又有复杂基于芯片的控制部分和外围电路部分、机械部分等性价比高的产品。随着电子技术的更新换代, 电子锁具的发展也异常迅速[1], 我们可以结合各种电子密码锁开锁信息, 对研究电子密码锁产品的多样化发展具有非常重大的意义。

一、设计方案选择

电子密码锁设计的主控芯片使用单片机, 硬件电路还包括数码管显示模块、声光报警模块、键盘扫描模块等, 为了能够将电子锁的相关作用充分发挥出来, 需要实现以下功能。

(1) 使用数字键盘实现密码输入。当按键顺序与设计值相符合, 并且字符数相等时, 可以将锁打开。

(2) 键盘锁定和报警。首次密码输入错误, 数码管显示错误提示, 密码输入次数超过

设定次数, 蜂鸣器报警的同时锁定键盘。

(3) 输入密码功能。当按下一位数字键时, 最右边的数码管显示一个“-”, 同时将已

经输入的所有“-”依次向左移动一位。

(4) 清除密码功能。按下清除键时清除输入的所有值并清除所有显示。

二、基于51单片机的电子密码锁硬件电路设计

通过对电子密码锁进行研究, 在此选择AT89S51单片机作为主控模块、使用4×4键盘输入密码、采用74LS47、74LS138和三极管设计显示模块与声光报警模块。电子密码锁的硬件电路设计系统框图如图1所示。

基于51单片机的电子密码锁硬件电路主要利用键盘对各个模块进行扫描, 在完成数据显示同时也能对密码进行修改, 通过扫描相应模块来完成输入工作。在完成输入工作后, 显示模块能够为我们提供所需数据, 然后利用声光报警系统对密码输入情况进行判别:红灯为正确;绿灯及声音为错误。本文所设计的基于51单片机的电子密码锁硬件电路包括四部分, 分别为扫描模块、控制模块、显示模块以及报警系统。

2.1键盘扫描模块电路设计

扫描模块主要是对键盘扫描模块电路进行设计, 通过4×4扫描键盘对按键及按键位置进行判别。在按键后, 按键位置的行线及列线能够接头, 使得开关之间接通。在电路中扫描到按键后, 及时对其使用软件进行抖动, 利用软件计算时间的延迟, 进而得以错过抖动时间, 完成输入。

2.2单片机控制模块电路设计

控制部分选择AT89S51单片机控制模块来完成, 单片机能够在该系统中完成显示、报警等一系列的功能, 采用的芯片属于直插式的集成电路[2], 有4个八位的并行双向I/O端口, 分别记作P0、P1、P2、P3。第20引脚为接地端;第40引脚为电源端;第31引脚通过接高电位来选择合理的存储设施;第18、19脚处连接晶振 (工作频率为12MHz) , 其主要作用是产生时钟信号;第9脚为复位脚, 该处接通高电位时, 能够中断单片机的运行状态。P0口连接的是声光报警器, P2口连接译码器通过动态扫描来实现数码管的驱动, 该译码器可以同时驱动六个数码管, P1口与16个阵列式按键相连实现对键盘的扫描。我们利用编程来实现数码管的驱动及数据显示, 然后, 在设置相关的一些指令来实现数码管的动态显示及报警提示等[3]。

2.3声光报警模块电路设计

当按下开锁指令后, 数码管会显示相应的数组, 当数字相等指示灯颜色显示绿色, 输入正确;反之, 数值与密码不符, 指示灯颜色显示红色, 并且会触发蜂鸣器的反应。

2.4数码显示模块电路设计

图2是数码显示模块, 它包括74LS47、74LS138两个译码器及6个8段数码显示管。系统中的数据由编码器传送, 然后该数据会分别由两个不同的译码器进行译码, 再利用显示管将数据分别显示出来[4]。

在该系统设计当中, P2口低4位连接74LS47译码器, 然后根据译码器的属性选择数码管, 在此选择共阳极数码管类型的七段译码器。AT89S51通过不同接口输出的相应数据[5], 在经过译码器处理后能显示出不同数字, 需要注意的是, 译码器与数码管之间还应当设置限流电阻, 避免电流过大时数码管出现损坏现象。P2.4-P2.6口接于74LS138译码器的三个输入端, 这个译码器的输出端连接在公共极上, 利用三极管与数码管来实现。然后根据不同端口输出量对译码器进行控制, 通过译码器点亮相应的数码管, 三极管在该系统中能起到控制的功能, 通过芯片来对数码管进行动态的扫描显示。

三、系统软件部分设计

电子密码锁系统中密码程序使用Keil u Vision4软件进行程序编写, 电路采用Proteus Professional V7.5 SP3进行仿真。

具体操作流程如下, 通过扫描键盘对系统中的各项功能进行控制, 对于系统的初始密码设置来说, 我们可以利用数码管来完成显示, 然后通过按键进行输入, 并且在键盘中, 我们还可以设置3个按键来对密码进行修改、显示以及开锁功能进行操作[6]。当操作人员按下开锁按钮以后, 数码管的显示数值同设计值相同时, 绿灯亮;反之, 红灯亮, 蜂鸣器发出声响, 触动报警装置。

当单片机复位以后, 系统会启动初始化, 将初始密码存放到设定的几个单元当中 (40H~45H) , 然后重新选择六个单元 (30H~35) 存储数码管的数据, 在设置完成后, 系统开始自检, 当自检完成以后启动扫描程序, 对键盘开始扫描, 当键盘中的按键触发相应程序后, 能够将后设置的密码数据显示到数码管中。数码管显示完成后可以重复启动子程序扫描键盘, 该过程循环进行。

四、电子密码锁硬件电路测试分析

4.1硬件电路测试

数码管在程序启动后显示“------”, 等待输入密码。输入密码后, F会逐渐左移, 一旦密码错误操作人员按“clr”键能够对已输入的密码进行清除, 重新进行输入。

密码正确后, 数码管显示“PASS”, 如图3所示, 并且LED灯显示绿色, 电路自动完成开锁开始运行。

如果密码错误, 数码管会显示“ERROR1”, 如图4所示, 密码连续输入三次错误后, 系统的报警系统会自动触发, LED灯显示绿色, 并且蜂鸣器开始发声报警, 然后键盘自动锁死, 停止相关操作。找到键盘中的“lock”键来对密码锁进行锁定。数码管恢复初始“------”, 黄色指示灯亮起。

4.2系统在仿真调试可能存在问题及处理措施分析

当操作人员没有输入密码或密码输入位数不够时按下“enter”键, 数码管界面为“false”, 导致不能正常返回初始界面。解决办法:“enter”键跳转时, 跳转到开始即可。

当操作人员输入正确密码并按下确认键, 数码管会输出通过指令, 如果操作人员继续操作按下“clr”键, 屏幕上显示“ERROR1”, 触发系统的报警装置, 同时数码管不能继续工作。产生这种现象的主要原因是由于跳转故障, 我们可以添加一个标志帮助数码管正常工作。

如果系统处于运行状态中, 用户开启密码锁后重新对其进行上锁, 在完成相关操作后, 该系统能够完成上锁指令, 但是在上锁前系统的报警装置自动启动, 数码管显示的是密码错误指令。产生这种故障的主要原因是由于系统的运行速度快, 造成键盘的按键恢复不及时, 扫描系统会重新对按键进行检测, “lock”的重复操作会造成系统运行出现故障。针对这种现象, 我们可以在完成按键后, 等待一段时间, 当按键恢复后, 再执行相关的指令。

五、结论

本次设计的基于51单片机的电子密码锁硬件电路中采用AT89S51单片机作为主控芯片, 密码程序采用C51语言实现, 使用3-8译码器和数码管, 相互结合实现密码显示。数码管可以实时显示当前输入密码个数。密码输入正确正常显示, 表示密码正确的指示灯变亮;密码输入错误时, 表示密码错误的指示灯变亮, 且蜂鸣器发出声音进行报警。该电子密码锁运行安全可靠, 维护方便。

参考文献

[1]李力.《双处理器控制数字化焊接电源单片机系统》[M].天津:天津大学出版社, 2007:18-21.

[2]周润景, 张丽娜, 丁莉.基于Proteus的电路及单片机设计与仿真 (第2版) [M].北京:北京航空航天大学出版社, 2003:49-51

[3]李广第等.单片机基础[M].北京:北京航空航天大学出版社, 2001:03-06.

[4]V.Yu.Teplov, A.V.Anisimov.Thermostatting System Using a Single-Chip Microcomputer and Thermoelectric Modules Based on the Peltier Effect[J], 2002.

[5]Yeager Brent.How to troubleshoot your electronic scale[J].Powder and Bulk Engineering.1995.

篇4:51单片机电子钟设计

关键词:51单片机 LCD12864 程序设计

0 引言

液晶显示器根据显示方式可分为:段位式、字符式和点阵式LCD,其中段位式与字符式只能显示数字与字符。而点阵式LCD不仅能显示数字与字符,还能显示各种图形、曲线及汉字等。本文研究的TG12864B是能显示曲线、图形及汉字的点阵式LCD。

1 TG12864介绍

TG12864是一款无字库的图形点阵显示器,其屏幕由64行×128列点阵组成,可以显示16点阵的4行×8列(32个)汉字、8点阵的8行×8列(64个)字母和128×64全屏幕点阵图形。

1.1 TG12864B内部功能器件介绍

在使用TG12864B前须了解其相关功能器件,如下所示:①指令寄存器(IR):用于寄存指令码。②数据寄存器(DR):用于寄存数据的。DR和显示数据存储器DDRAM(见表1)之间的数据传输是模块内部自动执行的。③显示数据RAM(DDRAM):DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。④XY地址计数器。XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。X地址计数器是没有记数功能的,只能用指令设置。Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。

1.2 TG12864的控制指令

①开关显示:开显示,指令码为0X3F;关显示,指令码为0X3E。②设置Y地址:0x40~0x4f,其中0x40为第0列列地址,0x4f为第63列列地址。③设置X页地址:模块有64行,其中8行为一页,即有8页,A2~A0表示0~7页:如,当A2~A0为000时表示第0页,为111是表示第7页。页地址分别是0XB8~0XBF。④显示开始线:该指令中A5~A0为显示起始行的地址,它规定了显示屏起始行所对应的显示存储器的行地址。通过修改显示其实行寄存器的内容,可以实现显示屏向上或向下滚动。⑤读状态:BF:判断忙信号标志位。BF=1表示液晶屏正在处理MCU发过来的指令或者数据,此时接口电路被挂起,不能接受除读操作以外的任何操作,BF=0表示液晶屏接口控制电路处于空闲状态,可以接受外部数据和指令。

2 电路设计

图1 TG12864显示线路图

图1为AT89S51控制12864LCD线路图,图中DB0~DB7为TG12864的数据线,单片机通过该端口给TG12864写命令或读写数据;RS为寄存器与显示内存操作选择管脚,单片机通过P3.7脚与之连接,当RS脚为高电平时,对液晶显示器的数据寄存器进行读或写操作;当RS脚为低电平时,对命令寄存器进行操作;RW为读写控制脚,与单片机P3.6脚连接,当RW脚为高电平时,准备对液晶显示器执行读操作,低电平时执行写操作;E脚为使能端,与P3.5脚连接,下降沿有效;CS1为高电平是选择芯片(右半屏)信号,CS2为高电平时选择芯片(左半屏)信号;RST复位脚,低电平复位。

3 LCD12864的驱动程序设计

LCD12864驱动程序的编程要想让LCD12864显示出需要的内容,就得严格按照LCD12864的工作时序来进行编程。驱动LCD12864显示程序含有以下几个子程序:

sbit di=P3^7;//高电平写数据,低电平写命令

sbit rw=P3^6;//高电平读操作,低电平写操作

sbit e=P3^5;//读写使能端,下降沿有效

sbit cs1=P3^4;//定义P3.4为左半屏片选信号

sbit cs2=P3^3;//定义P3.3为右半屏片选信号

sbit rst=P3^2;//TG12864复位信号

sbit bf=P2^7;//检测LCD忙引脚

sbit res=P2^4;//检测是否处于复位状态,高电平处于复位,低电平正常。

define dataport P0 //定义P0口为LCD数据总线,用于传输指令命令和显示数据。

3.1 忙检测子程序

void check_busy(void)

{

dataport=0xff;

di=0;

rw=1;

delay(1);

e=1;

while(bf||res==1);

e=0;

}

3.2 写命令或数据子程序

void write( char dat_comm,char content)

{

Chk_busy;

di=dat_comm;//dat_comm为高电平写数据,低电平写命令

rw=0;

dataport=content;

e=1;

delay(1);

e=0;

}

3.3 初始化子程序

void init_lcd(void)

{

rst=0;

delay(50);

rst=1;

cs1=1;cs2=1;/左右半屏选中

write(comm,0x3e);//关显示

write(comm,0x3f);//开显示

}

4 总结

本文对TG12864B用通俗易懂的语言进行了简单的介绍,并对TG12864B的驱动程序进行了简单的设计,使读者能初步了解12864LCD的简单应用。要想熟练的掌握TG12864B,还需要不断的实践,不断的摸索,熟悉编程语言,不断提高TG12864B的编程技巧,使程序得到最大程度的优化。

参考文献:

[1]朱华光.浅议LCD1602的编程技巧[J].电脑知识与技术,

2010.6.

[2]林嘉.基于89S52的LCD1602程序设计[J].电脑知识与技术,2012.8.

[3]田开坤.基于LCD12864显示器的数字示波器设计[J].电子制作,2010.5.

篇5:51单片机电子钟设计

效果图:

程序如下:

//51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)

//WHJWNAVY 2011/10/14

#include #include #define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ //此表为 LED 的字模, 共阴数码管 0-9 delay(1);P2=0XF7;P0=dispcode[minite%10];//分个位 delay(1);P2=0XEF;P0=dispcode[minite/10];//分十位 delay(1);P2=0XDF;P0=dispcode[10];//间隔符 delay(1);P2=0XF7;P0=dispcode[fen%10];//分个位 delay(1);P2=0XEF;P0=dispcode[fen/10];//分十位 delay(1);

P2=0XDF;P0=dispcode[10];//间隔符-delay(1);

P2=0XBF;

P0=dispcode[shi%10];//时个位 delay(1);P2=0X7F;P0=dispcode[shi/10];//时十位 delay(1);}

if(P1_6==0)//设定时 { delay(30);if(P1_6==0){ shi++;if(shi==24){ shi=0;} } delay(250);} if(P1_7==0)//设定分 { delay(30);

if(P1_7==0){ fen++;if(fen==60){ fen=0;} } delay(250);}

if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警十次。{ for(bjcs=0;bjcs<10;bjcs++){ P1_5=0;delay(500);P1_5=1;delay(500);} } }

/*主函数*/ void main(void){ P1=0XFF;TMOD = 0x11;//time0为定时器,方式1 TH0=0x3c;//预置计数初值,50ms TL0=0xb0;EA=1;//总中断开

ET0=1;//允许定时器0中断 TR0=1;//开启定时器0 while(1){ keyscan();//按键扫描 dingshi();//定时闹钟 zhengdian();//整点报时 display();//显示时间 } }

void timer0(void)interrupt 1 //定时器0方式1,中断一次 { TH0=0x3c;//手动加载计数脉冲次数

50ms

TL0=0xb0;TMOD=0x11;mstcnt++;//用于计算时间,每隔50ms加1 if(mstcnt==20)//mstcnt满20即为一秒 { seconde++;//秒+1 time_pro();//时间处理

篇6:51单片机脉冲产生程序设计

用51单片机用独立键盘控制输出4种频率:1Hz、2Hz、10Hz、50Hz,占空比为50%的脉冲信号。

#include

#define uint unsigned int #define uchar unsigned char sbit d0=P1^0;sbit d1=P3^2;uintnum=0,counter=0;void delay(uint x){ uinti,j;for(i=x;i>0;i--)for(j=110;j>0;j--);} void main(){

d1=1;

d0=1;

d2=1;num=0;

IT0=1;

EX0=1;

TMOD=0x01;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

EA=1;

ET0=1;

TR0=1;while(1)

{

} } void Int0()interrupt 0 { delay(10);if(d1==0){

d1=1;num++;if(num==4)num=0;counter=0;}

} void Timer0(void)interrupt 1 {

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;counter++;

if(num==0){ if(counter<=500)

d0=0;if(counter>500)

d0=1;if(counter==1000)counter=0;

} if(num==1){ if(counter<=250)

d0=0;if(counter>250)d0=1;if(counter==500)counter=0;}

if(num==2){ if(counter<=50)d0=0;if(counter>50)d0=1;if(counter==100)counter=0;} if(num==3){ if(counter<=10)

d0=0;if(counter>10)

d0=1;

上一篇:一位离职的hr感言下一篇:自身能力比社会环境更重要四辩