目录 第一章 绪论 1 第二章 需求分析 2 2.1 设计目的 2 2.2 设计要求 2 第三章 方案设计 3 第四章 硬件设计 4 4.1 信号输入 4 4.2信号放大 5 4.3 A/D转换 7 4.4 单片机 9 第五章 LABVIEW软件设计 10 5.1 串口通讯 10 5.2 报警模块 11 5.3 存入数据 11 5.4 数据显示 12 第六章 测量误差处理 14 6.1 系统误差处理 14 6.2 随机误差处理 14 第七章 小结 15 参考文献 16 附录 17
第一章绪论 本次课程设计的题目是设计虚拟电压表。使用了C51单片机和AD7705模块完成数据的采集和处理,然后将处理后的数据通后串口发送到计算机。计算机由LABVIEW程序编写上位机程序,将收到的数据进行判断,处理后进行显示,存储等操作。由LABVIEW编写的上位机程序,在整个课程设计中有重要的作用。本次设计的虚拟电压表是一种虚拟仪器。它是由计算机技术、测量技术和微电子技术高速发展而孕育出的一项革命性技术。这一创新使得用户能够根据自己的需要定义仪器功能,而不像传统仪器那样受到仪器厂家的限制。虚拟仪器的出现彻底改变了传统的仪器方法,开辟了测控技术的新纪元。 虚拟仪器由硬件设备与接口、设备驱动软件和虚拟仪器面板组成。其中,硬件设备与接口可以是各种以PC为基础的内置功能插卡、通用接口总线接口卡、串行口、VXI总线仪器接口等设备,或者是其它各种可程控的外置测试设备,设备驱动软件是直接控制各种硬件接口的驱动程序,虚拟仪器通过底层设备驱动软件与真实的仪器系统进行通讯,并以虚拟仪器面板的形式在计算机屏幕上显示与真实仪器面板操作元素相对应的各种控件。用户用鼠标操作虚拟仪器的面板就如同操作真实仪器一样真实与方便。 与传统仪器相比,虚拟仪器其有下面一些特点: (1)虚拟仪器的软硬件都具有开放性、模块化、互换性、可重复使用等特点。 (2)大大地降低了测试成本。 (3)使用效率高。 (4)功能更强大,处理能力更强。 (5)远程访问和交互式操作。 (6)测量精度更高。 本次的虚拟电压表设计就是采用了虚拟仪器设计,硬件只完成数据测量和把测量的数据传入计算机的任务。然后对数据的处理,显示,判断,报警等操作都由LABVIEW程序完成。这样可以尽量减少硬件器件间的干扰,参数误差等原因造成的误差,还能降低购买元件的成本等,能够带来很大的方便。 第二章需求分析2.1 设计目的 本次课程设计的任务是设计虚拟电压表。设计一个智能化的虚拟电压采集、测量、监控系统,该系统以单片机和虚拟仪器技术为核心并具有如下功能: (1)能对0-10V范围变化的模拟信号进行连续采样,并在PC机中进行实时显示,采样频率不低于10Hz; (2)具有数据记录功能,能够将采集到的数据以文件形式保存在PC机中; (3)能对系统存在的随机误差和系统误差进行校正; (4)系统具有自动量程选择功能,量程至少4档可调; (5)具有自动电压监控功能,当采样值大于8V时,点亮报警指示灯。 2.2 设计要求(1)合理设计系统总体方案,并画出方框图; (2)正确选择A/D和PGA,要求系统测量最大量程时,测量分辨率达到1mV以内,最小量程时测量分辨率达到1uV以内; (3)要求系统具有随机误差和系统误差校正功能,具有自动量程选择功能; (4)PC机软件由LabVIEW或C/C++等编程实现,要求操作方便,界面美观; (5)设计说明书应详细说明设计思路、特点和电路工作原理; (6)用A3纸绘制软件流程图,流程图要模块化并具有可读性(即根据流程图知道程序功能的实现过程);编制模块化源程序,注释不少于1/3; (7)硬件电路图应详细标明所采用元件的型号、连线的引脚编号,要求采用专业软件绘制硬件电路图; (8)设计说明书应包括课程设计任务、总体方案设计、详细硬件、详细软件设计、软件流程图、程序清单、元器件清单7个部分; 按照学校课程设计说明书撰写规范提交一份课程设计说明书(6000左右) 第三章 方案设计设计方案主要由两部分组成。单片机和芯片部分组成下位机,用于测量数据和把数据发送到计算机。LABVIEW部分组成上位机程序,主要用于测量结果的显示和随机误差处理。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image003.png |
图3.2 LABVIEW程序流程图
图3.1 单片机流程图
第四章硬件设计本次课程设计用到的硬件部分主要有C51单片机和AD7705模块,和一个光敏电阻。AD7705芯片主要用于对电压进行放大采集和进行AD转换,对外界的输入电压进行测量。单片机主要用于控制AD7705芯片的操作,对芯片进行设置等操作。对系统误差进行处理,进行串口通信,将数据传入计算机中,由LABVIEW程序进行接收,然后由程序进行进一步的处理和显示等操作。 4.1 信号输入由于在设计要求中的输入信号要求是0—10V的电压测量,所以在设置AD7705芯片时可以采用单极性的工作方式。这样有利于充分利用芯片AD的转换精度。采用单极性输入方式时,芯片可接收的信号的范围是从0—+20mV到0—2.5V的单极性信号。测量要求是要最大输入0—10V的电压信号,大于芯片可接收的最大电压,所以为了满足设计要求需要对输入信号进行分压操作,使实际输入AD芯片的电压为要测量电压的四分之一,然后进行AD转换后对测量值乘以四倍恢复实际电压的大小。 本次课程设计采用的是AD7705模块,在模块设计时对输入电压进行了一次分压,使得输入芯片的电压为所测量的实际电压的一半。所以AD7705模块的电压输入最大范围是0—5V。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image005.jpg |
图4.1 AD7705模块输入电路 在课程设计中要求的是最大0—10V,所以需要再次进行分压。第二次分压使用光敏电阻。当光照强度高时光敏电阻的阻值较小,光敏电阻上的分压较小。当光照强度较低时,光敏电阻的阻值较大,光敏电阻的分压较大。所以当改变光照的强度时,电压就会发生变化。方便改变输入的电压,对不同的电压值进行测量。检验电压表设计的精度,判断设计是否正确。且使用光敏电阻方便快捷适合对设计进行检验。
4.2信号放大选用的TM7705芯片模块具有16位的AD转换功能和可编程放大器功能。可以选择1,2,4,8,16,32,64,128倍的增益,通过软件编程进行控制放大。通过软件编程直接测量传感器输出的各种微小信号,并将不同幅度范围的各类输入信号放大到接近A/D转换器的满标度电压再进行A/D转换,充分利用A/D的转换精度,减小误差。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image006.png 图4.3 AD7705内部结构图 因为在进行A/D转换时要选择合适的增益对输入信号进行放大,充分利用A/D转换的精度,减小误差。所以在设计方案时需要对输入信号的大小进行判断,选择合适的增益。 当检测到输入信号时先设置增益为一,芯片对输入信号进行A/D转换,得到一个16为的二进制转换数值。然后对转换值的大小进行判断。若转换值在 1—10V之间,则对信号放大1倍。若在0.1—1V之间,则对信号放大8倍。若在0.01—0.1之间,则对信号放大64倍。若在0到0.01之间,则对信号放大128倍。当放大倍数确定后,先对增益进行设置,根据程序选择合适的放大倍数,然后将放大后的信号进行A/D转换。放大后的信号更加接近A/D的满标度电压,充分利用A/D的精度。 在进行芯片的增益设置时需要用到芯片内部的各种寄存器。A/D7705的工作方式,增益选择等设置都是通过改变寄存器内的参数来实现的。 AD7705/7706 片内包括 8 个寄存器,这些寄存器通过器件的串行口访问。第一个是通信寄存器,它管理通道选择,决定下一个操作是读操作还是写操作,以及下一次读或写哪一个寄存器。 所有与器件的通信必须从写入通信寄存器开始。上电或复位后,器件等待在通信寄存器上进行一次写操作。这一写到通信寄存器的数据决定下一次操作是读还是写,同时决定这次读操作或写操 作在哪个寄存器上发生。所以,写任何其它寄存器首先要写通信寄存器,然后才能写选定的寄存器。所有的寄存器(包括通信寄存器本身和输出数据寄存器)进行读操作之前,必须先写通信寄存器,然后才能读选定的寄存器。此外,通信寄存器还控制等待模式和通道选择,此外 DRDY状态 也可以从通信寄存器上读出。 所以在对增益进行设置前需要先对通信寄存器进行写操作。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image007.png表4.1 通信寄存器
表4.2 设置寄存器
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image008.png |
先对通信寄存器写入0x38,选择数据寄存器,选择通道一,下一步进行读操作。然后调用编写的A/D7705读函数。读取转换结果输出端口DOUT。然后对转换结果的大小进行判断。再对通信寄存器进行操作,写入0x10。选择设置寄存器,选择通道一,下一步进行写操作。根据对转换结果大小的判断,对设置寄存器写入数据。如第一次转换值在1—10V,则增益选择应为一倍。在设置寄存器中写入0x46。选择自校准模式,增益设置为一倍,单极性工作模式,缓冲模式。将下一次的A/D转换设置合理的增益,使下一次的A/D转换输入尽量达到满标度值,增加精度。
4.3 A/D转换在选择合适的增益后需要对放大后的电压进行A/D转换。A/D转换是由A/D7705模块内部的ε—Δ调制器完成。 AD7705是一种16位A/D转换器,可以用于测量低频模拟信号。当电源电压为5V、基准电压为2.5V时,AD7705可直接接收0-2.5V摆幅范围的单极性信号和-2.5V-2.5V范围内的双极型信号。器件带有增益可编程放大器,可选择1、2、4、8、16、32、64、128等8中增益之一,通过软件编程可以直接测量传感器输出的各种微小的信号,并将不同幅度范围的各种输入信号放大到接近AD转换器的满量程电压进行AD 转换。 AD7705是应用于低频测量的2/3通道的模拟前端。该器件可以接受直接来自传感器的低电平的输入信号,然后产生串行的数字输出。利用Σ-∆转换技术实现了16位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。片内数字滤波器处理调制器的输出信号。通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波器的第一个陷波进行编程。AD7705/7706只需2.7~3.3V或4.75~5.25V单电源。AD7705是双通道全差分模拟输入,它带有一个差分基准输入。当电源电压为5V、基准电压为2.5V时,这种器件都可将输入信号范围从0~+20mV到0~+2.5V的信号进行处理。还可处理±20mV~±2.5V的双极性输入信号,对于AD7705是以AIN(-)输入端为参考点,而AD7706是COMMON输入端。当电源电压为3V、基准电压为1.225V时,可处理0~+10mV到0~+1.225V的单极性输入信号,它的双极性输入信号范围是±10mV到±1.225V。因此,AD7705可以实现2/3通道系统所有信号的调理和转换。A/D7705是用于智能系统、微控制器系统和基于DSP系统的理想产品,其串行接口可配置为三线接口。增益值、信号极性以及更新速率的选择可用串行输入口由软件来配置。该器件还包括自校准和系统校准选项,以消除器件本身或系统的增益和偏移误差。CMOS结构确保器件具有极低功耗,掉电模式减少等待时的功耗至20μW(典型值)。AD7705采用16脚塑料双列直插(DIP)和16脚宽体(0.3英寸)SOIC封装和16脚TSSOP封装。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image010.jpg 图4.4 A/D7705引脚分配图 A/D7705是完整的16位低成本Σ-Δ调制器,用于直流测量和低频交流测量应用,其具有低功耗(3 V时最大1m W)特性。 A/D7705拥有两个差分通道,在实际设置时由于只需要一个输入电压,所以固定选择通道一,每次设置通信寄存器时将最后两位设置为00。当电压经过A/D7705模块内的PGA进行放大后,进入Σ-Δ调制器进行转换。然后由程序读函数(AD7705_Read())读DOUT(转换结果输出端),得到一个16为的二进制数。将模拟信号转换为数字信号。
4.4 单片机本次课程设计中还用到了C51单片机。单片机的主要作用是对A/D7705芯片进行控制,消除系统误差和进行串口通讯将数据发送到计算机。将编写好的程序导入单片机中,通过程序给芯片写入各种数据,引导芯片动作,得到A/D转换的结果。然后对数据进行系统误差处理。系统误差处理是通过误差模型校正系统误差。假设实际值x与测量值y是线性关系,建立系统误差模型x=a*y+b。然后将输入值接0和输入最大值10,然后用万用表测出输出输出值,求出a和b。然后将A/D转换值带入公式,进行系统误差校正。 进行系统误差校正后需要将转换数据发送到计算机中,但为了充分利用A/D的转换精度,输入电压通过PGA进行过放大。所以数据在发送前需要除以放大的倍数,然后再将数据进行发送。 在数据发送时要用到串口通讯,所以在单片机程序中需要对串口进行设置。设置SCON 和TMOD 寄存器。允许串口接收,设置串口工作方式等。选定工作的定时器,选择定时器工作方式。然后给低八位和高八位赋值,设置波特率。完成对串口的设置。
第五章 LABVIEW软件设计5.1 串口通讯单片机与计算机的通讯用VISA来完成,VISA是虚拟仪器软件体系结构的缩写,实质上是一个I/O口软件库及其规范的总称。VISA是应用于仪器编程的标准I/0应用程序接口,是工业界通用的仪器驱动器标准API(应用程序接口),采用面向对象编程,具有很好的兼容性、扩展性和独立性。用户可用一个API控制包括VXI、GPIB及串口仪器在内的不同种类的仪器。它还支持多平台工作、多接口控制,是一个多类型的函数库。在LabVIEW中编写的VISA接口程序,当外部设备变更时,只需要更换几个程序模块即可使用,简单方便而且开发效率高。在LabVIEW 中利用VISA节点进行串行通信编程。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image011.png |
图5.1 串口配置 在VISA资源名称端连接串口选择输入端口,方便在运行程序时选择USB接口。配置串口时还连接了波特率和数据比特输入控件,方便对VISA串口进行配置。在VISA读取时需要对每次读取的字节数进行设置。在单片机程序中,波特率设置为9600,每次发送两个数据,每个数据为8比特,。所以在LABVIEW程序中,设置要与单片机保持一致,保证通讯的正常进行,得到正确的数据。如果需要对数据通讯方面进行更改时,需要对单片机程序和LABVIEW程序都进行更改,保证设置的匹配。
5.2 报警模块报警模块是一个简单的比较程序,串口读取的电压与设置的报警电压值进行比较,若串口的电压值较大,则“大于等于”输出的结果为真,报警灯的颜色改变,蜂鸣器报警。设置蜂鸣器报警频率为2Hz,每次持续时间为5ms。 file:///C:/Temp/Temp/msohtmlclip1/01/clip_image012.png
图5.2 报警模块 5.3 存入数据存入数据时先在前面板选择文件存入路径,点击存入“数据按钮”,开始存入数据。按钮的属性设置为释放时转换,所以当点击按钮后,电压数据会不断存入文件中,再次点击按钮后停止。
|
|
|
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image013.png |
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image014.png |
|
图5.3 存入数据(后面板) 图5.4 存入数据(前面板) 5.4 数据显示数据显示时应用了数值显示控件以数字的形式显示电压,还有一个波形图表显示控件,显示电压值与时间的变化关系。前面板还有一个仪表显示控件,用指针的形式显示数值。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image016.jpg |
图5.5 数据显示(前面板)
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image018.jpg |
图5.6 数据显示(后面板) 进行平均值滤波后的数据先进入“判定范围并强制转换”控件,判断电压的范围。因为每个判断控件的上下限判断范围不重合,所以四个判断控件中只有一个判断控件的输出结果为真,其余输出结果为假且只有输出为“真”的判断控件对应的圆形指示灯会亮。四个控件的输出结果进入条件结构。只有一个条件结构执行“真”分支,将电压数据乘以对应的倍数输出。执行“假”分支的条件结构都会输出0。然后将所有条件结构输出的结果相加,输入仪表显示控件,用指针显示。由于仪表显示控件是显示范围只能设置一个范围。所以将每个量程范围内的电压值乘以合适的倍数都转化到0-10V的范围显示。实际值根据哪一个圆形指示灯亮判断在那个范围。
第六章测量误差处理6.1 系统误差处理测量数据的系统误差处理在单片机程序内进行。系统误差处理是通过误差模型校正系统误差。假设实际值x与测量值y是线性关系,建立系统误差模型x=a*y+b。然后将输入值接0和输入最大值10,然后用万用表测出输出输出值,求出a和b。然后将A/D转换值带入公式,进行系统误差校正。
6.2 随机误差处理随机误差处理采用算数平均值滤波的方法处理。这种滤波方法的实质是把N个数据的值相加,再求其平均值。显然N的值越大,结果越准确,但计算的时间越长。这种滤波方法适用于对周期脉动的数据进行平滑加工,但对脉冲性干扰的平滑作用不理想,不宜用于脉冲性干扰较严重的场合。在对电压值进行平均值滤波时,采用N为5,每五个数据计算平均值输出,对随机误差进行处理。
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image020.jpg |
图5.7 随机误差处理 第七章小结通过此次课程设计,使我更加扎实的掌握了有关智能仪器方面的知识,知道了还有许多东西我们没有学到。在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手编程,使我们掌握的知识不再是纸上谈兵。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行过而能改,善莫大焉的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在查找资料后,许多问题终于游逆而解,但也有的没有弄懂。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
参考文献[1] 微机原理与接口技术[M]/周鹏编著.--机械工业出版社.2001 [2] 智能仪器设计基础/史健芳等编著.—2版.—北京:电子工业出版社,2012.9 [3]虚拟仪器测试技术/屈有安,陈雪敏主编.—北京:北京理工大学出版社,2016.1 [4] 智能化测量控制仪表原理与设计(第二版)/徐爱均编著.--北京:北京航空航天大学出版.2004.3 [5] 智能仪器原理及设计技术/刘大茂编著.—国防工业出版社.2014.5
附录LABVIEW前面板程序:
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image022.jpg |
LABVIEW后面板程序:
|
| file:///C:/Temp/Temp/msohtmlclip1/01/clip_image024.jpg |
单片机程序: #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
sbit CS=P1^0; //AD7705使能端 sbit DIN=P1^1; //单片机给AD7705数据输入端 sbit DRDY=P1^2; //AD7705逻辑输出端,用于控制结果是否输出
sbit RST=P1^3; //AD7705复位端 sbit SCLK=P1^4; //AD7705外部时钟信号输入端 sbit DOUT=P1^5; //AD7705模数转换结果输出端
uchar tab[]={0x00,0x00}; //串口输出数组 void delay1ms(uint z); //延时函数,最小延时1ms void AD7705_Reset(); //AD7705复位函数 void AD7705_Init(); //AD7705初始化函数,包括各种寄存器设置与初始化 void AD7705_Write(uchar dat); //AD7705的DIN端口数据输入函数 uint AD7705_Read(); //AD7705的DOUT端口读取模数转换数据的函数 void UART_Init(); //串口初始化函数 void UART_SendByte(uchar dat); //串口发送1字节函数 float AD_adjust(uint num_ad); //系统误差模型矫正函数
uint AD_choose(uint num); //量程选择函数 uint deal(uintflags,uint Nums); /*主函数设计*/ void main() { uintFLAG; uintnData; UART_Init(); //串口初始化 AD7705_Reset(); //端口复位与函数复位共同执行保证芯片正常运行 AD7705_Init(); //AD7705初始化函数,包括各种寄存器设置与初始化 delay1ms(500); while(1) { while(DRDY); //当DRDY置1时,即数据转换结束后开始运行下一步程序 ,DRDY=0表示数据寄存器中的数据可读 AD7705_Write(0x38); //写通信寄存器,选择下一步读、通道CH nData=AD7705_Read(); nData=AD_adjust(nData); //系统误差处理 /**********************************量程选择处理****************/ FLAG=AD_choose(nData); /**********************************量程选择之后再次读数据*******/ while(DRDY); AD7705_Write(0x38); //写通信寄存器,选择下一步读、通道CH nData=AD7705_Read(); nData=deal(FLAG,nData); nData=AD_adjust(nData); //系统误差处理
tab[0]=nData/256; //通过数据读取函数将16位数据拆成2个8位数据赋给数组tab[] tab[1]=nData%256; UART_SendByte(tab[0]); //将数据的两个位数分别通过串口函数传输给电脑形成16位数 UART_SendByte(tab[1]); while(!DRDY); // } }
/*延时函数设计,最小延时1ms*/ void delay1ms(uint z) //延时z ms { uintx,y; for(x=z;x>0;x--) for(y=115;y>0;y--); }
/*AD7705复位函数设计,通过给DIN输入持续32个脉冲周期(SCLK)以上的高电平将复位AD7705的数字接口, 复位之后要等待500us以上才能访问AD7705芯片,这种复位方式不会影响AD7705内部的任何寄存器, 所有的寄存器将保持复位之前的内容,这种操作可以防止AD7705出现端口迷失*/ void AD7705_Reset() { uchari; CS=0; RST=1; DRDY=1;//设置DRDY为输入 DOUT=1;//设置DOUT为输入 DIN=1; for(i=0;i<40;i++)//DIN口高电平持续至少32个时钟后芯片复位 { SCLK=0; _nop_(); SCLK=1; _nop_(); } } /*AD7705初始化函数设计*/ void AD7705_Init() //gain为增益的指数值,范围0-7,代表1、2、4、8、16、32、64、128倍;CH为通道,1为通道1,2为通道2 {
AD7705_Write(0x20); //写通信寄存器,选择通道一,选择下一步写时钟寄存器 AD7705_Write(0x08); //晶振二分频,选择输出更新率分别为20Hz(0x00),25Hz(0x01),100Hz(0x02),200Hz(0x03)————默认输出更新率为20Hz AD7705_Write(0x10); //写通信寄存器,选择通道一,选择下一步写设置寄存器 AD7705_Write(0x46); //***************************** //单极性,自校准,有缓冲,增益指数值 } /*AD7705的DIN端口指令输入函数设计*/ void AD7705_Write(uchar dat) //设定形参为8位数据 { uchar i; SCLK=1; for(i=8;i>0;i--) //将8位形参从高到低按位分8次输给AD7705 { SCLK=0; //时钟脉冲SCLK=0时才能给DIN输入数据使DIN端发生改变 _nop_(); if(dat&0x80) DIN=1; else DIN=0; _nop_(); SCLK=1; //SCLK=1时允许DIN的数据写入到TM7705中 _nop_(); dat<<=1; } DIN=1; //写入结束使DIN=1和SCLK=1以防端口迷失 SCLK=1; } /*AD7705的DOUT端口数据读取函数设计*/ uint AD7705_Read() //返回一个8位的数据转换结果 { uchar i; uintdd=0; SCLK=1; for(i=0;i<16;i++) //分八次将8位数据结果从高位到低位逐位读取 { SCLK=0; //SCLK=0允许DOUT端口数据发生改变 _nop_(); dd=dd<<1; if(DOUT) dd|=0x01; SCLK=1; //SLCK=1时使DOUT端口数据稳定 _nop_(); } SCLK=1; //读出结束使SCLK=1以防端口迷失 return dd; //返回函数数据 } void UART_Init() //串口初始化 { SCON=0x50;//设置串口方式1且允许串口接收。串口工作方式一,8位异步工作方式,波特率可变,由定时器设置 TMOD=0x20;//设置定时器T1,工作方式2,八位自动装入计数初值工作方式。 TL1=0xfd; TH1=0xfd;// TH1:重装值9600波特率晶振11.0592MHz TR1=1;// TR1=1,打开定时器T1 } void UART_SendByte(uchar dat) { SBUF=dat; //将八位数据dat直接赋值给SBUF寄存器 while(!TI); //串口发送中断产生时TI=1,否则TI=0; TI=0; //串口发送成功后必须将TI软件置0 } uint deal(uintflags,uint Nums) { if(flags==1) { Nums=Nums/1.0; } elseif(flags==2) { Nums=Nums/8.0; } elseif(flags==3) { Nums=Nums/64.0; } elseif(flags==4) { Nums=Nums/128.0; } returnNums; }
float AD_adjust(uint num_ad) //系统误差模型矫正函数 { floatad_vo;
ad_vo=4.88*num_ad/4.84125952; returnad_vo; } uint AD_choose(uint num) //量程选择函数 { uintflag=0; //量程转换标志 if(num>1&&num<=10) { AD7705_Write(0x10); //写通信寄存器,选择通道一,选择下一步写设置寄存器 AD7705_Write(0x46); //放大倍数1倍 flag=1; } elseif(num>0.1&&num<=1) { AD7705_Write(0x10); //写通信寄存器,选择通道一,选择下一步写设置寄存器 AD7705_Write(0x5e); //放大倍数8倍 flag=2; } elseif(num>0.01&&num<=0.1) { AD7705_Write(0x10); //写通信寄存器,选择通道一,选择下一步写设置寄存器 AD7705_Write(0x76); //放大倍数64倍 flag=3; } elseif(num>=0&&num<=0.01) { AD7705_Write(0x10); //写通信寄存器,选择通道一,选择下一步写设置寄存器 AD7705_Write(0x7e); //放大倍数128倍 flag=4; } returnflag; }
|