基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)
- 格式:doc
- 大小:109.50 KB
- 文档页数:8
目录一设计总体方案 (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语言)主要部件: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)2. 方案设计 (1)2.1设计要求 (1)2.2设计方案 (1)3. 硬件设计 (2)3.1单片机最小系统 (2)3.2显示驱动部分 (2)3.3转换电路 (3)3.4单片机驱动部分 (3)4. 软件设计 (4)4.1软件流程 (4)4.2子程序模板 (5)5实验结果与讨论 (5)5.1实验仿真 (5)5.2结果讨论 (5)6心得体会 (6)7参考文献 (13)8附录8.1程序 (7)8.2原理图 (7)1. 引言随着片机技术的飞速发展,,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发肢和社会信息化程度的提商,人们为了寻求最好的科技,为了方便人类在使用科技产品的快速性,准确性。
例如数字电压表能够准确的,快速的量出电压。
利用ADC0832和AT89C52的结合再通过LCD来显示出来。
ADC0832是一个8位D/A转换器。
单电源供电,从+5V〜+15V均可正常工作。
基准电压的围为土10V;电流建立时间为1卩S; CMOS:艺,低功耗20mWADC0832 转换器芯片为20引脚,双列直插式封装。
该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。
使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。
2. 方案设计2.1设计要求按系统要实现功能,设计必须达到以下的几个步骤的要求(1)主电路系统是由ADC0832单片机AT89C52和LCD显示屏组成。
(2)ADC083是模拟数字转换芯片,是将外侧电压信号转换成数字信号再通过AT89C52处理,再通过LCD显示出来(3)能测量0-5V的数字电压(4)测量误差不大于0.1V2.2设计方案2.1.1 单片机的选择本设计选用单片机AT89C52它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS位微处理器该器件采用ATME高密度非易失存储器制造技术制造,与工业标准的MCS-51指令系统及8052产品引脚兼容,功能强大、使用方便的AT80C52单片机适用于许多较为复杂的应用场合。
基于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(); //显示数值}}。
adc0832数字电压表(程序+仿真图)仿真图:/*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/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};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;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位的值,如果不相同舍去。
数模转换DAC0832的应用(含电路和源程序)数模转换DAC0832的应用[实验要求]通过用单片机控制DAC0832输出锯齿波,让实验板上发光二极管D12由暗到亮变化,循环下去。
[实验目的]学会用单片机控制数模转换芯片DAC0832。
DAC0832:DAC0832是8位全MOS中速D/A 转换器,采用R—2RT 形电阻解码网络,转换结果为一对差动电流输出,转换时间大约为1us。
使用单电源+5V―+15V 供电。
参考电压为-10V-+10V。
在此我们直接选择+5V 作为参考电压。
DAC0832 有三种工作方式:直通方式,单缓冲方式,双缓冲方式;在此我们选择直通的工作方式,将XFER WR2 CS 管脚全部接数字地。
管脚8 接参考电压,在此我们接的参考电压是+5V。
我们在控制P0口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等波形了。
[硬件电路][源代码]//TX-1BDA测试程序,下载后可观察到D13发光二极管由暗变亮再熄//灭过程,#include<reg51.h>sbit wela=P2^7; //数码管位选sbit dula=P2^6; //段选sbit dawr=P3^6; //DA写数据sbit csda=P3^2; //DA片选unsigned char a,j,k;void delay(unsigned char i) //延时{for(j=i;j>0;j--)for(k=125;k>0;k--);}void main(){wela=0;dula=0;csda=0;a=0;dawr=0;while(1){P0=a; //给a不断的加一,然后送给DAdelay(50); // 延时50ms 左右,再加一,再送DA。
a++;}}注意:随着给DA送的数字量的不断增加,其转换成模拟量的电流也不断的增大,所以我们观察发光二极管D12就会从暗变亮,熄灭。
阿坝师范高等专科学校电子信息工程系课程设计基于ADC0832数字电压表学生姓名任银鹏专业名称电子信息工程技术班级电信班学号20113026基于ADC0832数字电压表一、设计要求设计一个在单片机AT89S52作用下基于ADC0832数字电压表.二、系统设计方案1. 模块图2. 模块作用该电压表由单片A/D转换器构成,在很大的电压情况下,电压表去测量时会对其并联很大的电阻分掉高压,然后再进行测量,这本来很大的电压,到后来测出来的电压就会很小,这就是A/D转换实现低压电压表测量高压三、硬件原理1.LCD1602图3.1 LCD1602外观如图3.1 LCD1602外观,从LCD1602参数手册知道芯片工作电压为4.5~5.5V,工作电流20mA。
模块最佳工作电压为5V。
引脚作用说明如下表3.1:表3.1引脚作用说明从参数手册知道LCD1602与单片机8051系列连接方式如图3.2所示,LCD1602引用电路如图3.3:图3.2 LCD1602与单片机8051系列连接方式图3.3 LCD1602引用电路如图3.3 LCD1602引用电路,单片机P2口与LCD1602的7-14脚连接,单片机14脚与LCD1602的6脚连接,单片机15脚与LCD1602的4脚连接。
2. ADC0832ADC0832具有8位分辨率;双通道A/D转换;输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在0-5V之间,工作频率为250KHz,转换时间为32us;一般功耗仅为15Mw的特点。
ADC0832芯片引脚说明如图3.4:图3.4ADC0832芯片引脚说明:cs:片选使能,低电平芯片使能;cho:模拟输入通道0,或作为IN+/-使用;ch1:模拟输入通道:1,或作为IN+/-使用;GND:芯片参考0电位;DI:数据信号输入,悬着通道控制;DO:数据信号输出,转换数据输出;CLK:芯片时钟输入;Vcc/REF:电源输入及参考电压输入。
#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define _rrca_() CY = ACC & 0x01 //产生RRC A指令#define _rlca_() CY = ACC & 0x80 //产生RLC A指令sbit bADcs=P1^4;sbit bADcl=P1^5;sbit bADda=P1^6;sbit flag=P1^7;sbit str=P2^7;sbit d=P2^6;sbit clk=P2^5;bit choose=0;unsigned char data1;unsigned char count;unsigned char cycle;uint ge,xiao1,xiao2;unsigned long data2;//无小数点const uchar table1[17]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x71,0x31,0x93,0x61,0x13,0 x17,0xff};//有小数点const uchar table2[17]={0x80,0xec,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08,0x70,0x30,0x92,0x60,0x12,0 x16,0xff};uchar buffer[4]={0x00,0x00,0x00,0x00};void Delayus(uchar i){while(--i);}void display(void){uchar bit_count=0;uchar table_counter=0;uchar byte_counter=0;uchar temp_i=0;buffer[0]=xiao2;buffer[1]=xiao1;buffer[2]=ge;buffer[3]=0x00;//led_str_off;//先清零str=0;//led_clk_off;clk=0;for(byte_counter=0;byte_counter<4;byte_counter++) {bit_count=8;if(byte_counter==2)temp_i=table2[buffer[byte_counter]];elsetemp_i=table1[buffer[byte_counter]];// nop;while(bit_count>0){if((temp_i&0x80)==0){//led_d_off;d=0;}else{//led_d_on;d=1;}temp_i=(temp_i<<1);// nop;//led_clk_on;clk=1;// nop;//led_clk_off;clk=0;// nop;bit_count--;}}//led_str_on;str=1;}/*void ad(){choose=0;count = 0;bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.bADcl = 0;bADda = 1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平.bADcl = 1;bADcl = 0;//pulse 1 downbADda = 1;bADcl = 1; bADcl = 0;//pulse 2 downif(choose == 0)bADda = 0;elsebADda = 1;bADcl = 1; bADcl = 0;//pulse 3 downbADcl = 1; bADcl = 0;//pulse 4 down//bADcl = 1;for(cycle = 8; cycle > 0; cycle-- ){bADda = 1;//bADcl = 0;//pulsebADcl = 1;CY = bADda;_rlca_(); //RRC AbADcl = 0;//pulse}data1= ACC;for(cycle = 8; cycle > 0; cycle-- ){bADda = 1;bADcl = 1;CY = bADda;_rrca_();//RLC AbADcl = 0;//pulse}//bADcl = 0;//pulse} */void ad(void){ uchar i;//data1=0;bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.bADcl=0;bADda=1;bADcl=1;bADcl=0;//i downbADda=1;bADcl=1;bADcl=0; // 2 downbADda=0;bADcl=1;bADcl=0; // 3 downbADda=1;bADcl=1;bADcl=0; // 4 downfor(i=8;i>0;i--){data1<<=1;bADcl=0;bADcl=1;if(bADda==1) data1|=0x01;bADda=1;}/* for(i=8;i>0;i--){bADcl=0;bADcl=1;} */bADcs=1;}void cal(){data2=((ulong)data1*493)/256; ge=data2/100;xiao1=(data2%100)/10;xiao2=data2%10;}main(){flag=1;while(1){ad();cal();display();}}。
单片机数字电压表设计c语言程序
本文将介绍如何使用C语言编写单片机数字电压表的程序。
首先,需要了解单片机的基本原理和电路连接方式。
单片机是一种小型的计算机芯片,可以用来控制各种电子设备。
在电压表中,我们需要将单片机连接到电压传感器和显示器上。
电压传感器将测量的电压信号转换为数字信号,然后传输给单片机。
单片机将这个数字信号转换为显示器上的数字。
为了实现这个功能,我们需要编写一些基本的C语言程序。
首先,我们需要初始化单片机的IO口,以便将其连接到电压传
感器和显示器上。
然后,我们需要配置单片机的ADC模块,以便可以读取电压传感器产生的模拟信号。
一旦我们读取了这个模拟信号,我们需要将其转换为数字信号,并将其保存在单片机的内存中。
然后,我们需要将这个数字信号转换为适合显示器的格式,并在显示器上显示出来。
这些都是单片机数字电压表程序的基本步骤。
当然,实际编码过程中可能会涉及到更多的细节和技巧。
但是,只要我们掌握了基本的编程原理和方法,我们就可以轻松地编写出高效、稳定的单片机数字电压表程序。
- 1 -。
基于单片机的数字电压表制作——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位的值,如果不相同舍去。
若一直出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(); //显示数值}}。