单片机电子称课程设计.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、绪论 (1)
1.0引言 (1)
1.1问题的提出 (1)
1.2任务与分析 (1)
二、总体方案设计 (2)
2.1设计任务 (2)
2.2 系统设计框图 (3)
三、系统硬件设计 (3)
3.1 5V直流电源设计模块 (3)
3.2 传感器数据采集模块 (5)
3.3信号电路放大模块 (8)
3.4 A/DC0832数模转换模块 (9)
3.5 AT89C51单片机控制模块 (11)
3.6 LED显示模块 (13)
四、系统软件设计 (14)
4.1 C语言在单片机中的用 (14)
4.2电子称的软件设计与实现 (15)
4.3主程序流程图 (15)
4.4 子程序设计 (16)
4.4.1 A/DC0832采样程序 (16)
4.4.2 LED显示程序 (16)
五、Protues仿真调试 (17)
5.1 仿真调试结果 (17)
设计总结 (19)
参考文献 (20)
附录A程序清单 (20)
附录B 原理图 (26)
附录C PCB图 (27)
一、绪论
1.0引言
在我们生活中经常都需要测量物体的重量,于是就用到秤,但是随着社会的进步、科学的发展,我们对其要求操作方便、易于识别。

随着计量技术和电子技术的发展,传统纯机械结构的杆秤、台秤、磅秤等称量装置逐步被淘汰,电子称量装置电子秤、电子天平等以其准确、快速、方便、显示直观等诸多优点而受到人们的青睐。

通过分析近年来电子衡器产品的发展情况及国内外市场的需求,电子衡器总的发展趋势是小型化、模块化、集成化、智能化;其技术性能趋向是速率高、准确度高、稳定性高、可靠性高;其功能趋向是称重计量的控制信息和非控制信息并重的“智能化”功能;其应用性能趋向于综合性和组合性。

1.1问题的提出
电子秤是电子衡器中的一种,衡器是国家法定计量器具,是国计民生、国防建设、科学研究、内外贸易不可缺少的计量设备,衡器产品技术水平的高低,将直接影响各行各业的现代化水平和社会经济效益的提高。

称重装置不仅是提供重量数据的单体仪表,而且作为工业控制系统和商业管理系统的一个组成部分,推进了工业生产的自动化和管理的现代化,它起到了缩短作业时间、改善操作条件、降低能源和材料的消耗、提高产品质量以及加强企业管理、改善经营管理等多方面的作用。

随着时代科技的迅猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。

经现今电子衡器制造技术及应用得到了新发展:电子称重技术从静态称重向动态称重发展;计量方法从模拟测量向数字测量发展;测量特点从单参数测量向多参数测量发展。

常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。

1.2任务与分析
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过
控制外部AD0832芯片来检测滑动变阻器模拟物体质量。

并且通过LED数码管显示。

首先在protus软件环境中进行硬件电路图的设计,再运用keil软件编程,然后在Proteus软件环境中运行仿真。

该系统具有简单清晰的操作界面,可随时进行物体质量测量观察。

系统还具有功耗小、成本低的特点,具有很强的实用性。

本设计的系统主要由:AT89C51为中央处理芯片,用于数据处理,初值设定。

传感器模块进行物体质量测量,将传感器采集到的数据经A/D转换送入单片机,再由单片机处理后由LED显示。

本设计方案主要有六大模块:
1、5V直流电源设计模块
2、传感器数据采集模块
3、信号电路三放大模块
4、A/DC0832数模转换模块
5、AT89C51单片机控制模块
6、LED显示模块
二、总体方案设计
2.1设计任务
设计要求掌握电子秤的基本原理;掌握电子秤硬件电路的设计;掌握电子秤软件程序设计,掌握仿真软件的使用。

1、采用MCS-51系列单片机为中央处理器
2、实现10公斤称重,称量精度:克
3、采用LED显示器显示
4、要求设计出电路原理图、印制板图
5、要求写出程序清单
6、Protus仿真程序
2.2 系统总体设计框图
其工作原理为:前端信号处理时,选用放大、信号转换等措施,在显示方面采用具有字符图文显示功能的LED 显示器。

这种方案不仅加强了人机交换的能力,而且满足设计要求。

电子秤的总体方框图如图2.2所示。

图2.2 系统总体方框图
目前单片机技术比较成熟,功能也比较强大,被测信号经放大整形后送入单片机,由单片机对测量信号进行处理并根据相应的数据关系译码显示出被测物体的重量。

单片机控制适合于功能比较简单的控制系统,
而且其具有成本低
,功耗低,
体积小算术运算功能强,
技术成熟等优点。

三、 系统硬件设计
3.1 5V 直流电源设计模块
需要多种电源,单片机需要+5V 电源,运放需要±5V ,传感器需要+5V 以上的线性电源。

稳压电源的设计,是根据稳压电源的输出电压U o 、输出电流I o 、输出纹波电
压ΔU op-p 等性能指标要求,正确地确定出变压器、集成稳压器、整流二极管和滤
波电路中所用元器件的性能参数,从而合理的选择这些器件。

压力传感器 信号放大传输
A/D 数模转换 AT89C51单片机 LED 数码管显示
如图3.1所示电路为输出电压+5V、输出电流1.5A的稳压电源。

它由电源变压器B,桥式整流电路D1~D4,滤波电容C1、C3,防止自激电容C2、C3和一只固定式三端稳压器(7805)极为简捷方便地搭成的。

220V交流市电通过电源变压器变换成交流低压,再经过桥式整流电路D1~D4和滤波电容C1的整流和滤波,在固定式三端稳压器LM7805的Vin和GND两端形成一个并不十分稳定的直流电压(该电压常常会因为市电电压的波动或负载的变化等原因而发生变化)。

此直流电压经过LM7805的稳压和C3的滤波便在稳压电源的输出端产生了精度高、稳定度好的直流输出电压。

本稳压电源可作为TTL电路或单片机电路的电源。

三端稳压器是一种标准化、系列化的通用线性稳压电源集成电路,以其体积小、成本低、性能好、工作可靠性高、使用简捷方便等特点,成为目前稳压电源中应用最为广泛的一种单片式集成稳压器件。

图3.1 5V直流电源设计原理
3.2 传感器数据采集模块
3.2.1电阻应变式传感器的组成以及原理
电阻应变式传感器是将被测量的力,通过它产生的金属弹性变形转换成电阻变化的元件。

由电阻应变片和测量线路两部分组成。

本设计中采用的是电阻丝应变片,为获得高电阻值,电阻丝排成网状,并贴在绝缘的基片上,电阻丝两端引
出导线,线栅上面粘有覆盖层,起保护作用。

电阻应变片也会有误差,产生的因素很多,所以测量时我们一定要注意,其中温度的影响最重要,环境温度影响电阻值变化的原因主要是:
A.电阻丝温度系数引起的。

B.电阻丝与被测元件材料的线膨胀系数的不同引起的。

对于因温度变化对桥接零点和输出,灵敏度的影响,即使采用同一批应变片,也会因应变片之间稍有温度特性之差而引起误差,所以对要求精度较高的传感器,必须进行温度补偿,解决的方法是在被粘贴的基片上采用适当温度系数的自动补偿片,并从外部对它加以适当的补偿。

非线性误差是传感器特性中最重要的一点。

产生非线性误差的原因很多,一般来说主要是由结构设计决定,通过线性补偿,也可得到改善。

滞后和蠕变是关于应变片及粘合剂的误差。

由于粘合剂为高分子材料,其特性随温度变化较大,所以称重传感器必须在规定的温度范围内使用。

全桥测量电路中,将受力性质相同的两应变片接入电桥对边,当应变片
初始阻值:R
1=R
2
=R
3
=R
4
,其变化值ΔR
1
=ΔR
2
=ΔR
3
=ΔR
4
时,其桥路输出电
压U
out
=KEε。

其输出灵敏度比半桥又提高了一倍,非线性误差和温度误差均得到改善。

安装示意图如图3.2.1所示
图3.2.1应变式传感器安装示意图
3.2.2 电阻应变式传感器的测量电路
常规的电阻应变片K值很小,约为2,机械应变度约为0.000001—0.001,所以,电阻应变片的电阻变化范围为0.0005—0.1欧姆。

所以测量电路应当能精确测量出很小的电阻变化,在电阻应变传感器中做常用的是桥式测量电路。

桥式测量电路有四个电阻,其中任何一个都可以是电阻应变片电阻,电桥的一个对角线接入工作电压U,另一个对角线为输出电压Uo。

其特点是:当四个桥臂电阻达到相应的关系时,电桥输出为零,或则就有电压输出,可利用灵敏检流计来测量,所以电桥能够精确地测量微小的电阻变化。

测量电路是电子秤设计电路中是一个重要的环节,我们在制作的过程中应尽量选择好元件,调整好测量的范围的精确度,以避免减小测量数据的误差。

它由电阻应变片电阻R1、R2、R3、R4组成测量电桥,R
1=R
2
=R
3
=R
4

350Ω,加热丝阻值为50Ω左右,测量电桥的电源由稳压电源U
in
供给。

传感器全桥测量电桥如图3.2.2所示:
图3.2.2 全桥测量电桥图
Rw1
3.3信号电路放大模块
本次课程设计中,需要一个放大电路,我们将采用三运放大电路,主要的元件就是三运放大器。

在许多需要用A/D转换和数字采集的单片机系统中,多数情况下,传感器输出的模拟信号都很微弱,必须通过一个模拟放大器对其进行一定倍数的放大,才能满足A/D转换器对输入信号电平的要求,在此情况下,就必须选择一种符合要求的放大器。

经由传感器或敏感元件转换后输出的信号一般电平较低;经由电桥等电路变换后的信号亦难以直接用来显示、记录、控制或进行信号转换。

为此,测量电路中常设有模拟放大环节。

这一环节目前主要依靠由集成运算放大器的基本元件构成具有各种特性的放大器来完成。

放大器的输入信号一般是由传感器输出的。

传感器的输出信号不仅电平低,内阻高,还常伴有较高的共模电压。

因此,一般对放大器有如下一些要求:
1、输入阻抗应远大于信号源内阻。

放大器的负载效应会使所测电压造成偏差。

2、抗共模电压干扰能力强。

3、在预定的频带宽度内有稳定准确的增益、良好的线性,输入漂移和噪声应足够小以保证要求的信噪比。

从而保证放大器输出性能稳定。

4、能附加一些适应特定要求的电路。

如放大器增益的外接电阻调整、方便准确的量程切换、极性自动变换等.
图为3.3 为AD620放大器 AD620引脚说明:
1、8:外接增益电阻
2:反向输入端
3:同向输入端
4:负电源
5:基准电压
6:共地信号输出
图3.3 AD620 7:正电源
3.4 A/DC0832数模转换模块
3.4.1功能特点
ADC0832是NS(National Semiconductor)公司生产的串行接口8位A/D转换器,通过三线接口与单片机连接,功耗低,性能价格比较高,适宜在袖珍式的智能仪器仪表中使用。

ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。

芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。

通过DI 数据输入端,可以轻易的实现通道功能的选择。

其主要特点如下:
● 8位分辨率,逐次逼近型,基准电压为5V;
● 5V单电源供电;
●输入模拟信号电压范围为0~5V;
●输入和输出电平与TTL和CMOS兼容;
●在250KHZ时钟频率时,转换时间为32us;
●具有两个可供选择的模拟输入通道;
●功耗低,15mW。

3.4.2外部引脚及其说明
ADC0832有DIP和SOIC两种封装,DIP封装的ADC0832引脚排列如图3.4.2所示。

各引脚说明如下:Array
● CS——片选端,低电平有效。

● CH0,CH1——两路模拟信号输入端。

● DI——两路模拟输入选择输入端。

● DO——模数转换结果串行输出端。

●CLK——串行时钟输入端。

图3.4.2 ADC0832引脚图
● Vcc/REF——正电源端和基准电压输入端。

● GND——电源地。

3.4.3 单片机对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位数据用于选择通道功能,其功能项见表1。

表1
输入形式配置位选择通道
CH0 CH1 CHO CH1
差分输入0 0 + -
0 1 - +
单端输入 1 0 +
1 1 +
如表所示,当配置位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 端输出转换数据最高位D7,随后每一个脉冲DO端输出下一位数据。

直到第11个脉冲时发出最低位数据D0,一个字节的数据输出完成。

也正是从此位开始输出下一个相反字节的数据,即从第11个时钟脉冲输出D0。

随后输出8位数据。

3.5 AT89C51单片机控制模块
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器, AT89C51
单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51单片机特点能与MCS-51 兼容,有 4K字节可编程闪烁存储器,寿命能够达到1000写/擦循环,数据可以保留时间长达10年,全静态工作:0Hz-24MHz,三级程序存储器锁定,128×8位内部RAM,32可编程I /O线,两个16位定时器/计数器,5个中断源,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路。

单片机引脚图3.5所示:
图3.5 AT89C51单片机引脚图
各引脚的功能如下:
VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高[3]。

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口输出其特殊功能寄存器的内容。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

RST:复位输入。

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

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。

在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

串口和中断系统仍在工作。

在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

3.6 LED显示模块
3.6.1 LED显示器结构与原理
LED显示块是由发光二极管显示字段的显示器件。

在单片机应用系统中通常使用的是七段LED。

这种显示块有共阴极与共阳极两种。

共阴极LED显示块的发光二极管阴极共地。

当某个发光二极管的阳极为高电平时,发光二极管点亮;共阳极LED显示块的发光二极管阳极并接。

3.6.2 LED显示器与显示方式
系统采用动态扫描显示方式显示电压,动态显示方式所需元件数量和元件种类较静态显示方式要少的多,并且利用人眼的视觉暂留效应和发光二极管熄灭时的余辉,动态显示方式可以较好地“同时”显示多个字符,只要扫描频率足够高就不会使人产生闪烁的感觉。

在单片机应用系统中使用LED显示块构成N位LED显示器。

N位LED显示器有N根位选线和8*N根段选线。

根据显示方式不同,位选线与段选线的连接方法不同。

段选线控制字符选择,位选线控制显示位的亮、暗。

LED显示器有静态显示与动态显示两种方式。

我们使用的为动态显示 LED 动态显示方式。

LED单片机控制连线如图3.6.1所示:
图3.6.1 LED控制路线
四、系统软件设计
4.1 C语言在单片机中的运用
在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。

如果是机电一体化的设计人员,往往需要同时考虑单片机的软硬件资源分配。

本系统的软件设计主要分为系统初始化、按键、显示处理及信号频率输入处理。

程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。

其步骤可概括为以下三点:
⑴分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。

这是能否编制出高质量程序的关键。

⑵根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。

⑶编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。

C语言是一种通用的计算机程序设计语言,在国际上非常流行。

它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。

以前计算机的系统软件主要用汇编语言编写,单片机应用系统更是如此。

C语言是当前最流行的程序设计语言,它像其它高级语言一样,面向用户,面向解题的过程,编程者不必熟悉具体的计算机内部结构和指令;C语言又像汇编语言一样,可以对机器硬件进行操作。

如进行端口I,0操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作它的语句一样。

我们知道,汇编语言将涉及计算机硬件,所以C
语言又像低级语言一样,可以对计算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间的一种中级语言。

正是因为C语言具有这样的特性,所以很适合编写要对硬件进行操作的软件程序。

本文采用C语言进行编写.因为此系统软件比较,其存储量较大,因此必须应用C语言编程了[。

4.2 电子称的软件设计与实现
电子称软件设计均采用模块化设计,整个程序包括主程序、定时中断程序、INTO中断程序按键程序、数据处理子程序。

所有程序均采用C汇编语言编写,电子计价秤的软件设计思路说明如下:主程序的作用为程序初始化,并时时显示十进制的质量。

设定T0为计数工作方式,T1为定时工作方式。

其中R0为标志位寄存器当为OOH时为正常显示方式。

当为01H时为累计显示方式,在T1定时中断程序中。

一秒钟采样物料重量(已转成脉冲频率),并赋值重量计算RAM区和显示RAM区。

在INTO外部中断程序中,采样单价并赋值质量。

4.3主程序流程图
主程序流程图给出了系统工作的基本过程,描述了信号的基本流向,起到一个向导的作用。

主程序流程图如图4.3所示:
图4.3主程序流程图
4.4 子程序设计
系统子程序主要包括A/D 转换启动及数据读取程序设计、LED 显示程序设计等。

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

ADC0832采样程序的程序流程图如图4.4.1所示。

图4.4.1 A/DC0832采样程序流程图 4.4.2 LED 显示程序
7段式LED 显示器内部由7个发光二极管和一个小圆点发光二极管组成。

这种数码管共阴和共阳两种:共阳极数码管的发光二极管所有阳极连接在一起,为公共端。

共阴极数码管的发光二极管所有阴极连接在一起,为公共端。

当需要某个数码管亮时,需要选中该数码管,再由输入端口输入相应段码。

LED 数码管段码如下所示:
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xff 这些段码分别代表数码管显示相应数字0 1 2 3 4 5 6 7 8 9 . 关闭功能。

开 始
拉低CS 、拉高CLK
DATA 右移8位?
拉高CS 、拉低CLK ,
返回数据DAT 结 束 Y
N
附录A程序清单
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x7f //常量定义
#define DATAPORT P0
sbit ADCS =P3^5;
sbit ADDI =P3^7;
sbit ADDO =P3^7;
sbit ADCLK =P3^6;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
uint x1,y1,z1=0,w1,temp1;
uchar ad_data,k,n,m,e,num,s; //采样值存储sbit beep =P3^0;
char press_data; //标度变换存储单元unsigned char press_ge=0; //显示值个位unsigned char press_shifen=0; //显示值十分位unsigned char press_baifen=0; //显示值百分位unsigned char press_qianfen=0; //显示值千分位
unsigned char press_shi=0; //显示值十位unsigned char press_dian=0; //显示值小数点
void delay(uint);
uchar Adc0832(unsigned char channel);
void alarm(void);
void data_pro(void);
int x;
//定义数码管共阳极的段码
uchar code
dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0x ff};
void delayms (unsigned int x)
{
unsigned char j;
while (x--)
{
for (j=0;j<123;j++){;}
}
}
/**********main funcation************/
void main(void)
{
uchar num=0;
while(1)
{
P0=0xff;
P0=dispcode[press_qianfen];LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;LED6=1; delayms(5);
P0=0xff;
P0=dispcode[press_baifen] ;LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;LED6=0; delayms(5);
P0=0xff;
P0=dispcode[press_shifen] ;LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;LED6=0; delayms(5);
P0=0xff;
P0=dispcode[press_dian] ;LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;LED6=0; delayms(5);
P0=0xff;
P0=dispcode[press_ge] ;LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;LED6=0; delayms(5);
P0=0xff;
P0=dispcode[press_shi] ;LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0; delayms(5);
ad_data =Adc0832(0); //采样值存储单元初始化为0
data_pro();
}
}
//读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;
float press;
if(0<ad_data<256)
{
int vary=ad_data;
press=(0.01961*vary);
temp1=(int)(press*2000); //放大2000倍
press_shi=temp1/10000; //取电压值十位
press_ge=(temp1%10000)/1000; //取电压值个位
press_shifen=((temp1%10000)%1000)/100; //取电压值十分位
press_baifen=(((temp1%10000)%1000)%100)/10; //取电压值百分位
press_qianfen=(((temp1%10000)%1000)%100)%10; //取电压值千分位
press_dian=10; //取电压值小数点
}
}
附录B、电子称原理图。

相关文档
最新文档