数字电压表
基于51单片机的数字电压表设计
简介
1、数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示。而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编码等几部分组成。因此AD转换是此次设计的核心元件。输入的模拟量经过AD转换器转换,再由驱动器驱动显示器输出,便得到测量的数字电压。
2、基本功能要求:
1.可以选择测量测量1路0-5V的1路输入电压值;
2.可轮流显示或单路选择显示(可选);
3.测量显示最小分辨率为0.01V;测量误差约为0.02V;
数码管显示
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管:按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
单片机最小系统
当在89C5x单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作,按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经过电阻与电源VCC接通而实现的。
硬件电路设计
供电电路和参考电压
由于此次系统的芯片工作电压为+5v,所以可以直接用USB供电。
Proteus仿真图
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | #include <reg51.h> #include <intrins.h> /*********************************端口定义**********************************/ sbit CS = P3^5; sbit Clk = P3^3; sbit DATI = P3^4; sbit DATO = P3^4; sbit DIAN = P0^5; //小数点 /*******************************定义全局变量********************************/ unsigned char dat = 0x00; //AD值 unsigned char count = 0x00; //定时器计数 unsigned char CH; //通道变量 unsigned char dis[4]; //显示数值 unsigned int sum=0; /*******************************共阴LED段码表*******************************/ unsigned char code tab[]={ <!-- -->0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7}; char code tablewe[]={ <!-- --> 0xfd,0xfb,0xf7,0xef,0xdf,0xfe }; /**************************************************************************** 函数功能: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; else adval |= 0x00; } for (i = 0; i < 8; i++) //读取后8位的值 { <!-- --> test >>= 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; } if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat = test; nop_(); CS = 1; //释放ADC0832 DATO = 1; Clk = 1; return dat; } /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay( void ) { <!-- --> int k; for (k=10;k<500;k++); } /**************************************************************************** 函数功能:将0-255级换算成0.00-5.00的电压数值 入口参数:i 出口参数: ****************************************************************************/ void convdata(unsigned int i) { <!-- --> i=i*1.96; //i*5/255*100 dis[0] = i/100; //个位 dis[1] = i%100/10; //小数点后第一位 dis[2] = i%100%10; //小数点后第二位 // dis[3] = i%1000%100%10; } /**************************************************************************** 函数功能:数码管显示子程序 入口参数: 出口参数: ****************************************************************************/ void display( void ) { <!-- --> P0=tab[dis[0]]; //显示个位和小数点11011111 DIAN=1; P2=0xdf; //11011111 delay(); P2=0xff; P0=tab[dis[1]]; //显示小数点后第一位 P2=0xbf; //10111111 delay(); P2=0xff; P0=tab[dis[2]]; //显示小数点后第二位 P2=0x7f; //01111111 delay(); P2=0xff; } /**************************************************************************** 函数功能:主程序 入口参数: 出口参数: ****************************************************************************/ void main( void ) { <!-- --> unsigned char m; CH = 0x00; //在这里选择通道 0x00或0x01 while (1) //主循环 { <!-- --> for (m=0;m<50;m++) { <!-- --> dat = adc0832(CH); sum=sum+dat; display(); //显示数值 } dat=sum/50; sum=0; convdata(dat); //数据转换 display(); //显示数值 } } |
