文档库 最新最全的文档下载
当前位置:文档库 › C8051F020之 ADC 程序

C8051F020之 ADC 程序

C8051F020之 ADC 程序
C8051F020之 ADC 程序

C8051F020(简称F020)是美国德州Cygnal公司推出的一种混合信号SOC型8位单片机。它属于C8051F系列中的F02X子系列。其性能价格比在目前应用领域极具竞争力。F020具有8路12位A/D转换(简称ADC)接口和8路8位在线可编程(ISP)的ADC 电路,片上的特殊功能寄存器(简称SFR)有15个与ADC的控制相关,它们是:

AMUX0SL-AMUX0通道选择寄存器,复位值为00000000;

AMX0CF-AMUX0配置寄存器,复位值为00000000;

ADC0CF-ADC0配置寄存器,复位值为11111000;

ADC0CN-ADC0控制寄存器,复位值为00000000;

ADC0H-ADC0数据字MSB寄存器,复位值为00000000;

ADC0L-ADC0数据字LSB寄存器,复位值为00000000;

ADC0GTH-ADC0下限数据高字节寄存器,复位值为11111111;

ADC0GTL-ADC0下限数据低字节寄存器,复位值为11111111;

ADC0LTH-ADC0上限数据高字节寄存器,复位值为00000000;

ADC0LTL-ADC0上限数据低字节寄存器,复位值为00000000;

AMX1SL-AMUX1通道选择寄存器,复位值为00000000;

ADC1CN-ADC1控制寄存器,复位值为00000000;

ADC1CF-ADC1配置寄存器,复位值为11111000;

ADC1-ADC1数据字寄存器,复位值为00000000;

REF0CN-基准电压控制寄存器,复位值为00000000;

ADC是混合信号控制器的重要功能,如欲在应用编程中得心应手,就必须对其相关的要素有较清晰的整体认识。

1、ADC的精度与通道

F020采用TQFP100封装,芯片引脚有8个(引脚18-25)专用于模拟输入,是8路12位ADC的输入端。每路12位的转换精度都是其自身的±1LSB(最低位)。实际上,对应12位逐次逼近寄存器型(SAR)ADC只有1个,在它与各输入端之间有1个具有9 通道输入

的多路选择开关(可配置模拟多路开关AMUX)。AMUX的第9通道连接温度传感器。在F020是中,12位ADC称为ADC0,另有8路8位在系统可编程(ISP)的ADC电路称为ADC1。其8个外接引脚与P1口复用,片内结构与ADC0相近,只是转换的位数为8位,转换精度为8位的±1LSB。

ADC0端口的每一对均可用编程设置成分别地单端输入或差分输入。差分输入时的端口配对为0-1、2-3、4-5、6-7,此设置由通道选择寄存器AMUX0SL的低4位和通道配置寄存器AMUX0CF的低4位确定。在AMX0CF中,位3~0各对应2个引脚通道。位值=0,表示是独立的单端输入(复位值均为单端输入);位值=1,表示是差分输入对。对应AMX0CF选差分输入时,AMUX0SL中只有在选双数(含0)通道时才有效(注:AMUX0SL低4位为

1xxx时,不论AMX0CF低4位为何值,均选温度传感器)。

将REF0CN的位3置"1"时,允许使用温

0"时,温度传感器的输出为高阻态。温度传感器的值可用于修正参数的非线性或记录、调整与温度相关的数据。

2、ADC的速率与启动

C8051F系列单片机中ADC的速率都是可用编程设置的,但最少要用16个系统时钟。一般在转换之前还自动加上3个系统时钟的跟踪/保持捕获时间(>1.5μs)。设置F020内ADC速率的方法是通过配置寄存器ADCxCF(x为0或1)的位7~3来进行的,其复位值为11111(位7~3=SYSCLK/CLKSAR-1)。

一般在启动ADC之前都要处于跟踪方式,控制寄存器ADCxCN的位6如果为"0",则一直处于跟踪方式(此时启动4种启动方式都可比跟踪启动快3个系统时钟);如为"1",则有4种跟踪启动方式可选择,即对ADCxCN中的位3~2赋值;00为向ADBUSY写1时跟踪(软件命令);01为定时器3溢出跟踪;10为CNVSTR上升沿跟踪(外部信号);11为定时器2溢出跟踪。

复位时,ADCxCN的位7为0,处于关断状态。每次转换结束时,ADCxCN的位5为"1",位4(忙标志)的下降沿触发结束中断,也可用软件查询这些状态位。

3、ADC的基准与增益

F020的片内有1个1.2V、15×10-6/℃的带隙电压基准发生器和1个两倍增益的输出缓冲器。2.4V的基准电压(VREF)可通过外引脚分别接入ADC0、ADC1和DAC中。VREF 对外带载能力为200μA(建议在驱动外部负载时,对地接1个负载电阻)。ADC使用偏置时,必须将参考源控制寄存器REFxCN中的位1置于"1";如置于"0",则关闭内部偏压,此时可通过VREF引脚(引脚12)使用外部基准电压,外部基准电压必须小于VAV±0.3V(还要大于1V)。不用ADC,也不用DAC时,可将REFxCN的位0置"0",使缓冲放大器处于省电方式(输出为高阻态)。

设置REF0CN的位4为"0"时,ADC0用VREF偏置,为"1"时,用DAC0输出偏置;设置为REF0CN的位3为"0"时,ADC1用VREF偏置,为"1"时,用AV+偏置。

在F020的ADC电路中,输入多路选择开关AMUX后面都带有1个可用编程设置增益的内部放大器(PGA)。当各模拟通道之间输入的电压信号范围差距较大时,或需要放大一个具有较大直流偏移的信号时(在差分输入方式,DAC可用于提供直流偏移)显得尤为有用。设置的方式是配置ADCxCF中的位2~0(000对应PGA的增益为1;001对应为2;010对应4;011对应为8;10x对应为16、11x对应为0.5)。这里的增益对温度传感器信号也起作用。当增益为1时,VTEMP=0.002 86(V/℃)(TEMPC)℃+0.776V。

4、ADC的数据与控制

对应单端输入,ADC结果数据字格式为:0V--0000,VREF--0FFF或FFF0。

对应差分输入,ADC结果数据字格式为2的补码:VREF--07FF,0--0000,-VREF--F800或8000。

将ADCxCN的位0置"0"可使结果右对齐;置"1"可使结果左对齐。当差分输入时,右对齐产生的多余高位是符号扩展位。

C8051F系列单片机内还设有数据相关窗口中断发生器或称可编程窗口检测器,也叫ADC上(下)数据寄存器ADC0G(L)TH(L),用后台方式监视一个关键电压。当转换数据位于规定的窗口之内(或之外)时,向控制器申请转换结束

口之内中断时,上限寄存器LT装入高位窗口数,下限寄存器GT装入低位窗口数;若要求在窗口之外中断时,则在下限寄存器GT中装入高位窗口数,在上限寄存器L T中装入下限窗口数。

复位时,ADC部分的状态为:内部电压基准缓冲器关闭、内部偏压关闭、内部传感器关闭、ADC禁止、转换结果数据寄存器右对齐、12位的端口均为单端输入、端口指向AIN0、SAR转换时钟为33个系统时钟、内部放大器增益为1、下限数据寄存器为FFFFH、上限数据寄存器为0000H。

综合F020中与ADC相关的各要素,要想正确应用ADC功能,应按下列顺序编程:设置参考电压>设置允许ADC>设置跟踪(启动)方式>设定数据对齐>配置通道>选择通道>设置转换时钟和增益>设定窗口检测上、下限>启动转换。操作SFR的顺序(以12位为例)为:REF0CN>ADC0CN>AMX0CF>AMUX0SL>ADC0CF>ADC0GTH>ADC0GTL>ADC0LTH>ADC0LTL>ADC0CN或其它启动方式。

基于51单片机的ADC0832数字电压表(仿真+程序)

仿真图: /*********************************包含头文件********************************/ #include #include /*********************************端口定义**********************************/ 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) {

51单片机控制ADC0809的电路图和源程序

ADC0809数模转换与显示 /* 名称:ADC0809数模转换与显示 说明:ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上。*/ #include #define uchar unsigned char #define uint unsigned int //各数字的数码管段码(共阴) uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit CLK=P1^3; //时钟信号 sbit ST=P1^2; //启动信号 sbit EOC=P1^1; //转换结束信号 sbit OE=P1^0; //输出使能 //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //显示转换结果 void Display_Result(uchar d) { P2=0xf7; //第4个数码管显示个位数 P0=DSY_CODE[d%10]; DelayMS(5); P2=0xfb; //第3个数码管显示十位数 P0=DSY_CODE[d%100/10]; DelayMS(5); P2=0xfd; //第2个数码管显示百位数 P0=DSY_CODE[d/100]; DelayMS(5); } //主程序 void main() { TMOD=0x02; //T1工作模式2 TH0=0x14; TL0=0x00; IE=0x82; TR0=1; P1=0x3f; //选择ADC0809的通道3(0111)(P1.4~P1.6) while(1) {

ADC0809模数转换与显示

ADC0809模数转换与显示 ADC0809模数转换与显示(第四次实验) 华侨大学08自动化 实验目的: 1. 掌握ADC的使用控制方法。实验内容:基本要求:设计一程序采集ADC0809第3通道的电压值,将其转换为数字量,并在数码管上显示;5V显示为255, 0V显示为000。扩展要求:将转换结果以两位小数精确显示,5V显示5.00, 2.3V显示2.30,依次推广之。 一、实验原理图: 二、程序流程图:

1 开始定时器初始化,对ADC0809初始化,选择通道3 给START一个脉冲,启动信号输入端判断EOC是否为0 N Y 将OE置1 读P3口数字数字处理,调用显示OE置0 返回三、源程序 1、基本要求: OE EQU P1.0 MOV SP,#60H EOC EQU P1.1 MOV TMOD,#02H ST EQU P1.2 MOV TH0,#14H CLK EQU P1.3 MOV TL0,#00H SHU EQU 30H MOV IE,#82H TEMP EQU 31H SETB TR0 ORG 0000H MOV A,#3FH AJMP MAIN MOV P1,A ORG 000BH MOV SHU,#0 CPL CLK SCAN: RETI CLR ST ORG 0100H SETB ST MAIN: CLR ST 2 M0: JNB EOC,M0 SETB OE

MOV A,#0FFH MOV P3,A M1: MOV A,P3 MOV SHU,A LCALL CHANGE LCALL DISP CLR OE AJMP SCAN DISP: MOV R0,#TEMP MOV R2,#00H DISP1:MOV A,R2 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P2,A MOV A,@R0 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A MOV R5,#5 ACALL DELAY INC R0 INC R2 2、扩展部分: OE EQU P1.0 EOC EQU P1.1 ST EQU P1.2 CLK EQU P1.3 SHU EQU 30H TEMP EQU 20H ORG 0000H AJMP MAIN ORG 000BH CPL CLK RETI ORG 0100H MAIN: MOV SP,#60H CJNE R2,#3,DISP1 MOV P0,#00H RET

AD转换器ADC0832程序

#include #include #define uchar unsigned char #define uint unsigned int sbit cs=P1^0; sbit clk=P1^3; sbit di=P1^4; sbit DO=P1^5; uint adval; uchar temp; uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delayms(uint ms) { uchar j; while(ms--) { for(j=0;j<120;j++); } } void ADC_start() { cs=1; _nop_(); clk=0; _nop_(); cs=0; _nop_(); di=1; _nop_(); clk=1; _nop_(); di=0; _nop_(); clk=0; _nop_(); } void ADC_read(uint ch) { uchar i; ADC_start(); if(ch==0) { clk=0; di=1; _nop_(); _nop_(); clk=1; _nop_();

_nop_(); clk=0; _nop_(); di=0; _nop_(); _nop_(); clk=1; _nop_(); _nop_(); } else { clk=0; di=1; _nop_(); _nop_(); clk=1; _nop_(); _nop_(); clk=0; _nop_(); di=1; _nop_(); _nop_(); clk=1; _nop_(); _nop_(); } clk=1; _nop_(); clk=0; for(i=0;i<8;i++) { di=1; if(DO) { temp=(temp|0x01); } else { temp=(temp&0xfe); } clk=0; _nop_(); clk=1; temp=temp<<1; } adval=temp;

ADC0809数模转换程序

/******************** //版权和版本声明 * 文件标识: * 摘要: * 当前版本:1.0 * 作者:输入作者(或修改者)名字 * 完成日期:2013年3月25日 **********************************/ #include //头文件 unsigned char code Tab[11]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; unsigned char dat[]={0,0,0,0}; unsigned char adc; unsigned int i,j,k; /***********ADC0808************************/ sbit LED = P2^3; sbit ST=P2^4; //定义ADC0809 位 sbit EOC=P2^5; sbit OE=P2^6; sbit CLK =P2^7; /************ 数码管位码****************/ sbit wei1=P3^7; //定义数码管为码位 sbit wei2=P3^6; sbit wei3=P3^5; sbit wei4=P3^4; /**************************** * 函数名称:延时函数

* 函数功能:延时函数 * 输入/输出参数: * 返回值: ***************************************/ void delay(unsigned int xms) //延时及clk 0809时钟{ for(i=0;i

ADC0809进行AD转换

ADC0809进行A/D转换(C描述) 2008-06-24 16:53 指针:可对内存地址直接操作 基于存贮器的指以贮器类为参量,它在编译时才被确定。因此为指针选择存贮器的方法可以省掉,以这些指针的长度可为1个字节(idata *,data *,pdata *)或2个这节(code *,xdata *)。 char xdata *address; ADC0809具有8个模拟量输入通道,采用中断方式,在中断函数中读取8个通道的A/D 转换值,分别存储在外部RAM的1000H~1007H单元。ADC0809端口地址为00F0H。 程序定义了两个指针变量* ADC和* ADCdata,分别指向ADC0809端口地址(00F0H)和外部RAM单元地址(1000H~1007H) 由*ADC=I送入通道数,启动ADC0809进行A/D转换,转换结束时产生INT1中断。在中断服务函数int1()中通过temp=*ADC和*ADCdata=temp;读取A/D转换结果并存到外部RAM中。 #include unsigned int xdata *ADC; /*定义ADC0809端口指针*/ unsigned int xdata *ADCdata; /*定义ADC0809数据缓冲器指针*/ unsigned char I; void main( ) { ADC=0x00f0; /*定义端口地址和数据缓冲器地址*/ ADCdata=0x1000; I=8; /* ADC0809有8个模拟输入通道*/ EA=1; EX1=1;IT1=1; /*开中断*/ *ADC=I; /*启动ADC0809*/ WHILE(I); /*等待8个通道A/D转换完*/ } void int1() interrupt 2 { unsigned char tmp; temp=*ADC; /*读取A/D转换结果*/ *ADCdata=temp; /*结果值存到数据缓冲区*/ ADCdata++; /*数据缓冲区地址加1*/ i—; *ADC=I; /*启动下一个模拟输入通道A/D转换*/ } 除了用指针变量来实现对内存地址的直接操作外,c51编译器还提供一组宏,该宏定义文件为:“absacc.h”,利用它可十分方便地实现对任何内存空间的直接操作,改写上面的程序: #include #include /*包含绝对地址操作预定义头文件*/ #define ADC 0x00f0; /*定义ADC0809端口地址*/

FPGA与ADC0809接口电路详解

FPGA与ADC0809接口电路详解 注:(1)本程序基于FPGA和vhdl编写 有详尽的程序解释和原理分析 以及原理图,状态图 (2)对于adc0809具体资料可上网查在此不累述 一.FPGA与ADC0809的接口电路图原理 二.关于ADC0809的说明(重点) (1)ale信号(引脚):高电平时把三个地址信号送入地址锁存器,并经译码器得到地址数据,以选择相应的模拟输入通道。 (2)oe信号(引脚)en使能信号:电平由低变高时,打开数据输出锁存器,将转换数据送到数据总线上 (3)eoc信号(引脚):eoc为高电平时完成转换,为低电平时正在转换。 (4)start信号(引脚):要给start线送一个100ns宽的启动正脉冲,start下跳沿时,开始进行A/D转换,在转换期间start以保持低电平。

三.转换状态图 对于状态图的真值表未列出 注意对应的注释为vhdl 语句 ale<='1';start<='0';en<='0'; ----eoc='1' ale<='0';start<='0';en<='0';--再次检测数据是否转换完 if eoc='0' then next_state<=st4; else next_state<=st5; 器,将数据送入数据总线 存器 四.ADC0809采样接口电路程序 --*********ADC0809采样控制************* --******因为FPGA 的时钟频率为50MHz ,则256分频后,即ADC0809输入时钟为195KHz****** --******对ADC0809进行简单的采样控制,得到的数据进FPGA 送到8个并排的数码管显示***** library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity PL_AD is port ( d : in std_logic_vector(7 downto 0); --ADC0809输出的采样数据输入FPGA clk,eoc: in std_logic; --clk 为系统时钟,eoc 为ADC0809转换结束信号输入FPGA lock1,start, ale,en: out std_logic; --ADC0809控制信号FPGA 输出信号 abc_in :in std_logic_vector(2 downto 0); --模拟选通信号 abc_out :std_logic_vector(2 downto 0);--ADC0809模拟信号选通信号 q : out std_logic_vector(7 downto 0));送至8个并排数码管信号FPGA 输出数字信号 end pl_AD; architecture behav of PL_AD is type states is ( st0,st1, st2, st3, st4,st5,st6);--定义状态类型枚举类型

ADC0809功能及程序介绍

ADC0809引脚图与接口电路 作者:来源:本站原创点击数:更新时间:2007年07月29日 A/D转换器芯片ADC0809简介 8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。 图9.8 《ADC0809引脚图》 1. ADC0809的内部结构 ADC0809的内部逻辑结构图如图9-7所示。

图9.7 《ADC0809内部逻辑结构》 图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D 转换器进行转换,这是一种经济的多路数据采集方法。地址锁存与译码电路完成对A、B、C 3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,表9-1为通道选择表。 表9-1 通道选择表 2.信号引脚 ADC0809芯片为28引脚为双列直插式封装,其引脚排列见图9.8。

对ADC0809主要信号引脚的功能说明如下: IN 7~IN ——模拟量输入通道 ALE——地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。 START——转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。本信号有时简写为ST. A、B、C——地址线。通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表9-1。 CLK——时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号 EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。 D 7~D ——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。 D 0为最低位,D 7 为最高 OE——输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。 Vcc—— +5V电源。 Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基 准。其典型值为+5V(Vref (+)=+5V, Vref (-) =-5V). 9.2.2 MCS-51单片机与ADC0809的接口ADC0809与MCS-51单片机的连接如图9.10所示。

51单片机驱动ADC0832模数转换程序lcd1602显示

51单片机驱动ADC0832模数转换程序 -lcd1602显示 /*这个芯应用不多*/ #include ; #define uchar unsigned char #define uint unsigned int uchar 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<

ADC0809与51单片机接口电路及应用程序

ADC0809与51单片机接口电路及应用程序 最近研究了下ADC0809这个芯片,做了个电路,和大家分享 电路原理图如下: 500)this.width=500;" border=0> 说明:D0~D7接51单片机的P2口(P2.0~P2.7) ADIN1和ADIN2为通道IN0和IN1的电压模拟量输入(0~5V) 应用程序如下: #include"reg52.h" #define uchar unsigned char sbit ST=P1^0; sbit EOC=P1^1; sbit OE=P1^2; sbit CLK=P1^3; sbit ADDCS=P1^4; uchar AD_DATA[2]; //保存IN0和IN1经AD转换后的数据

/**********延时函数************/ void delay(uchar i) { uchar j; while(i--) { for(j=125;j>0;j--) ; } } /*********系统初始化***********/ void init() { EA = 1; //开总中断 TMOD = 0x02; //设定定时器T0工作方式 TH0=216; //利用T0中断产生CLK信号 TL0=216; TR0=1; //启动定时器T0 ET0=1; ST=0; OE=0; } /***********T0中断服务程序************/ void t0(void) interrupt 1 using 0 { CLK=~CLK; } /***********AD转换函数**********/ void AD() { ST=0; ADDCS=0; //选择通道IN0 delay(10); ST=1; //启动AD转换 delay(10); ST=0; while(0==EOC) ; OE=1; AD_DATA[0]=P2;

ADC0809驱动FPGA实现的verilog程序

/*FPGA实现的程序:(verilog) 贴子回复于:2008-4-27 15:26:01*/ module AD0809(clk500K, //脉宽(至少100ns) rst_n, EOC, //约100us后EOC变为高电平转换结束 START, //启动信号,上升沿有效(至少100ns) OE, //高电平打开三态缓冲器输出转换数据 ALE, //高电平有效,选择信道口 ADDA, //因为ADDB,ADDC都接地了,这里只有ADDA为变量 DATA, //转换数据 DATA_R); output START,OE,ALE,ADDA; input EOC,clk500K,rst_n; input[7:0] DATA; output[7:0] DATA_R; reg START,OE,ALE,ADDA; reg[7:0] DATA_R; reg[4:0] CS,NS; parameter IDLE=5'b00001,START_H=5'b00010,START_L=5'b00100,CHECK_END=5'b01000,GET_DATA=5'b100 00; always @(posedge clk500K) case(CS) IDLE: NS=START_H; START_H: NS=START_L; START_L: NS=CHECK_END; CHECK_END: if(EOC) NS=GET_DATA; else NS=CHECK_END; GET_DATA: NS=IDLE; default: NS=IDLE; endcase always @(posedge clk500K) if(!rst_n) CS<=IDLE;

基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)

基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言) 主要部件:AT89S51 ADC0832 八段数码管 关键字:ADC0832程序C语言数字电压表 本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。该芯片能将0~5V的模拟电压量转换为0~255级的数字量,所以本文描述的数字电压表的量程为0~5V。 说实在话,量程只有5V的电压表没有什么实际的意义,而且也没有人无聊到自己会去做一个没有意义的电压表。但是通过这个简易电压表的制作你可以对模数转换芯片有一定的了解,对以后做真正有用的电路打下基础。而且,对于那些做毕业设计的同学也是一种参考。这也就是本文的意义所在。 ADC0832的资料百度一下可以找到一大堆,我就不在这里赘述了。这里只给出连接图。 以下是程序部分: 该程序是本人自编的,经测试可用,但不保证程序的可靠性及稳定性。若有转载请标明出处。 如果有同学将本程序烧写到单片机里却不能正常工作的,请注意以下三点: 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 #include /*********************************端口定义**********************************/ 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; //通道变量

实验十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 1 0 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+进行输入。到第三个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的下降沿DO端输出下一位数据。直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降沿输出Data0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D 转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。时序说明请参照图4。

ADC0832

https://www.wendangku.net/doc/b69187541.html, 电子技术—创造独立资源! AD转换芯片ADC0832的应用 https://www.wendangku.net/doc/b69187541.html, 原创(本文曾刊载于《电子制作》第 142期) V2.0 2007.2.11 目录 1. 概要 (1) 1.1 简介 (1) 1.2 接口示意图 (1) 1.3 芯片接口说明 (1) 2. 单片机对ADC0832的控制原理 (2) 2.1 ADC0832与单片机的接口电路 (2) 3. ADC0832芯片接口程序的编写 (4) 3.1 ADC0832数据读取程序流程 (4) 3.2 ADC0832芯片接口程序[汇编] (4) 版本信息 (6)

https://www.wendangku.net/doc/b69187541.html, 原创 1. 概要 1.1 简介 ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用 ADC0832可是使我们了解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; 1.2 接口示意图 1.3 芯片接口说明 CS_ 片选使能,低电平芯片使能。 CH0 模拟输入通道0,或作为IN+/-使用。 CH1 模拟输入通道1,或作为IN+/-使用。 GND 芯片参考0电位(地)。 DI 数据信号输入,选择通道控制。 DO 数据信号输出,转换数据输出。 CLK 芯片时钟输入。 Vcc/REF 电源输入及参考电压输入(复用)。

ADC0809做AD转换的C程序

ADC0809做AD转换的C程序 #include<> unsigned char code dispbitcode[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; unsigned char dispbuf[4]; unsigned int i; unsigned int j; unsigned char getdata; unsigned int temp; unsigned int temp1; unsigned char count; unsigned char d; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3; sbit P34=P3^4; sbit P35=P3^5; sbit P36=P3^6; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; sbit P17=P1^7; void TimeInitial(); void Delay(unsigned int i);// void TimeInitial()

{ TMOD=0x10; TH1=(65536-200)/256;//定时时间为2us,亦即CLK周期为 TL1=(65536-200)%256; EA=1; ET1=1; TR1=1; } void Delay(unsigned int i)//延时函数 { unsigned int j; for(;i>0;i--) { for(j=0;j<125;j++) {;} } } void Display()// { P1=dispbitcode[dispbuf[3]];//十位 P20=0; P21=1; P22=1; P23=1; Delay(10); P1=0x00; P1=dispbitcode[dispbuf[2]];//个位

ADC0832应用

ADC0832应用 这一课我们来学习ADC0832芯片的应用。模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,从前面的课程我们知道,数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路里,电平则理论上有无数个状态,比如0V、0.1V、0.2V…等等。如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程,同理的,也有DA转换过程。这一课,我们就利用实验板上的ADC0832芯片来实AD转换这一过程。ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用ADC0832可是使我们了解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℃ 下面看看它的引脚及功能。

图一ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。我们看看在实验板上它是怎么连接的。

adc0809上机参考程序

1、A/D0809实验 地址(16进制)机器码(16进制)汇编语言ASM 1100 BAA004 MOV DX, 04A0H ; 1103 B83400 MOV AX, 34H ; 1106 EF OUT DX, AX ; 1107 BAB004 MOV DX, 04B0H ; 110A BD0010 MOV BP, 1000H ; 110D 4D LAY1: DEC BP ; 110E 83FD00 CMP BP, 0 ; 1111 75FA JNE LAY1 ; 1113 ED WAIT1: IN AX, DX ; 1114 250100 AND AX, 1 ; 1117 3D0100 CMP AX, 1 ; 111A 75F7 JNE WAIT1 ; 111C BAA004 MOV DX, 04A0H ; 111F ED IN AX, DX ; 1120 25FF00 AND AX, 0FFH ; 1123 8BC8 MOV CX, AX ; 1125 BAA204 MOV DX, 04A2H ; 1128 B83400 MOV AX, 34H ; 112B EF OUT DX, AX ; 112C BD0010 MOV BP, 1000H ; 112F 4D LAY2: DEC BP ; 1130 83FD00 CMP BP, 0 ; 1133 75FA JNE LAY2 ; 1135 BAB004 MOV DX, 04B0H ; 1138 ED WAIT2: IN AX, DX ; 1139 250100 AND AX, 1 ; 113C 3D0100 CMP AX, 1 ; 113F 75F7 JNE WAIT2 ; 1141 BAA204 MOV DX, 04A2H ; 地址(16进制)机器码(16进制)汇编语言ASM 1144 ED IN AX, DX ; 1145 25FF00 AND AX, 0FFH ; 1148 8BD8 MOV BX, AX ; 114A BAA404 MOV DX, 04A4H ; 114D B83400 MOV AX, 34H ; 1150 EF OUT DX, AX ; 1151 BD0010 MOV BP, 1000H ; 1154 4D LAY3: DEC BP ; 1155 83FD00 CMP BP, 0 ; 1158 75FA JNE LAY3 ; 115A BAB004 MOV DX, 04B0H ; 115D ED WAIT3: IN AX, DX ;

adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)

仿真图: /*********************************包含头文件********************************/ #include #include /*********************************端口定义**********************************/ 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) {

相关文档