基于单片机的智能压力检测系统的设计
摘要
压力是工业生产过程中的重要参数之一。压力的检测或控制是保证生产和设备安全运行必不可少的条件。实现智能化压力检测系统对工业过程的控制具有非常重要的意义。本设计主要通过单片机及专用芯片对传感器所测得的模拟信号进行处理,使其完成智能化功能。介绍了智能压力传感器外围电路的硬件设计,并根据硬件进行了软件编程。
本次设计是基于AT89C51单片机的测量与显示。是通过压力传感器将压力转换成电信号,再经过运算放大器进行信号放大,送至8位A/D转换器,然后将模拟信号转换成单片机可以识别的数字信号,再经单片机转换成LED显示器可以识别的信息,最后显示输出。而在显示的过程中通过键盘,向计算机系统输入各种数据和命令,让单片机系统处于预定的功能状态,显示需要的值。
本设计的最终结果是,将软件下载到硬件上调试出来了需要显示的数据,当输入的模拟信号发生变化的时候,通过A/D转换后,LED将显示不同的数值。
目录
摘要
Abstract
第一章 绪论
11 研究背景
12 基于单片机的智能压力检测的原理
121 压力的概念
122 测量压力的意义
第二章 基于单片机的智能压力检测系统的硬件设计
21 压力传感器
211 压力传感器的选择
212金属电阻应变片的工作原理
213 电阻应变片的基本结构
214 电阻应变片的测量电路
22 信号放大电路
212 放大器的选择
224 三运放大电路
23 A/D转换器
231 A/D转换模块器件选择
232 A/D转换器的简介
233 配置位说明
234 ADC0832工作时序图
233 单片机对ADC0832的控制原理
24 单片机
241 AT89C51单片机简介
242主要特性
243 管脚说明
245 芯片擦除
25 单片机于键盘的接口技术
251 键盘功能及结构概述
252 键盘抖动及去除
253 单片机与键盘的连接
26 LED显示接口
261发光二极管及LED显示器
262七段数码显示器
263 LED数码管静态显示接口
第三章 软件设计
31 A/D转换器的软件设计
311 ADC0832芯片接口程序的编写
32 单片机与键盘的接口程序设计
34 LED数码管显示程序设计
第四章 总结
参考文献
附录A
附录B
致谢
第一章 绪论
1.1 研究背景近年来,随着微型计算机的发展,他的应用在人们的工作和日常生活中越来越普遍。工业过程控制是计算机的一个重要应用领域。其中由单片机构成的嵌入式系统已经越来越受到人们的关注。现在可以毫不夸张的说,没有微型计算机的仪器不能称为先进的仪器,没有微型计算机的控制系统不能称其为现代控制系统的时代已经到来。 压力测量对实时监测和安全生产具有重要的意义。在工业生产中,为了高效、安全生产,必须有效控制生产过程中的诸如压力、流量、温度等主要参数。由于压力控制在生产过程中起着决定性的安全作用,因此有必要准确测量压力。为了测到不同位置的压力值,本次设计为基于单片机智能压力测量系统。通过压力传感器将需要测量的位置的压力信号转化为电信号,再经过运算放大器进行信号放大,送至8位A/D转换器,然后将模拟信号转换成单片机可以识别的数字信号,再经单片机转换成LED显示器可以识别的信息,最后显示输出。基于单片机的智能压力检测系统,选择的单片机是基于AT89C51单片机的测量与显示,将压力经过压力传感器变为电信号,再通过三运放放将电信号放大为标准信号为0-5V的电压信号,然后进入A/D转换器将模拟量转换为数字量,我们所采样的A/D转换器为ADC0832,ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。 正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。 为了提高单片机系统I/O口线的利用效率,利用单片机AT87C51的串行口和串行移位寄存器74LS164扩展输出多位LED显示. 键盘是单片机系统实现人机对话的常用输入设备。我们通过键盘,向计算机系统输入各种数据和命令,亦可通过使用键盘,让单片机系统处于预定的功能状态。要想实现压力的显示需硬件与软件配合,最终调试出来。 1.2 基于单片机的智能压力检测的原理 本次设计是以单片机组成的压力测量,系统中必须有前向通道作为电信号的输入通道,用来采集输入信息。压力的测量,需要传感器,利用传感器将压力转换成电信号后,再经放大并经A/D转换为数字量后才能由计算机进行有效处理。然后用LED进行显示,而键盘的作用是改变输入量的系数的。它的原理图如图1.1所示。 图1.1 压力测量仪表原理方框图
我们这次主要做的是A/D转换,单片机键盘和显示,我们选用的A/D转换器是ADC0832,单片机为AT89C51,键盘为4乘4的键盘,显示为4位数码管显示。根据硬件电路编程,调试出来并显示结果。 1.2.1 压力的概念压力是工业生产中的重要参数之一,为了保证生产正常运行,必须对压力进行测量和控制,但需说明的是,这里所说的压力,实际上是物理概念中的压强,即垂直作用在单位面积上的力。 在压力测量中,常用绝对压力、表压力、负压力或真空度之分。所谓绝对压力是指被测介质作用在容器单位面积上的全部压力,用符号pj表示。用来测量绝对压力的仪表称为绝对压力表。地面上的空气柱所产生的平均压力称为大气压力,用符号pq表示。用来测量大气气压力的仪表叫气压表。绝对压力与大气压力之差。称为表压力,用符号pb表示。即pb=pj-pq。当绝对压力值小于大气压力值时,表压力为负值(即负压力),此负压力值的绝对值,称为真空度,用符号pz表示。 压力是工业生产中的重要参数,如高压容器的压力超过额定值时便是不安全的,必须进行测量和控制。在某些工业生产过程中,压力还直接影响产品的质量和生产效率,如生产合成氨时,氮和氢不仅须在一定的压力下合成,而且压力的大小直接影响产量高低。此外,在一定的条件下,测量压力还可间接得出温度、流量和液位等参数。 1643年,意大利人托里拆利首先测定标准的大气压力值为760毫米汞柱,奠定了液柱式压力测量仪表的基础。1847年,法国人波登制成波登管压力表,由于结构简单、实用,很快在工业中获得广泛应用,一直是常用的压力测量仪表。 二十世纪上半叶出现了远传压力表和电接点压力表,从而解决了压力测量值的远距离传送和压力的报警、控制等问题。60年代以后,为适应工业控制、航空工业和医学测试等方面的要求,压力测量仪表日益向体积轻巧、耐高温、耐冲击、耐振动和数字显示等方向发展。 1.2.2 测量压力的意义压力是过程生产中四大重要参数之一,它在检测生产过程能否完全可靠正常运行的重要参数指标,尤其在化工生产过程中压力这一参数更显得尤为重要。 在化工生产过程中,压力即影响物料平衡,也影响化学反应速速,是标志生产过程能否正常进行的重要参数。 安全生产的需要,从确保安全生产的角度,压力检测也是非常重要的。如:确保压力容器内的压力在安全指标之内,确保易燃易爆介质的压力不超标。 在其他工业生产中压力检测于控制也非常重要。常可见到一些工业装置上都有压力表。如:汽包压力,当压力过高容易爆炸,压力低动力不足;还有炉膛压力;一般维持在0mmH2O,高了炉门缝冒烟尘,低了膛内出现负压降低温度。若维持在10 mmH2O,节能20%。 压力也是间接测量物位的手段,用孔板测量流量仅能产生差压,而这个差压考压力检测的方法来测取才能最终求出流量。液面的高度可以靠测取压力的大小来表示。 总之,压力检测是一般成产过程所不可缺少的环节,只有按工艺要求保持压力的稳定,才能维持生产的正常进行。所以压力准确测量在实际过程是非常重要的。
第二章 基于单片机的智能压力检测系统的硬件设计
2.1 压力传感器
2.1.1 压力传感器的选择压力传感器是压力检测系统中的重要组成部分,由各种压力敏感元件将被测压力信号转换成容易测量的电信号作输出,给显示仪表显示压力值,或供控制和报警使用。力学传感器的种类繁多,如电阻应变片压力传感器、半导体应变片压力传感器、压阻式压力传感器、电感式压力传感器、电容式压力传感器谐振式压力传感器及电容式加速度传感器等。 而电阻应变式传感器具有悠久的历史。由于它具有结构简单、体积小、使用方便、性能稳定、可靠、灵敏度高动态响应快、适合静态及动态测量、测量精度高等诸多优点,因此是目前应用最广泛的传感器之一。电阻应变式传感器由弹性元件和电阻应变片构成,当弹性元件感受到物理量时,其表面产生应变,粘贴在弹性元件表面的电阻应变片的电阻值将随着弹性元件的应变而相应变化。通过测量电阻应变片的电阻值变化,可以用来测量位移加速度、力、力矩、压力等各种参数。 2.1.2金属电阻应变片的工作原理应变式压力传感器是把压力的变化转换成电阻值的变化来进行测量的,应变片是由金属导体或半导体制成的电阻体,是一种将被测件上的应变变化转换成为一种电信号的敏感器件。它是压阻式应变传感器的主要组成部分之一。电阻应变片应用最多的是金属电阻应变片和半导体应变片两种。金属电阻应变片又有丝状应变片和金属箔状应变片两种。通常是将应变片通过特殊的粘和剂紧密的粘合在产生力学应变基体上,当基体受力发生应力变化时,电阻应变片也一起产生形变,使应变片的阻值发生改变,从而使加在电阻上的电压发生变化。这种应变片在受力时产生的阻值变化通常较小,一般这种应变片都组成应变电桥,并通过后续的仪表放大器进行放大,再传输给处理电路(通常是A/D转换和CPU)显示或执行机构。其阻值随压力所产生的应变而变化。金属电阻应变片的工作原理是吸附在基体材料上应变电阻随机械形变而产生阻值变化的现象,俗称为电阻应变效应。对于金属导体,如图2.1所示,一段圆截面的导线的金属丝,设其长为L,截面积为A(直径为D) ,原始电阻为R,金属导体的电阻值可用下式表示: R=ρL∕A (2.1) 式中:ρ——金属导体的电阻率(Ω·cm2/m) S——导体的截面积(cm2) L——导体的长度(m) 图2.1 金属电阻丝应变效应 当金属丝受到轴向力 F而被拉伸或压缩产生形变 ,其电阻值会随之变化 ,通过对(2.1)式两边取对数后再取全微分得: (2.2) 式中为材料轴向线应变 ,且 跟据材料力学 ,在金属丝单向受力状态下 ,有 (2.3) 式中μ为导体材料的泊松比。因此 ,有 (2.4) 试验发现 ,金属材料电阻率的相对变化与其体的相对变化间的关系为 (2.5) 式中 , c为常数(由一定的材料和加工方式决定)将式 (2.5)代入 (2.4) ,且当ΔR=R时 ,可得 (2.6) 式中,k=(1+2µ)+c(1-2µ)为金属丝材料的应变灵敏系数。 上式表明 ,金属材料电阻的相对变化与其线应变成正比。这就是金属材料的应变电阻效应。 电阻变化率 △R/R 的表达式为:K=ΔR/Rµ/ε,式中μ—材料的泊松系数;ε—应变量。 当金属丝受外力作用时,其长度和截面积都会发生变化,从上式中可很容易看出,其电阻值即会发生改变,假如金属丝受外力作用而伸长时,其长度增加,而截面积减少,电阻值便会增大。当金属丝受外力作用而压缩时,长度减小而截面增加,电阻值则会减小。只要测出加在电阻的变化(通常是测量电阻两端的电压),即可获得应变金属丝的应变情。 2.1.3 电阻应变片的基本结构电阻应变片主要由四部分组成。如图 2.2所示 ,电阻丝是应变片敏感元件;基片、覆盖片起定位和保护电阻丝的作用,并使电阻丝和被测试件之间绝缘;引 出线用以连接测量导线。 图 2.2 电阻应变片的基本结构 2.1.4 电阻应变片的测量电路应变片可以将应变转换为电阻的变化,为了显示于记录应变的大小,还要将电阻的变化再转换为电压或电流的变化,因此需要有专用的测量电路,通常采用直流电桥和交流电桥。 2.1.4.1电桥电路的工作原理由于应变片的电桥电路的输出信号一般比较微弱,所以目前大部分电阻应变式传感器的电桥输出端与直流放大器相连,如图2.3所示。 图2.3直流电桥 设电桥的各臂的电阻分别为R1R3R2R4 它们可以全部或部分是应变片。由于直流放大器的输入电阻比电桥电阻大的多,因此可将电桥输出端看成开路,这种电桥成为电压输出桥,输出电压U0为 U0= (2.7) 由上式可见:若R1R3=R2R4,则输出电压必为零,此时电桥处于平衡状态,称为平衡电桥。 平衡电桥的平衡条件为: R1R3=R2R4 应变片工作时,其电阻变化ΔR,此时有不平衡电压输出。 (2.8) 由式(2.8)表明:ΔR《 R1 时,电桥的输出电压于应变成线性关系。若相邻两桥臂的应变极性一致,即同为拉应变活压应变时,输出电压为两者之差,若不同时,则输出电压为两者之和。若相对两桥臂的极性一直,输出电压为两者之和,反之则为两者之差。 电桥供电电压U越高,输出电压U0 越大,但是,当U大时,电阻应变片通过的电流也大,若超过电阻应变片所允许通过的最大工作电流,传感器就会出现蠕变和零漂。基于这些原因可以合理的进行温度补偿和提高传感器的测量灵敏度。 2.1.4.2 非线性误差及温度补偿由式(2.8)的线性关系是在应变片的参数变化很小,极ΔR《 R1 的情况下得出的,若应变片承受的压力太大,则上述假设不成立,电桥的输出电压应变之间成非线性关系。在在这种情况下,用按线性关系刻度的仪表进行测量必然带来非线性误差。为了消除非线性误差,在实际应用中,常采用半桥差动或全桥差动电路,如图2.4所示,以改善非线性误差和提高输出灵敏度。 UU (a)半桥差动电路 (b) 全桥差动电路 图2.4 差动电桥
图2.4(a)为半桥差动电路,在传感器这中经常使用这种方法。粘贴应变片时,使两个应变片一个受压,一个受拉。应变符号相反,工作时将两个应变片接入电桥的相邻两臂。设电桥在初始时所示平衡的,且为等臂电桥,考虑到ΔR=ΔR1=ΔR2 则得半桥差动电路的输出电压为 (2.9) 由上式可见,半桥差动电路不仅可以消除非线性误差,而且还使电桥的输出灵敏度提高了一倍,同时还能起到温度补偿的作用。如果按图2.4(b)所示构成全桥差动电路同样考虑到 ΔR=ΔR1=ΔR2=ΔR3=ΔR4时得全桥差动电路的输出电压为 (2.10) 可见,全桥的电压灵敏度比单臂工作时的灵敏度提高了4倍非线性误差也得到了消除,同时还具有温度补偿的作用,该电路也得到了广泛的应用。 2.2 信号放大电路2.1.2 放大器的选择被测的非电量经传感器得到的电信号幅度很小,无法进行A/D转换,必须对这些模拟电信号进行放大处理。为使电路简单便于调试,本设计采用三运算放大器,因为在具有较大共模电压的条件下,仪表放大器能够对很微弱的差分电压信号进行放大,并且具有很高的输入阻抗。这些特性使其受到众多应用的欢迎,广泛用于测量压力和温度的应变仪电桥接口、热电耦温度检测和各种低边、高边电流检测。 2.2.4 三运放大电路本次设计的放大器采用了三运放,因为它具有高共模抑制比的放大电路。它由三个集成运算放大器组成,如图2.5所示。 2.5 三运放高共摸抑制比放大电路 其中A1和A2为两个性能一致(主要指输入阻抗,共模抑制比和增益)的同相输入通用集成运算放大器,构成平衡对称差动放大输入级,A3构成双端输入单端输出的输出级,用来进一步抑制A1和A2的共模信号,并适应接地负载的需要。由于每个放大器求和点的电压等于施加在各自正输入端的电压,因此,整个差分输入电压现在都呈现在RG两端。因为输入电压经过放大后(在A1 和A2的输出端)的差分电压呈现在R5,RG和R6这三只电阻上,所以差分增益可以通过仅改变RG进行调整。 这种连接有另外一个优点:一旦这个减法器电路的增益用比率匹配的电阻器设定后,在改变增益时不再对电阻匹配有任何要求。如果R5 = R6,R1= R3和R2 = R4,则VOUT = (VIN2-VIN1)(1+2R5/RG)(R2/R1)。 由于RG两端的电压等于VIN,所以流过RG的电流等于VIN/RG,因此输入信号将通过A1 和A2 获得增益并得到放大。然而须注意的是对加到放大器输入端的共模电压在RG两端具有相同的电位,从而不会在RG上产生电流。由于没有电流流过RG(也就无电流流过R5和R6),放大器A1 和A2 将作为单位增益跟随器而工作。因此,共模信号将以单位增益通过输入缓冲器,而差分电压将按〔1+(2 RF/RG)〕的增益系数被放大。这也就意味着该电路的共模抑制比相比与原来的差分电路增大了〔1+(2 RF/RG)〕倍。
在理论上表明,得到所要求的前端增益(由RG来决定),而不增加共模增益和误差,即差分信号将按增益成比例增加,而共模误差则不然,所以比率〔增益(差分输入电压)/(共模误差电压)〕将增大。因此CMR理论上直接与增益成比例增加,这是一个非常有用的特性。
最后,由于结构上的对称性,输入放大器的共模误差,如果它们跟踪,将被输出级的减法器消除。这包括诸如共模抑制随频率变换的误差。 2.3 A/D转换器模拟量输入通道的任务是将模拟量转换成数字量。能够完成这一任务的器件称之为模数转换器,简称A/D转换器。本次设计的中A/D转换器的任务是将放大器输出的模拟信号转换位数字量进行输出。 2.3.1 A/D转换模块器件选择目前单片机在电子产品中已得到广泛应用,许多类型的单片机内部已带有A/D转换电路,但此类单片机会比无A/D转换功能的单片机在价格上高几元甚至很多,我们采用一个普通的单片机加上一个A/D转换器,实现A/D转换的功能,这里A/D转换器可选ADC0832、ADC0809等;串行和并行接口模式是A/D转换器诸多分类中的一种,但却是应用中器件选择的一个重要指标。在同样的转换分辨率及转换速度的前提下,不同的接口方式会对电路结构及采用周期产生影响。对A/D转换器的选择我们通过比较ADC0809和ADC0832来决定。这两个转换器都是常见的A/D转换器,其中ADC0809的并行接口A/D转换器,ADC0832是串行接口A/D转换器。我们所做的设计选择ADC0832,A/D转换在单片机接口中应用广泛 ,串行 A/D转换器具有功耗低、性价比较高、芯片引脚少等特点。 2.3.2 A/D转换器的简介在这次设计中我们A/D转换器选用两通道输入的八位ADC0832,ADC0832[3]是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变得更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。有关引脚说明如下: • CS 片选使能,低电平芯片使能。 • CH0 模拟输入通道0,或作为IN+/-使用。 • CH1 模拟输入通道1,或作为IN+/-使用。 • GND 芯片参考0电位(地)。 • DI 数据信号输入,选择通道控制。 • DO 数据信号输出,转换数据输出。 • CLK 芯片时钟输入。 • Vcc/REF 电源输入及参考电压输入(复用)。 正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。它的结构示意图如图2.6所示。
图2.6 ADC0832结构示意图
2.3.3 配置位说明ADC0832工作时,模拟通道的选择及单端输入和差分输入的选择,都取决于输入时序的配置位。当差输入时,要分配输入通道的极性,两个输入通道的任何一个通道都可作为正极或负极。ADC0832的配置位逻辑表如表2.1所示。 表2.1的配置位逻辑表 表中“+”表示输入通道的端点为正极性;“-”表示输入端点为负极性H或L表示高、低电平。输入配置位时,高位(CH0)在前,低位(CH1)在后。 2.3.4 ADC0832工作时序图当 CS由高变低时,选中ADC0832 。在时钟的上升沿,DI 端的数据移入 ADC0832内部的多路地址移位寄存器。在第一个时钟期间,DI为高,表示启动位,紧接着输入两位配置位。当输入启动位和配置位后,选通输入模拟通道,转换开始。转换开始后,经过一个时钟周期延接着在第一个时钟周期延迟,以使选定的通道稳定。ADC0832紧接着在第4个时钟下降沿输出转换数据。数据输出时先输出最高位(D7~D0)输出完转换结果后,又以最低位开始重新遍数据(D7~D0 ),两次发送的最低位共用。当片选CS为高时,内部所有寄存器清 ,输出变为高阻态。如果要再进行一次模 数转换,片选 必须再次从高向低跳变,后面再输入启动位和配置位。 图2.7 ADC083工作时序图
2.3.3 单片机对ADC0832的控制原理图2.8 ADC0832与单片机的接口电路 正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。 当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能。其功能项见表2.2。 表2.2ADC0832的功能表
如表2.2所示,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。 到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。 作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。 2.4 单片机随着电子技术的发展,单片机的功能将更加完善,因而单片机的应用将更加普及。它们将在智能化仪器、家电产品、工业过程控制等方面得到更广泛的应用。单片机将是智能化仪器和中、小型控制系统中应用最多的有种微型计算机。 2.4.1 AT89C51单片机简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本,如图2.9所示。AT89C51单机为很多嵌入式控制系统提供灵活性高且廉价的方案。 图2.9 AT89C51单片机的结构示意图 2.4.2主要特性·与MCS-51 兼容
·4K字节可编程闪烁存储器
寿命:1000写/擦循环
数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路 2.4.3 管脚说明VCC:供电电压。 GND:接地。 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口也可作为AT89C51的一些特殊功能口: P3口管脚 备选功能 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)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 2.4.4 振荡器特性 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 2.4.5 芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 2.5 单片机于键盘的接口技术2.5.1 键盘功能及结构概述键盘是单片机系统实现人机对话的常用输入设备。操作员通过键盘,向计算机系统输入各种数据和命令,亦可通过使用键盘,让单片机系统处于预定的功能状态。 键盘按照其内部不同电路结构,可分为编码键盘和非编码键盘二种。编码键盘本身除了带有普通按键之外,还包括产生键码的硬件电路。使用时,只要按下编码键盘的某一个键,硬件逻辑会自动提供被按下的键的键码,使用十分方便,但价格较贵。由非编码键盘组成的简单硬件电路,仅提供各个键被按下的信息,其他工作由软件来实现。由于价格便宜,而且使用灵活,因此广泛应用在单片机应用系统中。 非编码键盘按照其键盘排列的结构,又可分为独立式按键和行列式按键两种类型。 2.5.2 键盘抖动及去除目前各种结构的键盘,主要是利用机械触点的合、断作用,产生一个电压信号,然后将这个电信号传送给CPU。由于机械触点的弹性作用,在闭合及断开的瞬间均有抖动过程。抖动时间长短,与开关的机械特性有关,一般约5~10ms之间。图2.10为闭合及断开时的电压抖动波形: 图2.10 键闭合及断开时的电压抖动波形 按键的稳定闭合期,由操作人员的按键动作所确定,一般为十分之几秒至几秒时间。为保证CPU对键的一次操作仅作一次输入处理,必须去除抖动影响及人为的操作时问长短的影响。 通常去抖动影响的措施有硬、软件两种;可用基本R-S触发器或单稳态电路构成硬件去抖动电路如图2.11所示。也可采用软件延时的方法除去键盘抖动产生的影响。采用软件除去抖动影响的办法是,在检测到有键按下时,执行一个10ms左右的延时程序,然后再去判断该键电平是否仍保持闭合状态电平,如保持闭合状态电平则可确认该键为按下状态,从而消除了抖动影响。 图2.11 RC去抖动电路 2.5.3 单片机与键盘的连接键盘与单片机的连接在单片机系统中键盘中按钮数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵形式,如2.13图所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按钮加以连接。这样,一个端口(如P1口)就能组成4*4=16个按钮,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就能组成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。在实际应用中,4×4键盘主要由数字0~9和功能键组成。这里给出一个比较常用的键盘排列方式,如表2.3所示。 表2.3 按键表
按照键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态。如图2.12所示这种按键软件程序简单,但占用I/O口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。 图2.12独立式按键接口电路 于独立是按键接口电路要比较矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些如图2.13所示。
图2.13 单片机矩阵式键盘接口电路
上图中列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按钮没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程办法如下所述。矩阵式键盘的按钮识别办法 确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按钮识别办法,如上图所示键盘,介绍过程如下。判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按钮之中。若所有列线均为高电平,则键盘中无键按下。 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其办法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按钮就是闭合的按钮。 2.6 LED显示接口本次设计是利用89C51单片机串行口和74LS164移位寄存器实现多个LED显示的一种方法,利用该方法设计的多路LED显示系统具有硬件结构简单、软件编程容易和价格低廉等特点. 2.6.1发光二极管及LED显示器发光二极管是由半导体发光材料做成的PN结,只要在发光二极管两端通过正向电流5-20mA就能达到正常发光。LED的发光颜色通常有红、绿、黄、白,其外形和电气图形符号如图2.14所示。单个LED通常是通过亮、灭来指示系统运行状态和用快速闪烁来报警。 aa)外形 b)图形符号 图2.14 LED 通常所说的LED显示器由7个发光二极管组成,因此也称之为七段LED显示器,其排列形状如图2.15所示。显示器中还有一个圈点型发光二极管(在图中以dp表示),用于显示小数点。通过七个发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。 LED显示器中的发光二极管共有两种连接方法: ·共阳极接法 把发光二极管的阳极连在一起构成公共阳极。使用时公共阳极接+5V。阴极端输入低电平的段发光二极管导通点亮,输入高电平的则不点亮。 ·共阴极接法 把发光二极管的阴极连在一起构成公共阴极。使用时会共阴极接地,阳极端输入高电平的段发光二极管导通点亮,输入低电平的则不点亮。 图2.15 LED显示 用LED显示器显示十六进制数的字型代码如下表所示: 表2.4 十六进制数字形代码 2.6.2七段数码显示器七段LED显示器需要由驱动电路驱动。在七段LED显示器中,共阳极显示器,用低电平驱动;共阴极显示器,用高电平驱动。点亮显示器有静态和动态两种方式。 2.6.2.1静态显示所谓静态显示,就是当显示器显示某一字符时,相应段的发光二极管恒定地导通或截止。这种显示方法的每一位都需要有一个8位输出口控制。 静态显示器的优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度高,控制系统在运行过程中,仅仅在需要更新显示内容时,CPU才执行一次显示更新子程序,这样大大节省了CPU的时间,提高了CPU的工作效率;缺点是位数较多时,所需的I/O口太多,硬件开销太大。 图2.16 四位静态显示电路 2.6.2.2 动态显示所谓动态显示就是一位一位地轮流点亮各位显示器(扫描),对于显示器的每一位而言,每隔一段时间点亮一次。在同一时刻只有一位显示器在工作(点亮),利用人眼的视觉暂留效应和发光二极管熄灭时的余辉效应,看到的却是多个字符“同时”显示如图2.17所示。 图2.17 四位动态显示的电路 显示器亮度既与点亮时的导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可实现亮度较高较稳定的显示。 动态显示器的优点是节省硬件资源,成本较低。但在控制系统运行过程中,要保证显示器正常显示,CPU必需每隔一段时间执行一次显示子程序,占用CPU大量时间,降低了CPU的工作效率,同时显示亮度较静态显示器低。 若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位I/O口(称为扫描口或字位口),控制各位LED显示器所显示的字形也需要一个8位口(称为数据)。 2.6.3 LED数码管静态显示接口在单片机应用系统中,数码管显示器显示常用两种办法:静态显示和动态扫描显示。基于LED的优点在本次设计中采用了数码管的静态显示。所谓静态显示,就是每一个数码管显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种办法单片机中CPU的开销小。能供给单独锁存的I/O接口电路很多,常用的串并转换电路74LS164,他的电路如图2.18所示。 图2.18 静态LED显示电路 MCS-51单片机串行口方式为移们寄存器方式,外接4片74LS164作为4位LED数码管显示器的静态显示接口,把AT89C51的RXD作为数据输出线,TXD作为移位时钟脉冲。74LS164为TTL单向8位移位寄存器,可实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入端,2个管脚按逻辑与运算规律输入信号,共公一个输入信号时可并接。CLK(第8脚)为时钟输入端,可连接到串行口的TXD端。每一个时钟信号的上升沿加到CLK端时,移位寄存器移一位,8个时钟脉冲过后,8位二进制数全部移入74LS164中。R(第9脚)为复位端,当R=0时,移位寄存器各位复0,只有当R=1时,时钟脉冲才起作用。Q1…Q8(第3-6和10-13管脚)并行输出端分别接LED数码管显示器的hg---a各段对应的管脚上。在74LS164获得时钟脉冲的瞬间(是在脉冲的下降沿),如果数据输入端(第1,2管脚)是高电平,则就会有一个1进入到74LS164的内部,如果数据输入端是低电平,则就会有一个0进入其内部。在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位,再来一个脉冲,第一个脉冲就会从最高位移出。 6片7LS164首尾相串,而时钟端则接在一起,这样,当输入8个脉冲时,从单片机RXD端输出的数据就进入到了第一片74LS164中了,而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164,而新的数据则进入了第一片74LS164,这样,当第六个8个脉冲完成后,首次送出的数据被送到了最左面的74LS164中,其他数据依次出现在第一、二、三、四、五片74LS164中。
第三章 软件设计
3.1 A/D转换器的软件设计单片机控制系统中通常要用到AD转换,根据输出格式,常用的AD转换方式可分为并行AD和串行AD。并行方式一般在转换后可直接接收,但芯片的引脚比较多;串行方式所用芯片引脚少,封装小,但需要软件处理才能得到所需要的数据。可是单片机I/O引脚本来就不多,使用串行器件可以节省I/O资源。 ADC0832是8位逐次逼近模数转换器,可支持两个单端输入通道和一个差分输入通道。相同功能的器件还有ADC0834,ADC0838,ADC0831。所不同的是它们的输入通道数量不同。它们的通道选择和配置都是通过软件设置。 3.1.1 ADC0832芯片接口程序的编写单片机串行工作方式时 ,串行口是作为同步移位寄存器使用。这时以 P3.3端作为数据移位的入口和出口 ,而由P3.6端提供移位时钟脉冲。单片机串行口方式 0与 ADC0832的接口,单片机P2.0接ADC0832的CS,P3.6接0832的CLK作为时钟信号输出端 ,P3.7 接 0832的 DO和DI作为启动位、配置位的发送端以及 A/D转换后输出数据的接收端。由于 ADC0832在 CS变低后的前 3个周期内,DO端为高阻态;转换开始后 ,DI线禁止 ,因此 ,DI端和 DO端可连接在一起。ADC0832的时钟频率最高为 400kHz,单片机晶振可选用 4MHz,在 TXD的输出频率为 4MHz/12 =333. 3kHz,符合要求。ADC0832输出的串行数据共 15位 ,由两段 8位数据组成 ,前一段是最高位在先 ,后一段是最高在后 ,两段数据的最低位共用。只有在时钟的下降沿 ,ADC0832的串行数据才移出一位。由单片机控制时钟信号的发送 ,并由P3.6发出 ,以达到控制 ADC0832输出数据位的目的。为了得到一列完整的 8位数据 ,单片机分两次采集含有不同位的数据 ,再合成一列完整的 8位数据。 ADC0832通过内部多路器来控制选择通道,处理器的控制命令通过DI引脚输入。如下流程图所示,当模拟信号输入开始后,首先是CS使能信号也就是片选信号有效,这时是低电平有效,如果片选是高电平时停止转换。当时钟信号有效时输入通道的控制字来确定所选择的通道,读取数据后就开始将模拟量转换位数字量,A/D转换结束后,单片机读取数值,如果没转换完,又回到使能开始。 图3.1 ADC0832数据读取程序流程 3.2 单片机与键盘的接口程序设计AT89C51单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。检测当前是否有键被按下。检测的办法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,不然有键闭合。 去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。 若有键被按下,应识别出是哪一个键闭合。办法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出: P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,不然有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。 从以上分析得到单片机键盘扫描程序的流程图如图3.2所示。程序如下 图3.2单片机矩阵式键盘接口流程图 3.4 LED数码管显示程序设计利用单片机内部的串行接口,可以实现静态的显示处理。这样不仅可以节省单片机的并行接口资源,而且在大多数不使用串行接口的情况下,可以减少或是免去扩展接口。 在这种设计中,串行口工作于方式0,数据的输入输出都通过RxD实现,移位脉冲则由TxD发出。每次传送一个字节数据。每输出一个字节数据,单片机自动使串行中断请求标志TI置。通过测试该状态,即可确定该字节是否发送完毕。由硬件电路图可知,74LS164是串行输入并行输出的移位寄存器。它具有两个串行输入端和8位并行输出端(QA~QH)。 当显示数据从RxD端输出到移位寄存器74LS164的输入端AB时,74LS164将串行数据转换成8位输出码QA~QH,然后加到共阳极LED显示器上。究竟在哪一位上显示,还要P1口的状态而定。当某一位为低电平时,该位LED显示,其他位不显示。由于接口电路中显示模型输出地址和位选信号可一次选中,故只要一次输出即可显示一位。 图3.3 LED的显示流程图
第四章 总结
在设计中遇到不少困难,这对自己是一个考验,刚开始拿到题目的时候头绪并不是很多,通过查阅资料对整个系统有了一定的认识。单片机的相关内容在大三的课程学过,但是学得并不是很深,在设计前我重新学习了一遍单片机的知识,包括芯片接口和51系列单片机的指令等。串行A/D转换器ADC0832是新接触的一种芯片,除学习芯片功能外,主要了解了对芯片串行输出的控制,这里的软件设计是一个难点,我们这次用的是用PROTEI99绘图软件,我们以前学过但是学的不深这对我来说是个难点,但是通过看书和同学老师的帮忙,使得我画好了原理图和PCB版的出图。还有就是焊版,焊不好就无法显示要的数据,调试是最关键的时候,刚开始的时候没有显示,在修改程序的时候花了不少时间最后,终于显示可以想要的结果。当程序下载到焊版的时候,首先是显示0000,如果改变滑动变阻器时,通过ADC0832就可以显示不同的数据,我做的首先是采集模拟量,然后显示需要的数据。我认为我们专业学习硬件知识相对比软件多,所以在软件设计方面我还有很大不足。程序的设计经过“学习–模仿–编写–修改–再修改–定型”等阶段,在软件的学习上我也花了比较多的时间和精力,让我欣慰的是收获也很大。
附录A硬件原理图
附录B- #include<reg51.h>
- #include<stdio.h>
- #include<math.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ADC0832CH0 channel;
- //*********定义变量区*******************
- sbit clk_adc0832=P3^6; //定义各个控制引脚
- sbit cs_adc0832=P2^0;
- sbit di_adc0832=P3^7;
- sbit do_adc0832=P3^7;
- sbit LED0_CS=P1^0;
- sbit LED1_CS=P1^1;
- sbit LED2_CS=P1^2;
- sbit LED3_CS=P1^3;
- sbit adarm=P2^2;
- uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//0,1,2,3,4,5,6,7,8,9,off //共阳极笔端码
- uchar ch; //采样返回数据
- //*********函数声明区********************
- void tkey(void); //键盘函数
- unsigned runADC0832(bit); //A/D转换
- void Delayms(uint x); //延时显示函数
- void Update_LED(); //LED显示函数
- void LED_analyze();
- //**********主函数开始**********
- void main()
- {
- P0=0XFF;
- P1=0XFF;
- P2=0XFF;
- P3=0XFF;
- Uart_Init();
- TH0=0x3C;
- TL0=0xAF;
- ET0=1; //开外部中断0
- EA=1; //全局中断打开
- TR0=1;
- nCounter=0;
- Change_Flag=0;
- while(1)
- {
- void tkey(void);
- runADC0832();
- if(Change_Flag==1)
- { Update_LED();
- if(ch>9999)
- ch=0;
- printf("counter refreshed %d \n",ch);
- }
- delay();
- /********矩键查寻键值4*4程序******/按键为P1.0---P1.7
- void Tkey(void)
- {
- uchar readkey;//rereadkey;
- uchar x_temp,y_temp;
- P1=0x0f;
- x_temp=P1&0x0f;
- if(x_temp==0x0f) goto keyout;
- P1=0xf0;
- y_temp=P1&0xf0;
- readkey=x_temp|y_temp;
- readkey=~readkey;
- switch(readkey)
- {
- case 0x11:key=0; break;
- case 0x21:key=1; break;
- case 0x41:key=2; break;
- case 0x81:key=3; break;
- case 0x12:key=4; break;
- case 0x22:key=5; break;
- case 0x42:key=6; break;
- case 0x82:key=7; break;
- case 0x14:key=8; break;
- case 0x24:key=9; break;
- case 0x44:key=10;break;
- case 0x84:key=11;break;
- case 0x18:key=12;break;
- case 0x28:key=13;break;
- case 0x48:key=14;break;
- case 0x88:key=15;break;
- default: key=16;break;
- }
- keyout:_nop_();
- }//**********A/D转换子程序开始***************
- unsigned runADC0832(void) //读ADC0832函数
- {
- 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 control(uchar d) //数据个、十、百、千取数函数
- ch=ch%10000;
- AD_bcd[0] =ch/1000;
- AD_bcd[1]=(ch/100)%10;
- AD_bcd[2] =(ch%100)/10;
- AD_bcd[3]=(ch%100)%10;
- update_disbuf();
- }
- void update_disbuf(void) //对应显示的数据函数
- { P0=dis_code[AD_bcd[0]];
- LED_0=0;
- Delayms(10);
- LED_0=1;
- P0=dis_code[AD_bcd[1]];
- LED_1=0;
- Delayms(10);
- LED_1=1;
- P0=dis_code[AD_bcd[2]];
- LED_2=0;
- Delayms(10);
- LED_2=1;
- P0=dis_code[AD_bcd[3]];
- LED_3=0;
- Delayms(10);
- LED_3=1;
- }
复制代码
完整的Word格式文档51黑下载地址: |