ADC0832模数转换与显示...
模数转换ADC0832、ADC0808和ADC0809的利用
模数转换ADC0832、ADC0808和ADC0809的利用/***************************************************************利用AT89c51 单片机和ADC0808(ADC0809)ADC0832 进行模数转换,进行电压测试数码管采用共阳极,要显示小数点,则小数点位二进制数最高为应为0,在0-9 的8421BCD 码中,最高位都为1,所以把输出数据的BCD 码与0x7F 相与才能实现带小数点的显示。
****************************************************************/#include#include#define uint unsigned int#define uchar unsigned char//******************adc0832****************************//sbitCS=P2;//使能。
sbit CLK=P2 ;//时钟sbit DO=P2;// 数据输出sbit DI=P2;//数据输入char CC[]=“11001001”;uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};uchar temp;uint vvv,i;//通道的选择:0x02 就是单通道0;0x03 就是单通道1;//0x00 就是双通道ch0=“+”;ch0=“-”//0x01就是双通道ch0=“-”;ch0=“+”//*****************************************************//void delay(inttt){while(tt--) {for(i=0;i<120;i++);}}void startADC(){CS=1;_nop_();_nop_();CLK=0;_nop_();_nop_();CS=0;_nop_();_nop_(); DI=1;_nop_();_nop_();CLK=1;_nop_();_nop_();DI=0;_nop_();_nop_();CLK=0;_nop_();_nop_();}void choiceADC(uint CH)//CH 为0 选择通道ch0,为1,选择ch1进行AD 转换{startADC();if(CH==0){DI=1;_nop_();CLK=1;//上升沿DI=1_nop_(); CLK=0;//1 个下降沿DI=1_nop_();DI=0;_nop_();CLK=1;_nop_();CLK=0;//第3 个上升沿DI=0_nop_();}else{DI=1;_nop_();CLK=1;//上升沿DI=1_nop_();CLK=0;//1个下降沿DI=1_nop_();DI=1;_nop_();CLK=1;_nop_();CLK=0;//第3 个上升沿。
51单片机驱动ADC0832模数转换程序lcd1602显示
51单片机驱动ADC0832模数转换程序-lcd1602显示/*这个芯应用不多*/#include ;#define uchar unsigned char#define uint unsigned intuchar Chan0Value,Chan1Value;sbit RS=P1^0; //1602各控制脚sbit RW=P1^1;sbit EN=P1^2;sbit Cs0832= P2^0;//0832各控制脚sbit Clk0832= P3^6;sbit Di0832= P3^7;sbit Do0832= P3^7;void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){int i,j;for(i=0;i;>;i;}for(i=0;i<8;i++)//从低到高取一次数{if(Do0832) Dat2|=0x01<<i;Clk0832=1; //下降沿有效Clk0832=0;}Cs0832=1;Di0832=1;Clk0832=1; //数据读取完成,释放所有数据线if(Dat1==Dat2)return Dat1; //校验两次数相等,输出}/*本程序与其他一般程序最大的不同就是要读两次一次从最高位到最低位,一次从最低位到最高位,两次所读值相等即为正常,可以输出*//******************************LCD1602*********** ***************************//*************************lcd1602程序**************************/void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x80);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void writevalue(uchar add,uchar dat) {wr_com(0x80+add);wr_dat(dat);}void zifuchuan(uchar *ch){while(*ch!=0)wr_dat(*ch++);delay1ms(20);}void main(void){lcd_init();while(1){Chan0Value=GetValue0832(0);delay1ms(100);Chan1Value=GetValue0832(1);wr_com(0x80);zifuchuan("Chanal 0:");writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan("Chanal 1:");writevalue(0x40+10,Chan1Value/100+0x30);writevalue(0x40+11,Chan1Value%100/10+0x30); writevalue(0x40+12,Chan1Value%100%10+0x30); delay1ms(1000);}}/*此程序只为调通ADC0832,没有对电压值进行转换要想得到准确电压值,请把Chan0Value和Chan1Value 的值乘以5再除以255即可。
adc0832内部工作原理
adc0832内部工作原理一、引言ADC0832是一种8位分辨率的模数转换器,它可以将模拟信号转换为数字信号。
在本文中,我们将详细讨论ADC0832的内部工作原理。
二、基本概念在开始讨论ADC0832的内部工作原理之前,我们需要了解一些基本概念:1. 模拟信号:指连续变化的物理量所组成的信号。
2. 数字信号:指由离散数值表示的信号。
3. 分辨率:指数字转换器可以将模拟信号分成多少个等级。
4. 采样率:指数字转换器每秒钟可以采样多少次。
5. 时钟频率:指数字转换器内部时钟的频率。
三、ADC0832的基本结构ADC0832由以下几个主要部分组成:1. 输入缓冲区输入缓冲区用于保护输入电路不受外界干扰,并提供稳定的输入电压。
它通常由一个差分放大器和一个低通滤波器组成。
差分放大器用于放大差模输入电压,低通滤波器用于去除高频噪声。
2. 参考电压源参考电压源提供一个固定的参考电压,用于将模拟信号转换为数字信号。
它通常由一个精密的电压源和一个放大器组成。
3. 比较器比较器用于将输入信号与参考电压进行比较,并产生一个数字输出。
它通常由一个差分放大器和一个阈值电路组成。
差分放大器用于放大差模输入电压,阈值电路用于产生比较阈值。
4. 采样保持电路采样保持电路用于在ADC0832进行转换之前,将输入信号进行采样并保持其值不变。
它通常由一个开关和一个采样保持电容组成。
5. 计数器计数器用于控制ADC0832的转换速率,并计算转换结果。
它通常由一个时钟发生器和一个二进制计数器组成。
6. 数字输出接口数字输出接口用于将数字信号输出到外部系统。
它通常由一组并行输出引脚或串行输出引脚组成。
四、ADC0832的工作原理ADC0832的工作原理可以分为以下几个步骤:1. 输入缓冲区当模拟信号进入ADC0832时,首先经过输入缓冲区进行处理。
输入缓冲区通过差分放大器将差模输入电压放大,并通过低通滤波器去除高频噪声。
然后,输入缓冲区将处理后的信号送入采样保持电路。
ADC0832模数转换之5v内电压测量
void main(void) //入口函数
{
unsigned char i=0;
unsigned int tmp;
RST=0;
while(1)
{
if(i==0) //这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取
{
tmp=ad0832read(1,0)*100;//ad0832read函数里的两个参数代表的意义分别是:
ADC0832.c /*************************************************************************** 标题: ADC0832模数转换程序,电压表 效果: 调节模拟采集量电位器,数码管显示相应的分压。 说明: 做这个例子的朋友,先看完这段话,一定要看完再做实验。
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef, 0x40, 0x3e, 0x00};
"0-9",第二行是"0-9且有小数点的" ,接下来三行分别是"-"、 "U" 、"空" unsigned char l_tmpdate[]={0,0,0,0}; //存放显示内容的数组
//第一个上升沿
SDA=SGL;_nop_();_nop_(); SCL=1;_nop_();_nop_(); SCL=0;_nop_();_nop_();
//输入数据SGL //第二个上升沿
SDA=ODD;_nop_();_nop_(); SCL=1;_nop_();_nop_(); SCL=0;_nop_();_nop_();
实验十 ADC0832数模转换的显示
实验报告十实验名称:ADC0832数模转换的显示目的:ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路模拟信号实现模—数转换,可以用在单端输入方式和差分方式下工作。
ADC0832采用串行通信方式,通过DI 数据输入端进行通道选择、数据采集及数据传送。
8位的分辨率(最高分辨可达256级),可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
ADC0832的工作原理:正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时使用并与单片机的接口是双向的,所以在I/O口资源紧张时可以将DO和DI并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第一个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第二、三个脉冲下沉之前DI端应输入两位数据用于选择通道功能。
通道地址通道工作方式说明SGL/DIF ODD/SIGN 0 10 0 + -差分方式0 1 - +1 0 +单端输入方式1 1 +表1:通道地址设置表如表1所示,当此两位数据为“1”、“0”时,只对CH0 进行单通道转换。
当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。
160128液晶曲线显示ADC0832两路模数转换设计
160128液晶曲线显示ADC0832两路模数转换设计摘要:本文介绍了以单片机最小系统、电压调节模块、ADC0832模数转换模块和LCD显示模块组成的模数转换显示系统,该系统以AT89C51为核心控制元件,其它外围电路辅助。
通过采集电压调节电路中电压输入,将输入信号转变为数字信号,再由单片机分析处理信号,最终输出信号,由160128液晶曲线显示。
同时介绍了该系统的硬件设计方法、系统的构成以及软件的设计,并详细的说明了系统的构成以及工作原理。
关键词:ADC0832;LCD显示;模数转换1引言模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,在数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路中,电平理论上有无数个状态,比如0V、0.1V、0.2V…等等。
如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程。
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,并且目前已经有很高的普及率。
学习并使用ADC0832可以使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
2总体设计及工作原理2.1设计原理及方案A/D转换器能把输入的模拟电压或直流电流转变为与它成正比的数字量,既能把被控对象的各种模拟信息变成计算机可以识别的数字信息。
而本次设计即基于A/D转换器的原理,通过一个A/D(ADC0832模拟数字转换)芯片采集外界信息后,将外测电压信号转换成数字信号,再由AT89C51单片机分析并处理信号,最终输出信号,由160128液晶曲线显示两路电压。
2.2总体设计本设计从各个角度分析了由单片机组成的数字电压表的设计过程及各部分电路的组成及其原理,并且分析了如何驱动单片机进而使系统运行起来的原理和方法。
框图如图1:图1 总体设计框图3芯片介绍3.1AT89C51单片机AT89C51是一种低功耗、高性能CMOS8位微控制器,具有4K 在系统可编程Flash 存储器。
ADC0832模数转换与显示.详述
符串 • Set_Disp_Pos(0x46);
置显示位置 • i=0; • while(Display_Buffer[i]!='\0') • LCD_Write_Data(Display_Buffer[i++]) ;
•
• while(1)
•{
• //获取AD转换值,最大值255对应于最高电压5.00v
• //本例中设计为显示三个数位,故使用500
• d=Get_AD_Result()*500.0/255;
//设置显示位置
//将AD转换后得到数据分解为三个数位 • Display_Buffer[0]=d/100+'0'; • Display_Buffer[2]=d/10%10+'0'; • Display_Buffer[3]=d%10+'0'; • Set_Disp_Pos(0x01);
程序总流程图
2、A/D转换子程序
A/D转换子程序用来控制对输入模块电压信号 的采集测量,并将对应的数值存入相应的 内存单元。
A/D转换子程序流程图
3、LCD显示子程序
LCD显示程序的设计一般先要确定LCD的初 始化、光标定位、确定显示字符。
实物图
总结
• 本次设计即基于A/D转换器原理,通过一个A/D( ADC0832模拟数字转换)芯片采集外界信息后, 将外侧电压信号转换成数字型号,再由AT89C51 单片机分析并进行处理信号,最终输出信号,由 1602液晶曲线显示。
实验ADC0832数模转换的显示
硬件连接
将ADC0832的VCC和GND连接 到数字电源和地线
将ADC0832的OUT引脚连接到微 控制器的模拟输入引脚
将ADC0832的 S TA R T / C O N V S T 和 C / D 连 接 到 微 控 制 器 的 S TA R T / C O N V S T 和 C/D引脚
实验ADC0832数模转换 的显示
XX,a click to unlimited possibilities
汇报人:XX
目录
01 添 加 目 录 项 标 题 03 实 验 操 作 步 骤
02 A D C 0 8 3 2 数 模 转 换器介绍
04 实 验 结 果 分 析
05 A D C 0 8 3 2 的 优 缺 点
实验结果:通 过显示器观察 到数字信号转 换为模拟信号 的过程,以及 模拟信号的波
形
结果分析:分 析实验结果, 验证数模转换 的正确性和精
度
实验结论:得 出实验结论, 总结数模转换 在现实应用中 的意义和价值
Part Four
实验结果分析
实验数据展示
输入信号的频率和幅度
数模转换器的分辨率和精 度
集成更多的功能和接口
Part Six
数模转换器的发展 趋势
数模转换器技术发展历程
早期数模转换器: 精度低,速度慢, 应用范围有限
8位数模转换器: 精度提高,速度 加快,广泛应用 于消费电子产品
高精度数模转换 器:12位、16位 甚至更高精度, 满足高精度测量 和控制系统需求
高速数模转换器: 高采样率,低失 真,适用于宽带 信号处理和雷达 系统等
Part Five
ADC0832的优缺 点
adc0832的工作原理
adc0832的工作原理ADC0832是一款8位精密模数转换器,它具有许多特性,使其成为许多数字系统的理想选择。
在本文中,我们将深入探讨ADC0832的工作原理,以便更好地理解它的功能和应用。
首先,让我们来了解一下ADC0832的基本工作原理。
ADC0832采用了双重转换技术,即首先进行采样保持(S/H)转换,然后进行模数(A/D)转换。
在采样保持转换阶段,输入信号被采样并保持在一个电容器中,以确保在进行模数转换时能够获得准确的输入信号。
接下来,在模数转换阶段,采样保持电压被转换成相应的数字输出,该输出可以通过数字接口进行读取和处理。
ADC0832的工作原理主要涉及到其内部的运算放大器、采样保持电路和模数转换器。
首先,运算放大器负责放大输入信号,并将其传递给采样保持电路。
采样保持电路则负责对输入信号进行采样和保持,并将其传递给模数转换器进行数字化处理。
模数转换器则将模拟信号转换为相应的数字输出,以便于数字系统进行进一步处理和分析。
此外,ADC0832还具有一些特殊的工作原理,如内部参考电压源和串行接口。
内部参考电压源可以提供稳定的参考电压,以确保模数转换的准确性和稳定性。
而串行接口则可以方便地与微控制器或其他数字系统进行通信,实现数据的传输和控制。
总的来说,ADC0832的工作原理是基于运算放大器、采样保持电路和模数转换器的协同作用,通过将模拟信号转换为数字输出,实现对输入信号的准确采样和数字化处理。
同时,其内部的特殊工作原理也为数字系统的应用提供了便利和稳定性。
在实际应用中,了解ADC0832的工作原理对于正确使用和优化其性能至关重要。
只有深入理解其内部原理,才能更好地设计和调试数字系统,实现更高的性能和稳定性。
因此,通过深入研究和理解ADC0832的工作原理,可以更好地发挥其在各种数字系统中的作用,为工程应用提供更多可能性和创新空间。
综上所述,ADC0832是一款功能强大的8位精密模数转换器,其工作原理基于运算放大器、采样保持电路和模数转换器的协同作用。
单片机驱动ADC0832模数转换程序
单片机驱动ADC0832模数转换程序ADC0832是美国国家半导体公司生产的一种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℃ to +85℃模数转换芯片是用来模拟信号转为数字信号以便电脑处理的,可以用来对传感器的数据进行收集分析。
本来想买ADC0809的,它可以对8个模拟量进行采集,假如是一个脚用三个压力传感器,那就正好够用了。
这个ADC0832是跟单片机开发板一个淘宝店买的,因为那个淘宝店没有ADC0809。
网上搜了个ADC0832的转换函数,拼了个程序在开发板的四位数码管上显示转换过来的数据,要注意的是那个显示函数是调一次只显示四位数码管的一位的,所以不能转换显示转换显示这样,要转换,显示一次二次三次四次,转换,显示一次二次三次四次这样。
ADC0832引脚及代码如下:(一晚没睡,等下准备回家过清明扫墓去。
归去来兮!问西楼禁烟何处好?绿野晴天道。
马穿杨柳嘶,人倚秋千笑,探莺花总教春醉倒。
)//头文件: #include ; #include ;//变量定义:unsigned char ly_dis[4];//定义显示缓冲区code unsigned chartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};//表:共阳数码管 0-9unsigned char l_posit=0; //显示位置//引脚定义:sbit SMG_q = P3^4; //定义数码管阳级控制脚(千位)sbit SMG_b = P3^5; //定义数码管阳级控制脚(百位)sbit SMG_s = P3^7; //定义数码管阳级控制脚(十位)sbit SMG_g = P3^6; //定义数码管阳级控制脚(个位) sbit CS= P0^5;sbit Clk = P0^6;sbit DATI = P0^4;sbit DATO = P0^4;unsigned char dat = 0x00;//AD值unsigned char count = 0x00;//定时器计数unsigned char CH;//通道变量//函数声明:void display(void);//显示函数,显示缓冲区内容void delay(void);//unsigned char GetValue0832(bit Channel); unsigned char adc0832(unsigned char CH);//主函数,C语言的入口函数:void main(){unsigned int i=0;int ltemp;while(1){if(i==100){ltemp=adc0832(1);//隔时取模数转换(0~255对应0.00-5.00的电压) ly_dis[0]=ltemp/100;//显示百位值ltemp=ltemp%100;ly_dis[1]=ltemp/10; //显示十位值ltemp=ltemp%10;ly_dis[2]=ltemp/1; //显示个位值ly_dis[3]=0; //显示小数点后一位0}i++;if(i==3000)i=0;display(); //调用显示调一次只显示一位轮流显示四位delay();}}//显示函数,参数为显示内容void display(){P0=0XFF;//switch(l_posit){case 0: //选择千位数码管,关闭其它位SMG_q=0;SMG_b=1;SMG_g=1;P0=table[ly_dis[0]]; //输出显示内容 break;case 1: //选择百位数码管,关闭其它位 SMG_q=1;SMG_b=0;SMG_s=1;SMG_g=1;P0=table[ly_dis[1]];break;case 2: //选择十位数码管,关闭其它位 SMG_q=1;SMG_b=1;SMG_s=0;SMG_g=1;P0=table[ly_dis[2]]&0x7f;break;case 3: //选择个位数码管,关闭其它位 SMG_q=1;SMG_b=1;SMG_s=1;P0=table[ly_dis[3]];break;}l_posit++; //每调用一次将轮流显示一位if(l_posit>;3)l_posit=0;}//延时子函数,短暂延时void delay(void){unsigned char i=10;while(i--);}/************************************************ ****************************函数功能: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 ;>;= 1; if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test)//比较前8位与后8位的值,如果不相同舍去。
51单片机 液晶显示 串行模数转换ADC0832
#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char//#define LCD_DATA P0;sbit DI = P3^4;//定义ADC各口数据;sbit D0 =P3^4;sbit CLK = P3^5;sbit CS = P3^6;sbit LCD_RS= P2^0;//定义LCD引脚sbit LCD_RW= P2^1;sbit LCD_E= P2^2;uchar code DIS[]={"ADC0832-----TEST"};//ADC832 测试;uchar code dsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;/*----------------------------------------------------------------------------------延时子程序----------------------------------*/void delay(uint a){ uint b;for(b=0;b<a;b++);}void delay400ms(void)////400ms延时{ uchar a = 5;uint b;while(a--){ b=7269;while(b--);}}/*-----------------------------------------------------------------------------------读状态----------------------------------------*///读状态子程序;有返回值;返回值类型为CHAR型;//读回的状态通过RETURN返回;uchar read_estate(void) //定义有返回值的函数;{ P0=0Xff; //把LCD端口全置1方便读取信号; LCD_RS=0; //RS置0;LCD_RW=1; //RW置1;LCD_E=0; //E端置0;delay(10); //短延时;LCD_E=1; //E端置1;以锁存数据; while(P0&0x80); //检测忙,则一直循环;return(P0); //返回读取的信号;}/*------------------------------------------------------------------------------------ 写数据------------------------------------------*///写数据子程序;无返回值;输入变量I;//I为要写入LCD中的数据;//数据类型CHAR形;void write_data(uchar i) //定义输入变量值I;{read_estate(); //检测忙信号;P0=i; //把I中数据送到LCD数据端;LCD_RS=1; //RS置1;LCD_RW=0; //RW置0;LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据;}/*--------------------------------------------------------------------------------------- 写指令--------------------------------------------*///写指令子程序;无返回值;输入二个变量I和J.//I为要写入LCD的指令;J为判断要不要检测忙.//如果J为0则不判断检测忙;//如果J为1则判断检测忙;void write_dictate(uchar i,j) //定义二个变量;{if(j)read_estate(); //根据需要检测忙;P0=i; //把要写入的数据送到LCD数据端; LCD_RS=0; //RS置0;LCD_RW=0; //RW置0;LCD_E =1; //E端置0;delay(10); //延时;LCD_E =0; //E端置1;以锁存数据;}/*----------------------------------------------------------------------------------读数据--------------------------------------*///读数据子程序;有返回值,返回值类型为CHAR型;/*uchar read_data(void) //定义有返回值的子函数;{LCD_DATA=0Xff; //LCD数据端口置1;LCD_RS=1; //RS置1;LCD_RW=1; //RW置1;LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据;return(LCD_DATA); //返回读取的值;}/*--------------------------------------------------------------------------------------- LCD初始化-----------------------------------------*///LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;void initialization(void) //定义函数;{delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50);write_dictate(0x38,1); //显示模式设置;检测忙;write_dictate(0x08,1); //关闭显示;检测忙;write_dictate(0x01,1); //显示清屏;检测忙;write_dictate(0x06,1); //显示光标移动设置;检测忙;write_dictate(0x0C,1); //显示开及光标设置;检测忙;}/*----------------------------------------------------------------------------------在指定位置显示一个字符----------------------*/void displayonechar(uchar x, y,ddata){y &= 0x01;x &= 0x0f; //限制X不能大于15,Y不能大于1 if (y) x+= 0x40; //当要显示第二行时地址码+0x40;x+= 0x80; //算出指令码write_dictate(x,0); //这里不检测忙信号,发送地址码write_data(ddata);}/*----------------------------------------------------------------------------------在指定位置显示一串字符----------------------*/void displaylistchar(uchar x,y,uchar code *ddata){uchar a=0;y&=0x01;x&=0xf;while(ddata[a]>0x20){ if(x<=0xff){displayonechar(x, y,ddata[a]);a++;x++;}}}/*----------------------------------------------------------------------------------读ADC0832的数据----------------------------------*/ unsigned char readadc(void){ unsigned char dat,i;CLK=0; //芯片复位CS=1;_nop_();CS=0;_nop_();DI=1; //启动位CLK=1;_nop_();CLK=0;DI=1; //配置位1CLK=1;_nop_();CLK=0;DI=0; //配置位2CLK=1;_nop_();CLK=0; //空闲位_nop_();CLK=1;DI=1;for(i=0;i<=8;i++){ //读出8字节数据dat=dat<<1;_nop_();CLK=1;//这里要先1后0...如果是先0后1则输出结果错误...if(DI){dat|=0x01;}_nop_();CLK=0;}CS=1;//关闭芯片return(dat);//返回数据}void main(){ uint dat;delay400ms();//延时400MSinitialization();//LCD复位;displaylistchar(0,0,DIS);//显示ADC832 测试;displayonechar(0,1,'O'); //在LCD是显示OUT:_.___Vdisplayonechar(1,1,'U');displayonechar(2,1,'T');displayonechar(3,1,':');displayonechar(5,1,'.');displayonechar(8,1,'V');while(1)//无限循环...一直读出电压值显示在LCD上;{ displayonechar(13,1,dsptab[readadc()/100]);displayonechar(14,1,dsptab[(readadc()%100)/10]);displayonechar(15,1,dsptab[readadc()%10]);//在LCD最右边显示255中的某一个数据;dat=readadc()/0.542;//0.542是255除以基准电压也就是ADC0832的VCC...得出来了...这个值可能每个人不同.displayonechar(4,1,dsptab[dat/100]);//下面三行显示电压...displayonechar(6,1,dsptab[(dat%100)/10]);displayonechar(7,1,dsptab[dat%10]);delay400ms();//延时400MS}}。
模数转换电路分析(ADC0832)18页
PSEN ALE EA
CH1 作为RV正2 输入端RINV1+进行输入。
96% 100%
10k
10k
1 2 3 4
CS CH0 CH1 GND
VCC CLK
DI DO
8 7 5 6
U2 ADC0832
+88.8
Volts
+88.8
Volts
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
(1)当要进行A/D转换时,须先将CS使能端置于 低电平并且保持低电平直到转换完全结束。此时 芯片开始转换工作;
(2)同时由处理器向芯片时钟输入端CLK 输入时 钟脉冲,DO/DI端则使用DI端输入通道功能;
(3)在第1 个时钟脉冲的下沉之前DI端必须是高 电平,表示启始信号。在第2、3个脉冲下沉之前 DI端应输入2 位数据用于选择通道功能;
模数转换(ADC0832)应用
一、 ADC0832介绍 二、C语言程序设计 三、实训
一、 ADC0832介绍
1、Feature
8-Bit Resolution; Easy Microprocessor interface or Stand-Alone Operation; Operates Ratiometrically or With 5-V Reference; Single Channel or Multiplexed Twin Channels With Single-Ended or Differential Input Options; Input Range 0 to 5 V With Single 5-V Supply; Inputs and Outputs Are Compatible With TTL and MOS Conversion Time of 32 ms at CLK = 250 kHz; Designed to Be interchangeable With National Semiconductor ADC0831 and ADC0832
51单片机 数码管显示 串行模数转换ADC0832
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//#define disdata P0 //显示数据段码输出口#define channel_0 0x02 //单通道0输入选择#define channel_1 0x03 //单通道1输入选择sbit ADC_DI = P3^4; //数据输入输出复用sbit ADC_DO = P3^4; //DI和DO端都接在P1.0sbit ADC_CLK= P3^5; //时钟端sbit ADC_CS = P3^6; //片选端sbit ACC0=ACC^0; //通道与输入方式控制字sbit ACC1=ACC^1; //通道与输入方式控制字sbit DISX=P0^7; //LED小数点uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};// 0 1 2 3 4 5 6 7 8 9 关闭//uchar code dis_scan[3]={0x00,0x01,0x02}; //列扫描控制字uint data dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元/********************************************************************//* *//* 延时函数*//* *//********************************************************************/delay(int ms){int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}/********************************************************************//* *//* 启动ADC转换*//* *//********************************************************************/ADC_start(){ADC_CS=1; //一个转换周期开始_nop_();ADC_CLK=0;_nop_();ADC_CS=0; //CS置0,片选有效_nop_();ADC_DI=1; //DI置1,起始位_nop_();ADC_CLK=1; //第一个脉冲_nop_();ADC_DI=0; //在负跳变之前加一个DI反转操作_nop_();ADC_CLK=0;_nop_();}/********************************************************************//* *//*AD转换函数*//*选择输入通道,输入信号的模式《单端输入,或差分输入》*//* *//********************************************************************/ADC_read(uchar mode){uchar i;ADC_start(); //启动转换开始ACC=mode;ADC_DI=ACC1; //输出控制位1,DI=1,单通道输入,DI=0,差分输入。
ADC0832模数转化与
#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delay4us() {_nop_();_nop_();_nop_();_nop_();}sbit RS = P2^0;sbit RW = P2^1;sbit E = P2^2;sbit CS = P1^0;sbit CLK = P1^1;sbit DIO = P1^2;uchar Display_Buffer[] = "000.0V";uchar code Line1[] = "Current V oltage:";void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}bit LCD_Busy_Check()//检查LCD是否忙碌{bit result;RS = 0;RW = 1;E = 1;delay4us();result = (bit)(P0&0x80);E = 0;return result;}void LCD_Write_Command(uchar cmd)//LCD写命令{while(LCD_Busy_Check());RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd;delay4us();E = 1;delay4us();E = 0;}void Set_Disp_Pos(uchar pos) //置数{LCD_Write_Command(pos | 0x80);}void LCD_Write_Data(uchar dat)//LCD写数据{while(LCD_Busy_Check());RS = 1;RW = 0;E = 0;P0 = dat;delay4us();E = 1;delay4us();E = 0;}void LCD_Initialise() //LCD初始化{LCD_Write_Command(0x38); DelayMS(1);LCD_Write_Command(0x0c); DelayMS(1);LCD_Write_Command(0x06); DelayMS(1);LCD_Write_Command(0x01); DelayMS(1);}uchar Get_AD_Result() //单片机从AD0832获得数据{uchar i,dat1=0,dat2=0;CS = 0;DIO = 1;_nop_();CLK = 0;_nop_(); _nop_();CLK = 1; _nop_(); _nop_();CLK = 0;DIO = 1; _nop_(); _nop_();CLK = 1; _nop_(); _nop_();CLK = 0;DIO = 1; _nop_(); _nop_();CLK = 1;DIO = 1; _nop_(); _nop_();CLK = 0;DIO = 1; _nop_(); _nop_();//for(i=0;i<8;i++){CLK = 1; _nop_(); _nop_();CLK = 0; _nop_(); _nop_();dat1 = (dat1 << 1)| DIO ;}for(i=0;i<8;i++){dat2 = dat2|((uchar)(DIO)<<i);CLK = 1; _nop_(); _nop_();CLK = 0; _nop_(); _nop_();}CS = 1;return (dat1 == dat2) ? dat1:0;}void Sendc(uchar c){SBUF=c;while(TI==0);TI=0;}void Sends(uchar *s){while(*s!=’\0’);{Sendc(*s);s++;DelayMS(5);}}void main(){uchar i;uint d;TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2SCON=0x40; //SCON=0100 0000B,串口工作方式1PCON=0x00; //PCON=0000 0000B,波特率9600TH1=0xfd; //根据规定给定时器T1赋初值TL1=0xfd; //根据规定给定时器T1赋初值TI=0;TR1=1; //启动定时器T1LCD_Initialise();DelayMS(100);Sends("Current V oltage:\n");DelayMS(100);while(1){d = Get_AD_Result()*2200.0/255; //将电压数放大一百倍Display_Buffer[0]=d/1000+'0';Display_Buffer[1]=d/100%10+'0';Display_Buffer[2]=d/10%10+'0';Display_Buffer[4]=d%10+'0';Set_Disp_Pos(0x01); //从第一行显示i = 0;while(Line1[i]!='\0'){LCD_Write_Data(Line1[i]);i=i+1;}Set_Disp_Pos(0x46); //从第二行显示i = 0;while(Display_Buffer[i]!='\0'){LCD_Write_Data(Display_Buffer[i]);i=i+1;}for(i=0;i<16;i++) //模拟检测数据{Sendc(Display_Buffer[i]); //发送数据i}DelayMS(100);}}。
实验 ADC0809-0832模数转换实验
实验十三ADC0809模数转换实验一、实验目的1、掌握ADC0809模/数转换芯片与单片机的连接方法及ADC0809的典型应用。
2、掌握用查询方式、中断方式完成模/数转换程序的编写方法。
二、实验说明本实验使用ADC0809模数转换器,ADC0809是8通道8位CMOS逐次逼近式A/D转换芯片,片内有模拟量通道选择开关及相应的通道锁存、译码电路,A/D转换后的数据由三态锁存器输出,由于片内没有时钟需外接时钟信号。
下图为该芯片的引脚图。
各引脚功能如下:IN0~IN7:八路模拟信号输入端。
ADD-A、ADD-B、ADD-C:三位地址码输入端。
八路模拟信号转换选择由这三个端口控制。
CLOCK:外部时钟输入端(小于1MHz)。
D0~D7:数字量输出端。
OE:A/D转换结果输出允许控制端。
当OE为高电平时,允许A/D转换结果从D0~D7端输出。
ALE:地址锁存允许信号输入端。
八路模拟通道地址由A、B、C输入,在ALE信号有效时将该八路地址锁存。
START:启动A/D转换信号输入端。
当START端输入一个正脉冲时,将进行A/D转换。
EOC:A/D转换结束信号输出端。
当 A/D转换结束后,EOC输出高电平。
Vref(+)、Vref(-):正负基准电压输入端。
基准正电压的典型值为+5V。
V CC和GND:芯片的电源端和地端。
三、实验步骤1、单片机最小应用系统1的 P0口接A/D转换的D0~D7口,单片机最小应用系统1的Q0~Q7口接0809的A0~A7口,单片机最小应用系统1的WR、RD、P2.0、ALE、INT1分别接A/D转换的WR、RD、P2.0、CLOCK、INT1,A/D转换的IN接入+5V,单片机最小应用系统1的P1.0、P1.1连接到串行静态显示实验模块的DIN、CLK。
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加 AD转换.ASM源程序,进行编译,直到编译无误。
adc0832模数转换的串行协议
竭诚为您提供优质文档/双击可除adc0832模数转换的串行协议篇一:单片机和adc0832的ad模数转换单片机和adc0832的ad模数转换在工业控制和智能化仪表中,通常由微型计算机进行实时控制及实时数据处理。
计算机所加工的信息总是数字量,而被控制或被测量的有关参量往往是连续变化的模拟量,如温度、速度、压力等等,与此对应的电信号是模拟信号。
模拟量的存储和处理比较困难,不适合作为远距离传输且易受干扰。
在一般的工业应用系统中传感器把非电量的模拟信号变成与之对应的模拟信号,然后经模拟(analog)到数字(digital)转换电路将模拟信号转成对应的数字信号送微机处理。
这就是一个完整的信号链,模拟到数字的转换过程就是我们经常接触到的adc(analogtodigitalconvert)电路。
模-数转换(adc)简介模-数转换原理adc的转换原理根据adc的电路形式有所不同。
adc电路通常由两部分组成,它们是:采样、保持电路和量化、编码电路。
其中量化、编码电路是最核心的部件,任何adc转换电路都必须包含这种电路。
adc电路的形式很多,通常可以并为两类:间接法:它是将采样-保持的模拟信号先转换成与模拟量成正比的时间或频率,然后再把它转换为数字量。
这种通常是采用时钟脉冲计数器,它又被称为计数器式。
它的工作特点是:工作速度低,转换精度高,抗干扰能力强。
直接法:通过基准电压与采样-保持信号进行比较,从而转换为数字量。
它的工作特点是:工作速度高,转换精度容易保证。
模—数转换的过程有四个阶段,即采样、保持、量化和编码。
采样是将连续时间信号变成离散时间信号的过程。
经过采样,时间连续、数值连续的模拟信号就变成了时间离散、数值连续的信号,称为采样信号。
采样电路相当于一个模拟开关,模拟开关周期性地工作。
理论上,每个周期内,模拟开关的闭合时间趋近于0。
在模拟开关闭合的时刻(采样时刻),我们就“采”到模拟信号的一个“样本”。
量化是将连续数值信号变成离散数值信号的过程。
adc0832芯片工作原理
adc0832芯片工作原理
ADC0832芯片是一种8位串行式模数转换器(ADC),其主要用途是将模拟信号转换为数字信号。
它是由8位逐次逼近型模数转换器和一个控制逻辑组成的。
该芯片的工作原理可以简单概括为以下几个步骤:
1. 时钟控制:ADC0832芯片需要外部提供时钟信号,它使用时钟信号来同步转换过程。
时钟信号通常由系统的主时钟提供,并通过控制信号进行配置。
2. 输入信号采样:ADC0832具有单通道输入,它可以接收来自传感器或其他模拟信号源的输入信号。
输入信号被采样并存储在输入采样保持电容中。
3. 开始转换信号:当需要进行模数转换时,通过向ADC0832芯片发送启动转换的控制信号来触发转换过程。
4. 逐次逼近转换:ADC0832使用逐次逼近型模数转换技术。
它将输入信号与一个内部比较器进行比较,并根据比较结果调整一个逐次逼近型数字-模拟转换器(DAC)输出电压。
逼近过程将持续进行,直到
逼近型DAC输出电压与输入信号的比较结果达到一定精度。
5. 转换结果输出:一旦转换完成,ADC0832芯片将转换结果以串行方式输出。
通过数据线将转换结果传输给外部的微控制器或其他数字设备。
需要注意的是,ADC0832芯片还具有一些配置寄存器,用于设置转换精度、参考电压和其他参数。
这些寄存器可以通过发送相应的控制信号来配置。
总的来说,ADC0832芯片通过时钟控制、输入信号采样、逐次逼近转换和转换结果输出等步骤,将模拟信号转换为相应的8位数字信号。
它是一种常用的模数转换器,在许多应用中广泛使用,如传感器接口、数据采集和控制系统等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电路所用元器件清单
0832介绍
• 工作时序与通道选择
主程序
• • • • • • • • • • • • • • • //主程序 //----------------------------------------------void main() { uchar i; uint d; //注意d的类型 LCD_Initialise(); //初始化LCD DelayMS(10); Set_Disp_Pos(0x01);
//设置显示位
//显示第一行字 //设
//显示电压值
系统程序设计
1、软件总体框图设计 系统软件的总体框架,主程序采用死循环 结构,在其中调节了三个子程序:初始化 程序,A/D转换子程序,动态显示子程序。 首先,单片机选A/D转换器,然后发出信号启 动A/D装换。若有,即信号采集,对A/D转 换器的数据输出口送来的数据进行存储, 数据处理完之后,将电压数值送显示器显 示出来。
程序总流程图
2、A/D转换子程序
A/D转换子程序用来控制对输入模块电压信号 的采集测量,并将对应的数值存入相应的 内存单元。
A/D转换子程序流程图
3、LCD显示子程序
LCD显示程序的设计一般先要确定LCD的初 始化、光标定位、确定显示字符。
实物图
总结
• 本次设计即基于A/D转换器原理,通过一个A/D( ADC0832模拟数字转换)芯片采集外界信息后, 将外侧电压信号转换成数字型号,再由AT89C51 单片机分析并进行处理信号,最终输出信号,由 1602液晶曲线显示。
//设置显示位置
while(1) { //获取AD转换值,最大值255对应于最高电压5.00v //本例中设计为显示三个数位,故使用500 d=Get_AD_Result()*500.0/255;
• • • • • • •
• • • •
//将AD转换后得到数据分解为三个数位 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++]) ;