adc0832数字电压表程序仿真图
基于ADC0832和LCD160128设计的数字电压表
学习情境3-数字电压表的设计之基于ADC0832和LCD160128设计的数字电压表☆点名,复习1、ADC0832的引脚及其功能,以及与单片机的硬件连接?2、PCF8591的引脚及其功能,以及与单片机的硬件连接?引言:新课讲授3.4基于ADC0832和LCD160128设计的数字电压表3.4.1 LCD160128简介LCD160128是一种图形点阵液晶显示模组。
它用T6963C作为控制器,KS0086作为驱动的160(列)X128(行)的全点阵液晶显示。
具有与INTER8080时序相适配的MPU接口功能,并有专门的指令集,可完成文本显示和图形显示的功能设置。
LCD160128液晶显示器的工作电压为+5V士10%,能够显示显示10个(/行)X8共120个(16 X 16点阵)的中文字符,共有13条操作指令。
1.芯片引脚及其功能表1引脚功能2.与主控制器的通信(1)读状态在数据读写操作之前必须进行状态检查。
T6963C的状态可以从数据总线中读取。
此时RD#和CE#引脚为低电平,WR#和C/D#引脚为高电平。
状态字格式如下所示:MSB LSBSTA7 D7STA6D6STA5D5STA4D4STA3D3STA2D2STA1D1STA0D0表2 状态子STA0 指令读写状态0:禁止;1:使能;STA1 数据读写状态0:禁止;1:使能;STA2 自动模式数据读状态0:禁止;1:使能;STA3 自动模式数据写状态0:禁止;1:使能;STA4 保留STA5 控制器操作状态0:禁止;1:使能;STA6 读屏/考屏错误标志0:无错误;1:错误;STA7 闪烁状态检查0:关显示;1:正常显示注意1:必须同时检查STA0与STA1的状态,由于硬件中断可能引起数据错误操作。
注意2:STA0与STA1用于大多数模式的状态检查。
注意3:STA2与STA3用于自动模式数据读写使能,此模式下,STA0与STA1无效。
状态检查流程:图1 状态检查流程图注意4:如果使用MSB=0命令,则必须先读取状态操作。
ADC0832
ADC0832设计模块1、ADC0832的主要技术指标:(1)8位分辨率,逐次逼近型。
(2)5V电源供电时,基准电压为5V,输入模拟电压范围为0~5V。
(3)输入和输出电平与TTL和CMOS兼容。
(4)有两个可供选择的模拟输入通道。
(5)在250KHz时钟频率时,转换时间为32µs。
(6)一般功耗仅为15mW。
2、ADC0832引脚说明(1)/CS片选使能,低电平有效。
(2)CHO模拟通道0,差分输入时,作为IN+或IN-使用。
(3)CH1模拟输入通道1,差分输入时,作为IN+或IN-使用。
(4)GND 电源地。
(5)DI数据信号输出,选择通道控制。
(6)DO数据信号输出,转换数据输出。
(7)Vcc/Vre电源输入及参考电压输入(复用)。
(8)CLK芯片时钟信号3、ADC0832时序图4、运用ADC0832设计一个0-5V的数字电压表电路如图所示:设计要求:五位数码管动态显示,第一位显示通道状态(0、1)第二位显示C,第三位是个数,第三位和第四位数码管分别显示十分位和百分位;按键SW1选择通道0,按键SW2选择通道1,并且蜂鸣器和短时间鸣叫;调节滑动变阻器数码管的示数能在0.00~5.00之间变化。
C程序:/************************************************CAUCyeyongan*************************************************/#include <reg52.h>#include <intrins.h>#define uchar unsigned charsbit CS=P3^5;sbit Clk=P1^6; //时钟sbit DO=P3^7; //ADC0832输出引脚sbit DI=P3^6; //ADC0832输入引脚sbit key=P3^3; //按键bit keydownflg; //操作位的定义bit adc_flg;uchar dat,channel;uchar key_buffer;uchar P2_buffer;uchar Beep_cnt;uchar disp_cnt;uchar count4ms;uchar disp_buff[5]; //数码管显示缓存uchar code Tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0 xA1,0x86,0x8E}; //共阳数码表uchar code Tab[5]={0x7f,0xbf,0xdf,0xef,0xf7}; //数码管位选表uchar A_D(uchar CH) //AD函数{uchar i,adval,test; //定义局部变量并初始化adval=0x00;test=0x00;Clk=0; //clk低电平DI=1; //DI初始高电平在第一个时钟脉冲的下降沿前保持高电平,表示启动信号_nop_();CS=0; //片选_nop_();Clk=1; //clk上升沿,起始位写入_nop_();if(CH==0x00) //选择通道0{Clk=0; //clk低电平DI=1;_nop_();Clk=1; //clk上升沿,通道0的第一位写入_nop_();Clk=0;DI=0;_nop_();Clk=1; //clk上升沿,通道0的第二位写入_nop_();}else{Clk=0;DI=1;_nop_();Clk=1; //clk上升沿,通道1的第一位写入_nop_();Clk=0;DI=1;_nop_(); //clk上升沿,通道1的第二位写入Clk=1;_nop_();}Clk=0;DI=1;for(i=0;i<8;i++) //从高位向低位读取八位AD值{_nop_();adval<<=1;Clk=1;_nop_();Clk=0;if(DO)adval|=0x01;elseadval|=0x00;}for(i=0;i<8;i++){test>>=1; //从低位向高位读取八位AD值if(DO)test|=0x80;elsetest|=0x00;_nop_();Clk=1;_nop_();Clk=0;}if(adval==test) dat=test; //判断两个读取值是否相等相等就把读取的数赋值给DAT_nop_();CS=1;DO=1;Clk=1;return dat;}void FillDispBuffer(void) //数码管显示缓存函数{disp_buff[0]=channel; //显示通道disp_buff[1]=12; //显示"C"disp_buff[2]=dat/51; //显示个位disp_buff[3]=dat%51*10/51; //显示十分位disp_buff[4]=((dat%51)*10%51)*10/51; //显示百分位}void dealkey(void) //按键处理{if(keydownflg) return; //keydownflg控制位为1,不对按键进行处理key_buffer=P2;if((key_buffer&0x80)!=0x80) channel=0; //选择通道0if((key_buffer&0x40)!=0x40) channel=1; //选择通道1FillDispBuffer(); //数码管显示缓存Beep_cnt=0;keydownflg=1; //keydownflg控制位置1 }void main(void) //主函数{P0=0xff; //初始化P2=0xff;dat=0x00;disp_cnt=0;count4ms=0;channel=0;TMOD=0x10;TH0=(65535-4000)/256;TL0=(65535-4000)%256;EA=1;TR0=1;ET0=1;while(1){if(adc_flg) //ADC转换控制位,防止输入与输出产生冲突{adc_flg=0;A_D(channel); //ADC函数FillDispBuffer(); //数码管显示缓存}if(!key) //按键dealkey();}}void T0_service(void) interrupt 1 //定时器0中断子函数{TH0=(65535-4000)/256;TL0=(65535-4000)%256;P2_buffer=Tab[disp_cnt]; //查表,数码管的位选择if(keydownflg) //蜂鸣器0.4s的短时间鸣叫{P2_buffer=P2_buffer&0xfe;Beep_cnt++;if(Beep_cnt==100) keydownflg=0;}P2=P2_buffer; //数码管显示数字符号if(disp_cnt==2) //第三位数码管显示小数点P0=Tab1[disp_buff[disp_cnt]]&0x7f;elseP0=Tab1[disp_buff[disp_cnt]];disp_cnt++; //if(disp_cnt==5) disp_cnt=0;count4ms++;if(count4ms==50) //0.2s ADC转换一次{adc_flg=1;count4ms=0;}}。
基于单片机的数字电压表制作——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位的值,如果不相同舍去。
第15章 采用ADC0832的两路电压表设计
{Wr1602Cmd(0x80+0x03);
i=RdAdc0832(0);
//读取Adc0832 0通道的
值
i=(i*5000/255);
Wr1602Dat('C');
//显示Adc0832 0通道的
值
Wr1602Dat('H');
Wr1602Dat('0');
Wr1602Dat('=');
Wr1602Dat('0'+i/1000);//个位
// LCD1602初始化函数
{ delay_ms(20);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x06);
Wr1602Cmd(0x0c);
Wr1602Cmd(0x01); //清屏
Wr1602Cmd(0x80); //设置地址
Wr1602Dat('.');
Wr1602Dat('0'+i%1000/100); //小数点后一位
Wr1602Dat('0'+i%1000%100/10); //小数点后两位
Wr1602Dat('0'+i%1000%100%10); //小数点后三位
Wr1602Dat('V');
Wr1602Cmd(0xC0+0x03);
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=Hx;_nop_();_nop_();_nop_();_nop_();//写通道号位
可自动切换量程的数字电压表
. I可自动切换量程的数字电压表一、实验任务制作可调量程的电压表,通过继电器调节电压表的量程,使电压在0V~200mV,200mV~2V之间转换。
二、各个芯片的资料1、ADC0832ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。
该芯片具有体积小,兼容性,性价比高的优点。
ADC0832 具有以下参数:8位分辨率;双通道A/D转换;输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在0~5V之间;工作频率为250KHZ,转换时间为32μS;一般功耗仅为15mW;8P、14P—DIP(双列直插)、PICC 多种封装;商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C;芯片接口说明:CS_ 片选使能,低电平芯片使能。
CH0 模拟输入通道0,或作为IN+/-使用。
CH1 模拟输入通道1,或作为IN+/-使用。
GND 芯片参考0 电位(地)。
DI 数据信号输入,选择通道控制。
DO 数据信号输出,转换数据输出。
CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。
单片机对ADC0832 的控制原理:正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。
单片机数字电压表(带仿真图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(); //显示数值}}。
adc0832数字电压表(程序+仿真图)
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位的值,如果不相同舍去。
基于ADC0832数字电压表
阿坝师范高等专科学校电子信息工程系课程设计基于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:电源输入及参考电压输入。
基于ADC0832的数字电压表
//基于ADC0832的数字电压表#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件//ADC0832端口引脚定义sbit CS=P3^0; //将CS位定义为P3.0引脚sbit CLK=P3^6; //将CLK位定义为P3.6引脚sbit DIO=P3^7; //将DIO位定义为P3.7引脚//全局变量声明unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字unsigned char code Str[]={"Volt="}; //说明显示的是电压//液晶端口定义sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
ADC0832数字电压表
摘要单片计算机即单片微型计算机。
(Single-Chip Microcomputer),是集CPU ,RAM ,ROM 定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
简易电压表是利用模拟量转换成数字量经单片机处理并反映在显示器上,它可以分析5V的电压,并能用该电压表可测出该电路的电流和电阻值。
本文介绍了电压表的使用和开发环境,仿真系统和开发使用的MCS-51系列的单片机芯片。
在第二章论述了总体设计过程,确定了技术指标及器件的选择第四章着重描述了系统硬件电路设计、硬件设计框图及所使用的各种芯片功能与特性。
关键词:电压表、单片机技术、A/D转换AbstractWith the infiltration in the social field of the c omputer in recent years, the application of the one-chip computer is moving towards deepening constantly, drive tradition is it measure crescent benefit to upgrade day to control at the same time. In measuring in real time and automatically controlled one-chip computer application system, the one-chip computer often uses as a key part, only one-chip computer respect knowledge is not enough, should also follow the structure of the concrete hardware , and direct against and use the software of target's characteristic to combine concretly, in order to do perfectly. The pressure system of much passways of simulation utilizes the pressure sensor to gather the pressure at present and reflect by display, it can analyse excessive Cheng of the pressure , sends out and reports to the police. It can be according to inputting the amount of money of calculating out the object with accurate unit price to adopt the principle of the electronic scale.This text has introduced the research meaning of this system and development environment used in the introduction at first, artificial system of the big good fortune and developing the one-chip computer chip of MCS-51 series used. Have described the overall design process in chapter two, have confirmed chapter three of choice of technical indicator and device has described emphatically that designs the block diagram and various kinds of chip functions and characteristics used in circuit design of the systematic hardware , hardware, have analyzed the design course of the software especially in chapter four.Keyword: Electric voltage form,technology of the one-chip computer , A/D change目录引言 (4)1 核心芯片简介 (5)2 AT89S51简介 (8)2.1 AT89C51芯片的引脚及特点 (8)2.2 AT89C51的主要性能参数 (11)2.3 AT89C51的新功能 (11)3 方案设计 (12)4 软硬件设计 (13)4.1 硬件电路设 (13)4.2 单片机AT89C51外围电路设计 (13)4.3 ADC0832与单片机的接口设计 (14)4.4 显示设计 (14)4.5 电源设计 (14)5 结论 (15)6 致谢 (15)7 参考文献 (16)引言电压、电流、功率是表征电信号能量大小的三个基本参量。
ADC0832电压采集电路分析
ADC0832芯片功能分析:8管脚芯片,管脚1cs 用于片选,低电平有效,cs=0,芯片才可以工作。
Ch0.ch1,模拟输入通道,gnd 接地。
Vcc 接电源正极,clk 给芯片工作提供震荡信号,D0,D1,为数据输入端口,两个端口一般不会同时工作,
所以使用时一般共同连在一个端口上,d1用于选通工作通道,d0用于数据输入。
D1在时钟第一个脉冲下降时必须置高,用于启动芯片工作,在第二个,第三个时钟脉冲信号下降之前,d1端口必须输入两位数,用以选通数据输入通道,在第三个时钟脉冲下降之后,D1通道失去作用,置高。
然后d0通道传输数据。
用ADC0832设计的两路电压表
题目:基于ADC0832的两路电压表设计_所在院系:电气工程与自动化学院专业:10自动化入学时间:二〇一〇年九__月导师所在单位:电气工程与自动化学院完成时间:二〇一四年五月摘要数字电压表是采用数字化测量设计的电压仪表。
目前,其作为数字化仪表的基础和核心,已被广泛应用于电子和电工测量、工业自动化仪表、自动测试系统等领域,显示出强大的生命力。
与此同时,数字电压表扩展而成的各种通用及专用仪器仪表,也将电量及非电量测量技术提高到崭新水平。
本设计为直流数字电压表。
利用单片机AT89C51借助软件实现数字显示功能、自动校准、LED显示,A/D转换器采用ADC0832构成数模转换电路。
该电压表测量范围在0~5V。
由于采用高性能的单片机芯片为核心,同时利用LED数码管为显示设备,这样就使显示清晰直观、读数准确,减少了因为人为因素所造成的测量误差事件,同时提高了测量的准确度。
关键词:AT89C51;A/D转换;LED目录目录 (3)第1章绪论 (4)1.1 选题背景 (4)1.2 主要特点 (6)第2章方案论证及方案选择 (7)2.1方案论证 (7)2.2方案选择 (8)第3章主要元器件介绍 (9)3.1 ADC0832的介绍 (9)3.1.1引脚及功能介绍 (9)3.1.2 内部介绍 (10)3.1.3芯片的操作方法 (10)3.2 AT89C51的介绍 (12)3.2.1引脚及功能介绍 (12)3.2.2内部介绍 (14)3.2.3芯片的操作方法 (14)3.3 SCD1602的介绍 (15)3.3.1引脚及功能介绍 (15)3. 3. 2内部介绍 (16)3. 3. 3 芯片的操作方法 (16)第4章系统硬件设计 (17)4.1 最小系统电路 (17)4.1.1 时钟电路 (17)4.1.2 复位电路 (18)4.2 模数转换电路 (19)4.2.1转换电路 (19)4.3 液晶显示电路 (20)4.3.1显示电路 (20)4.4 硬件结构图 (21)第5章系统软件设计 (22)5.1 主程序设计 (22)5.2 A/D转换程序 (23)第6章程序清单 (24)致谢 (33)参考文献........................................................................................................................................ .37第1章绪论1.1 选题背景近年来计算机技术及微电子器件在工程技术中应用十分广泛。
PCB项目说明书 用 ADC0832 设计的两路电压表(用 LCD1602显示)
利用单片机 STC89C52 与 ADC0832 设计一个两路电压表,将模拟信号 0~5V 之间的电压值转换成数字量信号,并在 LCD1602 显示屏上显示,通过虚拟电压表 观察 ADC0832 模拟量输入信号的电压值,LCD1602 实时显示相应的数值量。
项目要求: (1)LCD 显示清晰无鬼影不闪烁 (2) 程序设计中,要使 LCD 显示变化的电压
图 3-2 ADC0832 时序图
集成模数转换芯片 ADC0832 实现的 A/D 转换电路如图 3-2 所示。被测信号 由 ADC0832 模拟输入端输入,完成 A/D 转换后送入单片机,经相应处理后送出 显示。
4 液晶显示屏 LCD1602 简介
1602 液晶显示器它是一种专门用来显示字母、数字、符号等的点阵型液晶 模块。它有若干个 5*7 或者 5*11 等点阵字符位组成,每个点阵字符位都可以显 示一个字符。其为 5V 电压驱动,带背光,可显示两行,每行 16 个字符,内置 含 128 个字符的 ASC 字符集字库,只有并行接口,无串行接口。其中 D0~D7 与单片机的 P0.0~P0.7 相连接,RS 与单片机的 P2.0 相连接,R/W 与单片机的 P2.1 相连,E 与单片机 P2.2 相连。
当前地址指针的数值
原则上每次对控制器进行读写操作之前,都必须进行读/写检测,确保 SAT7 为 0。实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不 进行读/写检测,或只进行简短的延时即可。
c)数据指针设置见表 4-3。 控制器内部设有一个数据地址指针,用户可以通过它们访问内部的全部 80B 的 RAM。
电源地
2
VDD
电源正极
3
VO
液晶显示对比度调节端
基于ad0832的液晶显示数字电压表
设计题目:基于液晶显示的AD0832两路模数转换系别:应用电子与通信技术系班级:0991321学生姓名:张潇指导教师:徐秋景、姜滨成绩:2012年7月12日课程设计任务书2012年7月2日目录第一章绪论 (1)1.1选题目的 (1)1.2设计要求 (1)1.2.1设计题目和设计指标 (1)1.2.2设计功能 (1)第二章总体设计及工作原理 (2)2.1设计原理及方案 (2)2.2总体设计 (2)第三章硬件设计及电路图 (3)3.1芯片资料介绍 (3)3.1.1 AT89C51 (3)3.1.2 AD0832 (3)3.2单片机对 ADC0832 的控制原理 (4)3.3 LCD显示模块 (5)3.4时钟电路 (6)3.5电压调节部分 (6)3.6复位电路 (7)3.7系统原理图 (7)第四章系统程序设计 (8)4.1软件总体框架设计 (8)4.2系统子程序设计 (9)4.2.1初始化程序 (9)4.2.2A/D转换子程序 (9)收获和体会 (12)致谢 (13)参考文献 (14)附录1 (15)附录2完整程序代码 (16)原件清单 (33)第一章绪论1.1选题目的模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,在数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路里,电平则理论上有无数个状态,比如0V、0.1V、0.2V…等等。
如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程。
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,且目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
1.2设计要求1.2.1设计题目和设计指标设计题目:基于液晶显示的AD0832两路模数转换。
设计指标:当改变电压值时,经过AD0832模数转换,液晶显示结果对应改变。
ADC0832数字电压表
信息与电气工程学院单片机应用系统(三级项目)设计说明书(2014/2015学年第二学期)题目:数字电压表设计与实现目录一、课程设计目的...................................................................................................................... - 1 -二、课程设计正文...................................................................................................................... - 1 -2.1 总体论述...................................................................................................................... - 1 -2.2 设计方案...................................................................................................................... - 2 -2.3 硬件元器件的选择与设计.......................................................................................... - 2 -2.3.1 AT89C51模块................................................................................................... - 2 -2.3.2 A/D数据转换模块........................................................................................... - 5 -2.3.3 LCD显示系统设计........................................................................................... - 7 -2.4 程序设计总方案.......................................................................................................... - 9 -2.4.1. 初始化程序.................................................................................................... - 9 -2.4.2显示子程序...................................................................................................... - 9 -2.4.3A/D转换子程序................................................................................................ - 9 -三、软件调试与仿真................................................................................................................ - 11 -3.1软件调试..................................................................................................................... - 11 -3.2数字电压表仿真......................................................................................................... - 11 -四、课程设计总结.................................................................................................................... - 11 -五、参考文献............................................................................................................................ - 12 - 附录 ........................................................................................................................................... - 13 -数字电压表设计与实现一、课程设计目的电压表已经有100多年的发展历史,虽然不断改进与完善,仍然无法满足现代电子测量的需求,近二十年,微电子技术,计算机技术,集成技术,网络技术等高新技术得到了迅猛发展。
adc0832数字电压表(程序+仿真图)
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 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位的值,如果不相同舍去。
基于51单片机的ADC0832电压采样,12864液晶显示的Proteus仿真
基于51单片机的ADC0832电压采样,12864液晶显示的Proteus仿真(1:源程序2:Proteus 仿真)1源程序:#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delay4us() {_nop_();_nop_();_nop_();_nop_();}//ADC0832引脚定义sbit CS=P1^0;sbit CLK=P1^1;sbit DIO=P1^2;//LCD1602端口定义sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;//一位整数,两位小数的数字电压显示缓冲uchar Display_Buffer[]="0.00V";//LCD第一行显示的信息uchar code Line1[]="Current V oltage:";//延时子程序void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//LCD忙状态检测bit LCD_Busy_Check(){bit result;RS=0;RW=1;E=1;delay4us();result=(bit)(P0&0x80);E=0;return result;}//写LCD命令void LCD_Write_Command(uchar cmd){while(LCD_Busy_Check()); //判断LCD是否忙碌RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;delay4us();E=1;delay4us();E=0;}//设置LCD显示位置void Set_Disp_Pos(uchar pos){LCD_Write_Command(pos|0x80);}//写LCD数据void LCD_Write_Data(uchar dat){while(LCD_Busy_Check()) ; //判断LCD是否忙碌RS=1;RW=0;E=0;P0=dat;delay4us();E=1;delay4us();E=0;}//LCD初始化void LCD_Initialise(){LCD_Write_Command(0x38);DelayMS(1);LCD_Write_Command(0x0C);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);}//获取AD转换结果uchar Get_AD_Result(){uchar i,dat1=0,dat2=0;//起始控制位CS=0;CLK=0;DIO=1;_nop_();_nop_();CLK=1;_nop_();_nop_();//第一个下降沿之前,设Di=1/0//选择单端/差分(SGL/DIF)模式中的单端输入模式CLK=0;DIO=1;_nop_();_nop_();CLK=1;_nop_();_nop_();//第二个下降沿之前,设DI=0/1,选择CH0/CH1CLK=0;DIO=0;_nop_();_nop_();CLK=1;DIO=1;_nop_();_nop_();//第三个下降沿之前,设DI=1CLK=0;DIO=1;_nop_();_nop_();//第4-11,共8个下降沿读数据(MSB=>LSB) for(i=0;i<8;i++){CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();dat1=dat1<<1|DIO;}//11-18,共8个下降沿读数据(LSB=>MSB)for(i=0;i<8;i++){dat2=dat2|((uchar)(DIO)<<i);CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();}CS=1;//如果MSB->LSB和LSB->MSB读取的结果相同,则返回读取的结果,否则返回0 return (dat1==dat2)?dat1:0;}/*主程序*/void main(){uchar i;uint d; //注意d的类型LCD_Initialise();DelayMS(10);while(1){//获取AD转换值,最大值255对应于最高电压5.00V//本例中设计为显示三个位数,故使用500d=Get_AD_Result()*500.0/255;//将AD转换后的数据分成3个数位Display_Buffer[0]=d/100+'0';Display_Buffer[2]=d/10%10+'0';Display_Buffer[3]=d%10+'0';Set_Disp_Pos(0x01); //设置显示位置i=0;while(Line1[i]!='\0')LCD_Write_Data(Line1[i++]); //设置第一行字符串Set_Disp_Pos(0x46); //设置显示位置i=0;while(Display_Buffer[i]!='\0')LCD_Write_Data(Display_Buffer[i++]); //设置第二行字符串}}2:Proteus 仿真如下:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
仿真图:
/*********************************包含头文件********************************/ #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;
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 char i)
{
dis[0] = i/51; //个位
dis[1] = (i%51)*10/51*2; //小数点后第一位
dis[2] = ((i%51)*10%51)*10/51*2; //小数点后第二位
}
/**************************************************************************** 函数功能:数码管显示子程序
入口参数:
出口参数:
****************************************************************************/ void display(void)
{
P2=0xff;
P0=tab[dis[0]] & 0x7f; //显示个位和小数点
delay();
P2=0xfd;
P2=0xff;
P0=tab[dis[1]]; //显示小数点后第一位
delay();
P2=0xfb;
P2=0xff;
P0=tab[dis[2]]; //显示小数点后第二位
delay();
P2=0xf7;
P2=0xff;
P0=0xff; //显示小数点后第二位
delay();
P2=0xfe;
}
/**************************************************************************** 函数功能:主程序
入口参数:
出口参数:
****************************************************************************/ void main(void)
{
P2=0xff; //端口初始化
P0=0xff;
delay();
CH = 0x00; //在这里选择通道0x00或0x01
TMOD = 0x01; //设置中断
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
while(1) //主循环
{ dat = adc0832(CH);
convdata(dat); //数据转换
display(); //显示数值
}
}
/****************************************************************************
函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定
入口参数:
出口参数:
****************************************************************************/
void timer0(void) interrupt 1
{
TMOD = 0x01;
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
count++;
if (count == 0x01)
{
count = 0x00;
dat = adc0832(CH);
}
}。