基于单片机的数字电压表制作——(C语言)
基于单片机的数字电压表设计报告

单片机原理及系统课程设计专业:电气工程及其自动化班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院2010 年 3 月 7 日基于单片机的数字电压表设计摘要显示电路输入电路图2.2系统组成框图3.硬件设计3.1系统硬件设计原理通过变量设置选择八路通道中的第三路,将该路模拟电压送入ADC0808相应通道,单片机软件设置ADC0808开始A/D转换,转换结束ADC0808的EOC 端口产生高电平,同时将ADC0808的OE端口置为高电平,单片机将ADC0809转换后的数字量存到片内RAM。
系统调出数据处理子程序,将测量结果转化为0.00~5.00V,最后通过查表将每一位数据输出到LED显示电路,将相应电压显示出来,程序进入下一个循环。
单片机的P0.0~P0.7作为4位动态数码显示管的段显示控制。
P2.1~P2.3作为4位动态显示管的位显示控制。
3.2硬件设计原理图在Proteus仿真环境下所搭建的系统硬件电路图如图3.2所示。
图3.2系统原理图图4.2 程序流程图(a)主程序流程图(b)AD转换流程图5.系统调试及仿真结果6.总结两周的课程设计结束了,在这过程中,我学到了很多东西。
首先,我学会了单片机设计的基本过程有哪些,每一过程有哪些基本的步骤,怎样通过查资料去完成这每一步。
其次我巩固了上学期所学的一些单片机知识,从而加深了对ADC0809芯片的功能的了解。
在编程过程中,遇到了许多困难,通过与同学之间的交流和咨询,最后解决了这些困难。
所谓实践出真知,学到的东西只有运用到实践当中,才能真正体会到知识的力量。
最后,通过这次课程设计,让我明白了想法和实践还是有差距的,当你真正去做一件事的时候,你会发现你的想法可能不适用,随时都需要调整,另外扎实的理论知识也是完成设计任何设计必不可少的要素,一切想法离开了理论知识都是空想。
参考文献[1]彭为,黄科,雷道仲.单片机典型系统设计实例精讲[M].电子工业出版社.2009:22-54.[2] 谭浩强.C程序设计(第三版)[M].清华大学出版社.2009:32-46.[3] 王思明,张金敏,张鑫等.单片机原理及应用系统设计(第一版)[M].科学出版社.2012:70-292.附录A源程序代码#include<reg52.h>#include<intrins.h>#define uchar unsigned charsbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit EOC=P3^1;sbit OE=P3^0;sbit ST=P3^2;sbit p34=P3^4;sbit p35=P3^5;sbit p36=P3^6;uchar code tab[]={0x40,0x79,0x24,0x30,0x19,0x12};uchar code led[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; uchar code led_[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(uchar n){uchar i,j;for(i=0;i<n;i++)for(j=0;j<125;j++);}void convert(uchar volt_data){unsigned int temp;temp=100*volt_data/51;P0=led[temp/100]; //个位上的数字显示p21=1; //选通个位delay(3); //延时p21=0; //不选通个位P0=led_[temp%100/10]; // 十分位的数字显示p22=1; //选通十分位delay(3); //延时p22=0; //不选通十分位P0=led_[temp%10]; //百分位的数字显示p23=1; //选通百分位delay(3); //延时p23=0; //不选通百分位}void main(){uchar volt_data;p34=1;p35=1;p36=0; //选通ADC0808的IN3通道while(1){ST=0;_nop_();ST=1;_nop_();ST=0; //开始转换if(EOC==0) //如果EOC为0,则继续转换delay(100);while(EOC==0); //当EOC为1时,转换完毕OE=1; //数据允许输出标志volt_data=P1; //讲P1口的数据送volt_dataOE=0;convert(volt_data);}}。
数字电压表的单片机设计(C语言编程)

目录一设计总体方案 (1)1.1 设计要求 (1)1.2 设计思路 (1)1.3 设计方案 (1)二硬件电路元件分析与设计 (2)2.1 单片机系统 (2)2.1.1 AT89C51性能 (2)2.1.2 AT89C51各引脚功能 (2)2.2 A/D转换模块 (3)2.2.1 ADC0808主要特性 (3)2.2.2 ADC0808工作流程 (4)2.3 LED显示系统设计 (5)2.3.1 LED显示器的选择 (5)2.3.2 LED译码方式 (5)2.4 双D正沿触发器 (6)2.5 总体电路设计 (6)三程序设计 (9)3.1 程序设计总方案 (9)3.2 系统子程序设计 (9)3.2.1 初始化程序 (9)3.2.2 A/D转换子程序 (9)3.2.3 显示子程序 (10)四仿真调试 (12)4.1 软件调试 (12)4.2 显示结果及误差分析 (12)4.2.1 显示结果 (12)4.2.2 误差分析 (13)结束 (15)参考文献 (16)附录 (17)一设计总体方案1.1 设计要求⑴以AT89C51单片机为核心器件,组成一个简单的直流数字电压表。
⑵能够测量0-5V之间的直流电压值。
⑶电压显示用4位一体的LED数码管显示,尽量使用较少的元器件。
1.2 设计思路⑴根据设计要求,选择AT89C51单片机为核心控制器件。
⑵A/D转换采用ADC0808实现,与单片机接口为P0口和P3口的高四位引脚。
⑶电压显示采用4位一体的LED数码管。
⑷LED数码的段码输入,由并行端口P1产生:位码输入,用并行端口P2高四位产生。
1.3 设计方案硬件电路设计由5个部分组成; A/D转换电路,AT89C51单片机系统,LED 显示系统、时钟电路、测量电压输入电路。
硬件电路设计框图如图1-1图1-1 数字电压表系统硬件设计框图二硬件电路元件分析与设计2.1 单片机系统2.1.1 AT89C51性能AT89C51功能性能:与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;全静态工作:0-24MHz;128*8B内部RAM;4个位可编程I/O口线;2个16位定时/计数器;5个中断源;2个串行通道;片内振荡器和掉电模式。
基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)

基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)主要部件:AT89S51 ADC0832 八段数码管关键字:ADC0832程序C语言数字电压表本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。
该芯片能将0~5V的模拟电压量转换为0说实在话,量程只有5V的电压表没有什么实际的意义,而且也没有人无聊到自己会去做一个没有意义的以后做真正有用的电路打下基础。
而且,对于那些做毕业设计的同学也是一种参考。
这也就是本文的意ADC0832的资料百度一下可以找到一大堆,我就不在这里赘述了。
这里只给出连接图。
以下是程序部分:该程序是本人自编的,经测试可用,但不保证程序的可靠性及稳定性。
若有转载请标明出处。
如果有同学将本程序烧写到单片机里却不能正常工作的,请注意以下三点:1、是否将端口重新定义。
每个单片机开发板的引脚连接都是不一样的,若不加修改直接把程序烧写到2、是否正确选择通道值。
ADC0832有两个模拟输入端口(也就是我说的通道),你要先弄清楚你用的是默认使用0通道,如果0通道不行就改成1通道,反正不是0通道就是1通道。
3、如果你做的电压表在保证电路连接正确且没有以上两点问题的情况下,还是不能正常工作,请将程问题。
我有两个单片机开发板,其中一个必须要把那一行删掉才能工作。
这说明ADC0832读出的前8位与理。
我不知道到底是硬件还是软件出了问题,特此把这种现象标明。
若有哪位同学知道其原因的还请多/***********************************************************************************//*简易数字电压表制作——ADC0832模数转换应用程序(C语言版)*//*目标器件:AT89S51/*晶振:12.000MHZ/*编译环境:Keil uVision2 V2.12/***********************************************************************************//*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^4;sbit DATI = P3^3;sbit DATO = P3^3;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/**************************************************************************** 函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/ unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。
基于单片机的数字电压表的设计与制作1

基于单片机的数字电压表的设计与制作【摘要】随着我国现代化技术建设的发展,电子检测技术日新月异,本设计基于STC89C52单片机的一种电压测量电路,该电路采用ADC0832A/D转换元件,实现数字电压表的硬件电路与软件设计。
该系统的数字电压表电路简单, 可以测量0~5V的电压值,并在四位LED数码管上显示电压值。
所用的元件较少,成本低,调节工作可实现自动化。
关键词:数字电压表;ADC0832;STC89C52Abstract: Along with the development of our country's modern technology, electronic measuring technology is changing with each passing day, this design is based on the STC89C52 microcontroller, a voltage measurement circuit, the circuit uses the ADC0832A/D conversion element, the hardware circuit and software design of digital voltage meter. The system of the digital voltmeter circuit is simple, can measure the voltage of 0 ~ 5V, and in four LED digital tube display voltage value. The components used are less, the cost is low, and the adjustment can be realized automatically Key words: digital voltmeter; ADC0832; STC89C52目录1 绪论 (1)1.1课题背景 (1)1.2发展方向 (1)1.3课题的目的和意义 (2)1.4本设计完成的工作 (2)2 总体方案设计 (4)2.1硬件设计 (4)2.1.1电源模块 (4)2.1.2 主控制器模块 (4)3 硬件实现及单元电路设计 (5)3.1主控制模块 (5)3.1.1 单片机的时钟电路与复位电路设计 (5)3.1.2 单片机STC89C52及特点概述 (6)3.1.3 振荡器特性 (8)3.1.4 芯片擦除 (8)3.1.5 结构特点 (8)3.2单片机管脚说明 (9)3.3模数转换模块设计 (10)3.3.1 ADC性能参数 (11)3.3.2 ADC静态特性 (11)3.3.3 ADC动态特性 (11)3.3.4 ADC性能测试 (12)3.3.5常用ADC芯片概述 (12)3.3.6 ADC0832模数转换原理及主要技术指标 (12)3.3.7 ADC0832与单片机的接口电路 (13)3.4ADC0832元件说明 (13)3.5数码管显示电路设计 (15)3.6电源设计 (16)3.7整机电路原理图 (16)4系统软件设计方案 (18)4.1系统子程序设计 (18)5 系统的安装与调试 (20)结束语 (20)谢辞 (22)参考文献 (24)1 绪论1.1 课题背景随着我国现代化建设的发展,电子检测产品日新月异,特别是单片机的出现,正在引起测量控制仪表领域的新的技术革命。
基于单片机的简易数字电压表的设计

基于单片机的简易数字电压表设计作者姓名:专业班级:指导教师:摘要随着电子科学技术的日益发展,电子测量也变得越来越普遍,并且对测量的功能要求也越来越高,所以数字电压表就成为一种不可或缺的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成数字量并加以显示。
与传统的模拟式电压表相比,具有显示清晰直观,读数准确,测量范围广,扩展能力强等优点。
与传统的以指针刻度盘进行读数相比,避免了读数的视差以及视觉疲劳,非常的直观,方便。
本文介绍了一种基于单片机的简易数字电压表的设计。
该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0808芯片工作。
该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过一个四位一体的7段数码管显示出来。
关键词:数字电压表 A/D转换 AT89C51 ADC0808成都理工大学2013届本科毕业设计(论文)2Design of Simple Digital Voltmeter Based on Single-chip MicrocontrollerAbstract:With the increasing development of science and technology, electronics, electronic measurements are also becoming more common, and the measurement of the functional requirements are also increasing, so the digital voltmeter has become an indispensable measuring instruments. Digital voltmeter referred DVM, it is the use of digital measurement technique, the continuous analog to digital conversion and display. With traditional analog voltmeter, compared with a clear display and intuitive, accurate readings, wide measurement range, scalability and other advantages. With the traditional dial for reading the pointer compared avoid parallax reading and visual fatigue, very intuitive and convenient.This paper which introduces a kind of simple digital voltmeter is based on single-chip microcontroller design. The circuit of the voltage meter is mainly consisted of three mould pieces: A/D converting mould piece, A/D converting is mainly completed by the ADC0808, it converts the collected analog data into the digital data and transmits the outcome to the manifestation controlling mould piece. Data processing is mainly completed by the AT89C51 chip, it processes the data produced by the ADC0808 chip and generates the right manifestation codes, also transmits the codes to the manifestation controlling mould piece. Also, the AT89C51 chip controls the ADC0808 chip to work.The voltmeter features in simple electrical circuit, lower use of elements, low cost, moreover, its measuring precision and reliability. The voltmeter is capable of measuring voltage inputs from 1 route ranging from 0 to 5 volt, and displaying the measurements though a digital code tube of 7 pieces of LED.Keywords:Digitalvoltmeter A/Dconverter AT89C51 ADC0808成都理工大学2013届本科毕业设计(论文)2目录第1章前言 (1)1.1研究背景及意义 (1)1.1国内外数字电压表的发展及现状 (1)1.2本研究课题的来源及主要研究内容,研究成果 (2)第2章总体设计方案 (3)2.1数字电压表设计的两种方案 (3)2.1.1由数字电路及芯片构建 (3)2.1.2由单片机系统及A/D转换芯片构建 (3)2.2设计要求 (4)2.3 设计思路 (4)2.4 设计方案 (4)第3章硬件电路设计 (6)3.1 A/D转换器选择 (6)3.1.3 ADC0808的外部引脚特征 (7)3.1.4 ADC0808的内部结构及工作流程 (8)3.2 单片机系统 (10)3.2.1 单片机的选择 (10)3.2.2 AT89C51各引脚功能 (10)3.3 复位电路和时钟电路 (13)3.3.1 复位电路设计 (13)3.3.2 时钟电路设计 (13)3.4 LED显示系统设计 (14)3.4.1 LED基本结构 (14)3.4.2 LED显示器的选择 (15)3.4.3 LED译码方式 (15)3.4.4 LED显示器与单片机接口设计 (16)3.5 总体电路设计 (17)第4章程序设计 (19)4.1 程序设计总方案 (19)4.2 系统子程序设计 (19)4.2.1 初始化程序 (19)4.2.2 A/D转换子程序 (20)4.2.3 显示子程序 (20)第5章系统仿真及测试 (22)5.1 软件调试 (22)5.2 测试结果及误差分析 (22)5.2.1 测试结果 (22)5.2.2 误差分析 (24)5.3 硬件测试 (25)5.3.1 排除电源故障 (25)5.3.2 排除元器件失效 (26)5.3.3 排除逻辑连接故障 (26)结论 (27)致谢 (28)参考文献 (29)2第1章前言1.1研究背景及意义在现代测量技术中,常常需要用数字电压表进行现场检测,将测量的数据送入微计算机系统中,完成计算、存储、控制和显示等功能。
单片机数字电压表(带仿真图C程序)

基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很多种,有的采用ADC0809,或者ADC0808等,他们都是8温AD,并口传输数据,具有速率高的优点。
但是硬件复杂,与单片机电路繁琐,焊接起来比较麻烦。
所以本设计采用ADC0832,同样8位AD,特点是串口传输数据,硬件接口简单,且精度误差一致,速率也比较快,对于要求不高的系统非常适合。
2.显示电路,网上采用LED显示居多,本设计采用LCD1602液晶显示,具有硬件搭设简单,显示美观等优点3.本设计方便移植,只需将LCD1602三个控制端口,ADC0832 四个控制端口修改即可。
注意LCD1602数据传输接口是单片机的P0口,如下图,需要接上拉电阻4.程序采用C代码编写,亲测直接可以使用,若需仿真文件,请用E-mail联系邮系。
邮箱:gnsywb@5.网上很多设计数据转换程序有误,不够正确。
在转换过程中,中间变量需设置为int 类型,虽然8位AD输出最高位255,但是余数转换过程中会大于255。
若设计char型,会造成显示输出有误。
void convert(uchar a){ uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10; dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10; dis[2]=temp/51; //取小数点后第二位}具体电路图如下:1.利用电压表与测量显示电压对比附录:C程序/******************************************** 功能:单片机数字电压表ADC0832+LCD16021,测量范围0-5V2,2路输入电压,可自行设定3,测量精度误差0.01V,LCD液晶显示编写者:小子在西藏gnsywb@编写日期:2012-11-5*********************************************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6; //1602控制端口sbit DI=P3^4;sbit DO=P3^4; //DI和DO与单片机共接口sbit Clk=P3^3;sbit CS=P3^5;//ADC0832控制端口uchar dis[3]={0x00,0x00,0x00}; //显示缓冲区uchar date=0; //AD值uchar CH; //ADC0832通道值/*****************************************AD0832转换程序******************************************/uchar ADC0832(uchar CH){uchar i,dis0,dis1;Clk=0; //拉低时钟DI=1; //初始化_nop_();CS=0; //芯片选定_nop_();Clk=1; //拉高时钟_nop_();if(CH==0) //通道选择{Clk=0; //第一次拉低时钟DI=1; //通道0的第一位_nop_();Clk=1; //拉高时钟_nop_();Clk=0; //第二次拉低时钟,ADC0832 DI接受数据DI=0; //通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DI=1; //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DI=1; //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0; //第三次拉低时钟,此前DI两次赋值决定通道DI=1; //DI开始失效,拉高电平,便于DO数据传输for(i= 0;i<8;i++) //读取前8位的值{_nop_();dis0<<= 1;Clk=1;_nop_();Clk=0;if (DO)dis0|=0x01;elsedis0|=0x00;}for (i=0;i<8;i++) //读取后8位的值{dis1>>= 1;if (DO)dis1|= 0x80;elsedis1|= 0x00;_nop_();Clk=1;_nop_();Clk=0;}if(dis0==dis1) //两次结束数据比较,若相等date=dis0; //则赋值给dat_nop_();CS=1; //释放ADC0832DO=1; //拉高输出端,方便下次通道选择DI端有效Clk=1; //拉高时钟return date;}/***********************************************数据转换程序功能:将0-255级换算成0.00-5.00的电压数***********************************************/void convert(uchar a){uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10;dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10;dis[2]=temp/51; //取小数点后第二位}/***************************************** LCD1602驱动程序******************************************/ void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=122;y>0;y--);}void write_cmd(uchar cmd)//lcd1602写命令函数{lcdrs=0;lcdrw=0; //选择指令寄存器lcden=1;P0=cmd; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void write_date(uchar date)//lcd1602写数据函数{lcdrs=1;lcdrw=0; //选择数据寄存器lcden=1;P0=date; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void init_lcd1602()//lcd1602初始化{write_cmd(0x01); //清屏write_cmd(0x38); //功能设置write_cmd(0x0c); //显示设置write_cmd(0x06); //输入方式从左到右delay(1);}/***************************************** 显示函数*****************************************/ void display(void){uchar i;write_cmd(0x80);for(i=0;i<3;i++){if(i==1) write_date('.'); //第二位显示小数点write_date (0x30+dis[i]);delay(5);}write_date('V'); //最后一位后显示字符'V'}/************************************************ 主函数***************************************************/ void main(void){CH=0; //选择通道0或1init_lcd1602();//液晶1602显示初始化while(1) //主循环{date=ADC0832(CH);//启动ADC0832转换并接受数据delay(1);convert(date); //数据转换成BCD码display(); //显示数值}}。
基于单片机的数字电压表设计

基于单片机的数字电压表设计摘要:随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。
另外,准确可靠的电压测量在教学实验中也具有重要意义。
数字电压表是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
而传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由于精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片机及A/D转换器构成的数字电压表成本较低,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,表现出强大的生命力。
本次设计就是为了更好地掌握单片机及相关的电子技术,在参阅一些资料的基础上利用ADC0809而设计的数字电压表。
关键词:单片机,ADC0809,数字电压,A/D转换一.设计目的与功能要求§1.1 设计目的利用单片机及ADC0809核心元件制作3位数字电压表,更好地学习掌握ADC0809的工作原理及A/D的转换编程方法。
§1.2功能要求利用ADC0809设计实现数字电压表的测量值为0~5V,用电位器模拟ADC0809的输入电压,用3位数码管显示,实时模拟数字电压表。
二.总体设计§2.1系统设计主要分为两部分:硬件电路及软件程序。
硬件电路包括:单片机及外围电路,模拟信号采集电路,A/D转换电路,数码管显示电路,各部分电路的衔接。
软件的程序可采用C语言或汇编,这里采用汇编语言,详细的设计思路在后面介绍。
§2.2设计方案数字电压表的设计方案很多,但采用集成电路来设计较流行。
其设计主要是由模拟电路和数字电路两大部分组成,模拟部分包括A/D 转换器,基准电源等;数字部分包括振荡器,数码显示,计数器等。
其中,A/D转换器将输入的模拟量转换成数字量,它是数字电压表的一个核心部件,对它的选择一般有两种选择方案:1.采用双积分A/D转换器MC14433,它有多路调制的BCD码输出端和超量程输出端,采用动态扫描显示,便于实现自动控制。
基于单片机的数字电压表.

1 前言 (1)2 总体方案设计 (2)2.1 方案论证 (2)2.2 方案比较及选择 (3)3 硬件电路设计 (4)3.1 AD转换电路 (4)3.2 复位电路 (4)3.3 时钟电路 (5)3.4 显示电路 (6)3.5 特殊器件介绍 (6)3.5.1 主控芯片AT89S51 (6)3.5.2 ADC0808 (7)3.5.3 LED (9)4 软件部分设计 (11)4.1 A/D转换子程序 (11)4.2 显示子程序 (12)5 电路仿真 (13)5.1 软件调试 (13)5.2 显示结果及误差分析 (13)6 系统功能 (17)小结 (18)参考文献 (19)附录1 基于单片机的数字电压表原理图 (20)附录2 基于单片机的数字电压表程序清单 (21)1 前言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)主要部件:AT89S51 ADC0832 八段数码管关键字:ADC0832程序C语言数字电压表本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。
该芯片能将0~5V的模拟电压量转换为0~255级的数字量,所以本文描述的数字电压表的量程为0~5V。
以下是程序部分:该程序是本人自编的,经测试可用,但不保证程序的可靠性及稳定性。
若有转载请标明出处。
如果有同学将本程序烧写到单片机里却不能正常工作的,请注意以下三点:1、是否将端口重新定义。
每个单片机开发板的引脚连接都是不一样的,若不加修改直接把程序烧写到单片机里,那是绝对不能正常工作的。
2、是否正确选择通道值。
ADC0832有两个模拟输入端口(也就是我说的通道),你要先弄清楚你用的是那个通道,并在main函数中设置相应的通道值(以CH命名的那个变量)。
本程序默认使用0通道,如果0通道不行就改成1通道,反正不是0通道就是1通道。
3、如果你做的电压表在保证电路连接正确且没有以上两点问题的情况下,还是不能正常工作,请将程序中的“if (adval == test)”这一行删掉。
其实这一点我个人也不清楚到底有没有问题。
我有两个单片机开发板,其中一个必须要把那一行删掉才能工作。
这说明ADC0832读出的前8位与后8位数值不一样(确切的说应该是后8位反转的数值),这有悖于ADC0832的原理。
我不知道到底是硬件还是软件出了问题,特此把这种现象标明。
若有哪位同学知道其原因的还请多多指教。
/***********************************************************************************//*简易数字电压表制作——ADC0832模数转换应用程序(C语言版)*//*目标器件:AT89S51 *//*晶振:12.000MHZ *//*编译环境:Keil uVision2 V2.12 *//***********************************************************************************//*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^4;sbit DATI = P3^3;sbit DATO = P3^3;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /**************************************************************************** 函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/ unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}elseClk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值 {test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;if (adval == test) //比较前8位与后8位的值,如果不相同舍去。
若一直出现显示为零,请将该行去掉dat = test;_nop_();CS = 1; //释放ADC0832DATO = 1;Clk = 1;return dat;}/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/void delay(void){int k;for(k=0;k<500;k++);}/****************************************************************************函数功能:将0-255级换算成0.00-5.00的电压数值入口参数:i出口参数:****************************************************************************/void convdata(unsigned char i){dis[0] = i/51; //个位dis[1] = (i%51)*10/51; //小数点后第一位dis[2] = ((i%51)*10%51)*10/51; //小数点后第二位}/****************************************************************************函数功能:数码管显示子程序入口参数:出口参数:****************************************************************************/void display(void){P2=0xff;P0=tab[dis[0]] & 0x7f; //显示个位和小数点P2=0xfe;delay();P2=0xff;P0=tab[dis[1]]; //显示小数点后第一位P2=0xfd;delay();P2=0xff;P0=tab[dis[2]]; //显示小数点后第二位P2=0xfb;delay();}/****************************************************************************函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定入口参数:出口参数:****************************************************************************/void timer0(void) interrupt 1{TMOD = 0x01;TH0 = 0x00;TL0 = 0x00;IE = 0x82;TR0 = 01;count++;if (count == 0x0A){count = 0x00;dat = adc0832(CH);}}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){P2=0xff; //端口初始化P0=0xff;CH = 0x00; //在这里选择通道 0x00或0x01TMOD = 0x01; //设置中断TH0 = 0x00;TL0 = 0x00;IE = 0x82;TR0 = 01;while(1) //主循环{convdata(dat); //数据转换display(); //显示数值 }}。