基于单片机的数字电压表制作——(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语言编程)

数字电压表的单片机设计(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语言)

基于单片机的数字电压表制作——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

基于单片机的数字电压表的设计与制作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程序)

单片机数字电压表(带仿真图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)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。

基于单片机的数字电压表的设计_毕业论文设计

基于单片机的数字电压表的设计_毕业论文设计

毕业论文基于单片机的数字电压表的设计摘要本设计主要研究的是以AT89C51单片机为核心的电压测量系统,该系统能够在单片机的控制下完成对电压信号采集,能够根据采样值进行量程自动转换,并且测量结果可通过四个数码管显示出来。

整个系统的设计完成了硬件电路的设计及软件程序的编写,通过最终硬件电路的调试及软件程序的仿真,使该系统能够在要求的条件下达到正常的测量及显示功能。

在整个系统的设计过程中,主要采用了模块化的设计方法。

关键词:AT89C51单片机;数字电压表;模块化Design of the digital voltmeter based on the MCUAbstractThis paper introduces an achievement of a voltage measure system based on the AT89C51 MCU. This system can accomplish the signal sampling of voltage, and change range automatically according to the signal sampled. The result can be displayed through numeral rube of four places.In this design, the hardware circuit and software programming are both realized at the judge of hardware circuit and imitation of software program. This system can fulfill the function of measure and displaying under the demanded conditions.Over the designing of the whole system, the method of modularity is used. Key words: AT89C51 MCU; Digital Voltmeter; Modularity目录绪论 (1)第一篇硬件部分的设计 (1)1.数据采集部分的设计 (2)1.1 交流信号和直流信号的采样 (2)2.量程自动转换电路的设计 (4)3.模数转换单元的设计 (5)4.控制电路的设计 (7)4.1总体概况 (7)一.主要功能 (7)二.内部结构框图 (8)三.外部引脚说明 (9)4.2 单片机在系统中的应用 (11)5.显示部分的设计 (12)5.1键盘显示8279芯片 (12)5.2 8279的组成和基本工作原理 (13)5.3 8279引脚及功能 (15)5.4 8279的工作方式及命令字格式 (17)第二篇软件系统的设计 (23)1.MCS-51单片机汇编语言 (23)2.主程序的设计 (23)3.子程序的设计 (25)3.1采样程序的设计 (25)3.2 量程处理程序的设计 (26)3.21 采样及其处理程序 (26)3.22 计算部分的设计 (28)3.23 显示部分的软件设计 (29)3.3 超量程处理 (29)4.系统程序清单 (29)设计总结 (41)参考文献 (41)绪论在电气测量中,电压是一个很重要的参数。

《单片机应用技术(C语言)》实训课件—7.1 简易数字电压表设计

《单片机应用技术(C语言)》实训课件—7.1 简易数字电压表设计

}
开始 变量声明 初始化 ADC
读取 AD 转换 数据处理 数据显示
//函数名: ADC_STC12C5
//函数功能:取AD结果函数
//形式参数:第ch路通路
//返回值:A/D转换结果0~255
unsigned char ADC_STC12C5(unsigned char ch)
{
ADC_RES = 0;
三、数字电压表控制程序设计
//声明与ADC 有关的特殊功能寄存器
sfr P1_ASF = 0x9D; //A/D转换模拟功能控制寄存器
sfr ADC_CONTR = 0xBC; //A/D转换控制寄存器
sfr ADC_RES = 0xBD;
//A/D转换结果寄存器
sfr ADC_RESL = 0xBE;
//形式参数:输入数据
//返回值:无,实际电压值分离后存放在全局数组disp[]中
void data_process(unsigned char value)
{ unsigned int temp;
为什么?
temp = value *196;
//0~255转换为0~50000
disp[3]=temp/10000;
模拟信号输入
硬 件 电 路 图
三极管8050起到 开关作用,并为 每个数码管提供 必要的驱动电流。
数字信号显示
0 5 4 0 Q8 5 + vcc 6 0 5 3 0 Q8 vcc 8 0 DISPLAY 5 2 0 Q8 vcc 9 0 5 1 0 Q8 vcc 1 2 P fgedcDba 512437 01 11 6543210 11111119 0 0 1 1 R 1K×4 12345678 V 5 + 09098765432123456781 42333333333222222223 C A N E E C ALE S P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7 V P STC12C5A60S2 D N12 GRSTXXP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7 912345678 09801234567 21111111111 12MHz VV FF 55 pp 32 ++ K 22 P F CC 0 22 K 2 R u 1 1 0 2 R 1C 2

单片机数字电压表设计c语言程序

单片机数字电压表设计c语言程序

单片机数字电压表设计c语言程序
本文将介绍如何使用C语言编写单片机数字电压表的程序。

首先,需要了解单片机的基本原理和电路连接方式。

单片机是一种小型的计算机芯片,可以用来控制各种电子设备。

在电压表中,我们需要将单片机连接到电压传感器和显示器上。

电压传感器将测量的电压信号转换为数字信号,然后传输给单片机。

单片机将这个数字信号转换为显示器上的数字。

为了实现这个功能,我们需要编写一些基本的C语言程序。

首先,我们需要初始化单片机的IO口,以便将其连接到电压传
感器和显示器上。

然后,我们需要配置单片机的ADC模块,以便可以读取电压传感器产生的模拟信号。

一旦我们读取了这个模拟信号,我们需要将其转换为数字信号,并将其保存在单片机的内存中。

然后,我们需要将这个数字信号转换为适合显示器的格式,并在显示器上显示出来。

这些都是单片机数字电压表程序的基本步骤。

当然,实际编码过程中可能会涉及到更多的细节和技巧。

但是,只要我们掌握了基本的编程原理和方法,我们就可以轻松地编写出高效、稳定的单片机数字电压表程序。

- 1 -。

基于单片机的数字电压表设计

基于单片机的数字电压表设计

基于单片机的数字电压表设计在当今的电子世界里,电压的准确测量已成为各种电路设计和应用的关键部分。

为了满足这一需求,数字电压表应运而生。

本文将详细阐述如何利用单片机设计数字电压表。

在了解数字电压表之前,我们首先需要理解什么是单片机。

单片机是一种微型计算机芯片,它集成了CPU、内存、I/O接口等必要组件,具有体积小、功耗低、价格实惠等优点。

因此,利用单片机来设计数字电压表是十分理想的选择。

数字电压表是一种能够将模拟电压信号转换为数字信号并加以处理的仪器。

它的优点包括测量准确、分辨率高、稳定性好等。

数字电压表的种类繁多,根据应用场景的不同,可以选择不同的设计方案。

在进行数字电压表设计时,我们需要以下几个方面:电压传感器的选择:根据实际应用场景选择合适的电压传感器,例如电压互感器、霍尔电压传感器等。

A/D转换器的选择:A/D转换器是将模拟信号转换为数字信号的关键部件。

在选择时,我们需要考虑其分辨率、转换速率、功耗等参数。

单片机的选择:根据项目需求选择合适的单片机型号,确保其具有足够的资源来处理数字信号。

人机界面的设计:为了便于用户操作和观察,我们还需要设计一个简单易用的人机界面。

在具体实施时,我们需要将电压传感器与A/D转换器连接,并将A/D 转换器的输出端连接到单片机的I/O端口。

然后,我们可以通过编写单片机程序,实现对数字信号的处理、存储和显示。

数字电压表在各种电路设计中都有着广泛的应用,例如电源电路、电机控制电路、模拟电路等。

通过数字电压表,我们可以轻松地监测电路中的电压波动,以便及时进行调整和故障排查。

数字电压表还可以用于科研、教育、生产等领域,为人们提供准确可靠的电压测量数据。

基于单片机的数字电压表设计是一项实用且具有挑战性的任务。

通过掌握数字电压表的基本原理和单片机的应用方法,我们可以实现准确、稳定的电压测量,从而为各种电路设计和应用提供有力的支持。

在未来的电子世界中,数字电压表将继续发挥其重要作用,推动电路技术的发展和创新。

基于单片机的电压表设计

基于单片机的电压表设计

基于单片机的电压表设计目录1 引言 (2)2设计原理及要求 (1)2.1数字电压表的实现原理 (1)2.2数字电压表的设计指标............... 错误!未定义书签。

3软件仿真电路设计. (2)3.1设计思路 (2)3.2硬件电路设计图 (2)3.3 AT89C51的功能介绍 (3)3.3.1简单概述 (3)3.3.2主要功能特性 (3)3.3.3 AT89C51的引脚介绍 (4)3.4 ADC0804的引脚及功能介绍 (6)3.4.1芯片概述 (6)3.4.2 引脚简介 (7)3.4.3 ADC0804的转换原理 (8)3.5 74HC373芯片的引脚及功能 (8)3.5.1芯片概述 (8)3.5.2引脚介绍 (10)3.6 LED数码管的控制显示 (10)4系统软件程序的设计 (11)5测试及性能分析 ......................... 错误!未定义书签。

5.1 测试............................. 错误!未定义书签。

55.2 性能分析.......................... 错误!未定义书签。

6 设计总结 (17)参考文献 (17)附录原理电路............................ 错误!未定义书签。

1 引言随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。

数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。

与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。

本设计重点介绍单片机、A/D 转换器以及由它们构成的数字电压表的工作原理。

基于单片机的数字电压表设计c语言

基于单片机的数字电压表设计c语言

#include<reg52.h>#include<intrins.h>sbit st=P2^4;sbit eoc=P3^7;sbit oe=P2^5;sbit ale=P2^3;sbit key1=P3^6;sbit key2=P3^5;unsigned charseg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char seg_ale[]={0xf8,0xf9,0xfa,0xfb};unsigned char num[4];/************延时函数**********************/void delay_us(unsigned int delayus){while(delayus--);}void delay_ms(unsigned int delaytime){unsigned int i;unsigned char j;for(i=0;i<delaytime;i++)for(j=0;j<110;j++);}/********************************************//************ADC转换函数*********************/void adc_convert(void){double temp1;unsigned int temp2,temp3;st=0;_nop_();st=1;_nop_();st=0;oe=0;while(eoc==0);oe=1;_nop_();temp1=P0;_nop_();temp1*=492; //基准电压 4.9 Vtemp1/=255;temp2=(unsigned int)temp1%1000;num[2]=(unsigned char)(temp2/100);temp3=(unsigned int)temp2%100;num[1]=(unsigned char)(temp3/10);num[0]=temp3%10;delay_us(1);oe=0;}/*******************************************//**************显示函数*********************/ void dis(void){unsigned char i,b;b=0x01;for(i=0;i<4;i++){if(i==2)P1=seg_code[num[i]]&0x7f;else if(i==3)P1=seg_code[num[i]]&0x7f;elseP1=seg_code[num[i]];P3=~b;b<<=1;delay_ms(5);}}/*******************************************//****************主函数*********************/void main(void){unsigned char i,automatic;unsigned char keynum;int j;for(i=0;i<4;i++)num[i]=0;keynum=0;for(;;){/**************按键扫描******************************/ if(key1==0){delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();if(key1==0){if(keynum<3)keynum++;elsekeynum=0;}}if(key2==0) //自动加按键{delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();if(key2==0){if(automatic==0)automatic=1;elseautomatic=0;}}/***********************************************//****************开启四通道自动切换*************/ if(automatic==1){if(keynum<3){ale=1;_nop_();P2=seg_ale[keynum];num[3]=keynum;_nop_();ale=0;adc_convert();delay_ms(1);for(j=0;j<50;j++){dis();delay_ms(10);if(key2==0){delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();delay_ms(1);dis();if(key2==0)break;}}keynum++;}else{ale=1;_nop_();P2=seg_ale[keynum];num[3]=keynum;_nop_();ale=0;adc_convert();delay_ms(1);for(j=0;j<50;j++){dis();delay_ms(10);}keynum=0;}}/****************手动通道切换***********************/ ale=1;_nop_();P2=seg_ale[keynum];num[3]=keynum;_nop_();ale=0;adc_convert();delay_ms(1);dis();delay_ms(6);}}。

毕业设计——基于单片机的数字电压表的设计

毕业设计——基于单片机的数字电压表的设计

基于单片机的数字电压表的设计【摘要】本设计主要用于测量0-5V的直流电压,把连续的模拟量(直流输入电压)转换成离散的数字形式,并利用数码管进行显示。

整个系统主要由控制电路、基准电源、A/D 转换电路、测试电路和显示电路等几部分组成。

通过AT89C52单片机实现系统控制功能,利用单片机的P1口、P3.0-P3.3口控制4位LED数码管实现动态显示,P3.5端口用作控制单路/循环显示转换按钮,P3.6端口用作单路显示时的通道选择,P0端口用作A/D转换数据读入,P2端口用作ADC0809的A/D转换控制,A/D转换电路主要由ADC0809模/数转器件片完成。

此外,设计的数字电压表在实现单路测量的基本功能之外,还可以方便进行多路电压的同时测量,通过按键选择实现单一或多路循环显示。

【关键词】:AT89C52、ADC0809、A/D转换、数据处理、控制显示ABSTRACTThe design is mainly used for measuring 0-5V DC voltage, the continuous analog (DC input voltage) into a discrete digital form, and the use of digital control to display. The entire circuit is mainly by the control circuit, reference power, A / D converter circuit, the test circuit and display circuit composed of several parts.AT89C52 MCU through the system control functions, the use of the microcontroller port P1, P3.0-P3.3 Port 4-bit LED digital control of dynamic display, P3.5 port as a single display / cycle through the Convert button, P3.6 displayed as a single port channel selection, P0 port for A / D converter data read, P2 port for the ADC0809 A / D conversion control; A / D converter circuit mainly by the ADC0809 analog / digital switch device to complete piece.In addition, the design of the digital voltmeter single measurement in the realization of the basic functions, it can also facilitate the simultaneous measurement of multiple voltage by selection for a single or multiple buttons to cycle.【KEY WORD】: AT89C52, ADC0809, A / D conversion, data processing, control and display目录引言 (1)一、方案论证 (1)(一)控制芯片 (1)(二)显示部分 (2)二、总体设计思想 (2)三、硬件电路的设计 (2)(一)硬件设计原理 (2)(二)AT89C52单片机的概述 (3)1.AT89C52单片机组成 (3)2.AT89C52单片机引脚结构 (4)3.AT89C52单片机的最小系统 (5)(1)时钟电路 (5)(2)复位电路 (6)(三)A/D转换电路 (6)1.A/D转换器工作过程 (6)2.A/D转换电路 (8)(四)数码显示电路 (9)四、系统的程序设计 (10)(一)软件设计思想框图 (10)(二)子程序原理和框图 (11)1.显示子程序 (11)2.A/D转换子程序 (12)五、调试及性能分析 (14)(一)测量与调试 (14)(二)性能分析 (14)六、总结 (16)附录一数字电压表总原理图 (17)附录二源程序 (18)附录三PCB图 (23)附录四实物图 (24)参考文献 (25)致谢 (26)引言数字电压表(Digital Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成离散的数字形式并加以显示的仪表。

基于单片机的数字电压表设计

基于单片机的数字电压表设计

基于单片机的数字电压表设计在当今的电子世界中,电压表是一种必不可少的测量工具。

随着技术的进步,数字电压表因其精度高、易于读取、稳定性好等优点逐渐取代了传统的模拟电压表。

本文将探讨如何基于单片机设计数字电压表。

一、硬件设计1、1传感器模块传感器模块是数字电压表的重要组成部分,负责将输入的模拟电压转化为可被单片机处理的数字信号。

通常,我们使用ADC(模数转换器)来实现这一功能。

ADC的精度直接决定了电压表的测量精度。

1、2单片机模块单片机是数字电压表的“大脑”,负责控制整个系统的运行。

我们选择具有较高性能和可靠性的单片机,如Arduino、STM32等。

这些单片机都具有丰富的外设接口,便于实现复杂的控制逻辑。

1、3显示模块显示模块负责将单片机的处理结果呈现给用户。

常用的显示模块包括LED数码管、LCD液晶屏等。

选择适合的显示模块,可以大大提升电压表的易用性。

二、软件设计2、1数据采集与处理软件首先通过ADC从传感器模块读取模拟电压,然后对其进行处理,得到实际的电压值。

这一步的关键在于选择合适的ADC算法和设置合适的参考电压。

2、2数据输出与存储处理后的电压值需要被输出并存储起来。

通常,我们使用LCD液晶屏将电压值实时显示出来,同时也可以通过串口将数据传输到计算机或云端进行存储和分析。

三、精度与稳定性优化3、1硬件校准为了提高电压表的测量精度,我们可以在生产过程中对每一块电压表进行硬件校准。

通过调整ADC的参考电压或者在软件中进行校准算法的优化,可以有效提高电压表的测量精度。

3、2软件滤波在实际应用中,由于各种噪声和干扰的存在,电压表的读数可能会出现波动。

我们可以通过软件滤波算法,如平均滤波、卡尔曼滤波等,来减小这些干扰对测量结果的影响。

四、应用与扩展基于单片机的数字电压表不仅可以在实验室或工业现场使用,还可以扩展出更多的应用场景。

例如,通过加入无线通信模块,我们可以实现远程监控;通过加入更多的传感器,我们可以实现多通道的电压测量;通过与计算机或云端进行数据交互,我们可以实现大数据分析和预测。

单片机数字电压表设计LED显示含C源代码

单片机数字电压表设计LED显示含C源代码

1. 绪论............................... 错误!未定义书签。

1.1 课程设计规定...................... 错误!未定义书签。

1.2 数字电压表简介.................... 错误!未定义书签。

2. 硬件单元电路设计................... 错误!未定义书签。

2.1数字电压表构造框图................. 错误!未定义书签。

2.1.1 AT89C51单片机简介............ 错误!未定义书签。

2.1.2 ADC0832转换器简介............ 错误!未定义书签。

2.1.3 时钟电路..................... 错误!未定义书签。

2.1.4 复位电路..................... 错误!未定义书签。

2.1.5 LED显示电路.................. 错误!未定义书签。

3. 软件单元电路设计................... 错误!未定义书签。

3.1 主程序流程图...................... 错误!未定义书签。

3.2显示子程序流程图................... 错误!未定义书签。

3.3 A/D转换子程序流程图............... 错误!未定义书签。

3.4 数据解决子程序流程图.............. 错误!未定义书签。

4. 数字电压表仿真设计图与实物图....... 错误!未定义书签。

4.1 仿真图............................ 错误!未定义书签。

4.2 器件清单.......................... 错误!未定义书签。

4.3 硬件电路实物图.................... 错误!未定义书签。

5. 程序代码.............................. 错误!未定义书签。

基于单片机的数字电压表设计

基于单片机的数字电压表设计

以51单片机为核心,8位精度模数转换器ADC0804捕捉到电压模拟信号转换成数字信号传给单片机分析,使用lcd1602为显示核心。

(附带原理图集c语言代码)#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar r8,r7,r6,r5,r4,r3,r2,r1;uint shi,ge,xs,xss,temp,volt,num;uchar Vref=5; //基准电压(注意:电压越大精度愈低)uchar code table[]=" It's Amazing!"; uchar code table1[]=" V olt: . V";uchar code table2[]="0123456789" ;sbit s1=P2^0;sbit s2=P2^1;sbit s3=P2^2;sbit s4=P2^3;sbit s5=P2^4;sbit s6=P2^5;sbit s7=P2^6;sbit s8=P2^7;sbit lcden=P3^4;sbit lcdrs=P3^5;sbit lcdrw=P3^6;sbit wr=P3^1;sbit rd=P3^2;sbit cs=P3^0;void delay(uchar x){uchar y,z;for(y=110;y>0;y--)for(z=x;z>0;z--);}void write_com(uchar com) //lcd写控制命令与时序{lcdrs=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //lcd写数据命令与时序{lcdrs=1;lcdrw=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init() //lcd初始化{cs=0; //片选选中AD转化器lcden=0;write_com(0x38);write_com(0x0e);write_com(0x0c); //不显示光标write_com(0x01);write_com(0x80+0x10);}void chuzhi(){if(s8==1) r8=1;else r8=0;if(s7==1) r7=1;else r7=0;if(s6==1) r6=1;else r6=0;if(s5==1) r5=1;else r5=0;if(s4==1) r4=1;else r4=0;if(s3==1) r3=1;else r3=0;if(s2==1) r2=1;else r2=0;if(s1==1) r1=1;else r1=0;}void start() //开始转换{wr=1;wr=0;wr=1;}void display_init() //显示器固定不变的部分{write_com(0x80);for(num=0;num<16;num++){write_data(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table1[num]);delay(5);}}void jisuan() //计算电压值{volt=((r8*128+r7*64+r6*32+r5*16+r4*8 +r3*4+r2*2+r1*1)*0.00392156862745098039 21568627451)*Vref*100;}void display() //显示器动态部分{chuzhi();jisuan();shi=volt/1000;ge=(volt%1000)/100;xs=((volt%1000)%100)/10;xss=((volt%1000)%100)%10;write_com(0x80+0x40+7);write_data(table2[shi]);delay(5);write_com(0x80+0x40+8);write_data(table2[ge]);delay(5);write_com(0x80+0x40+10);write_data(table2[xs]);delay(5);write_com(0x80+0x40+11);write_data(table2[xss]);delay(5);}void main(){init();display_init(); while(1){start();delay(5);rd=0;display(); }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(); //显示数值 }}。

相关文档
最新文档