ADC0832的C语言驱动程序

合集下载

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd ,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 ,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。

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

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(&quot;Chanal 0:&quot;);writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan(&quot;Chanal 1:&quot;);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中文资料及汇编程序

;拉低 CLK 端,形成下降沿 3
R7,#8 C,ADDO ACC.0,C A ADCLK
;准备送下后 8 个时钟脉冲 ;接收数据 ;左移一次
ADCLK
;形成一次时钟脉冲
R7,AD_1 C,ADDO ACC.0,C B,A R7,#8 C,ADDO ACC.0,C
;循环 8 次 ;接收数据
;接收数据
作为单通道模拟信号输入时 ADC0832 的输入电压是 0~5V 且 8 位分辨率时的电压精度 为 19.53mV。如果作为由 IN+与 IN-输入的输入时,可是将电压值设定在某一个较大范围之 内,从而提高转换的宽度。但值得注意的是,在进行 IN+与 IN-的输入时,如果 IN-的电压 大于 IN+的电压则转换后的数据结果始终为 00H。 ADC0832 芯片接口程序的编写: 为了高速有效的实现通信,我们采用汇编语言编写接口程序。由于 ADC0832 的数据转 换时间仅为 32μS,所以 A/D 转换的数据采样频率可以很快,从而也保证的某些场合对 A/D 转换数据实时性的要求。数据读取程序以子程序调用的形式出现,方便了程序的移植。 程 序占用资源有累加器 A,工作寄存器 R7,通用寄存器 B 和特殊寄存器 CY。通道功能寄 存器和转换值共用寄存器 B。在使用转换子程序之前必须确定通道功能寄存器 B 的值,其 赋值语句为“MOV B,#data”(00H~03H) 。运行转换子程序后的转换数据值被放入 B 中。 子程序退出后即可以对 B 中数据处理。 ADC0832 芯片接口程序[汇编]: ;以下接口定义根据硬件连线更改 ADCS BIT P3.5 ;使能接口 ADCLK BIT P3.4 ;时钟接口 ADDO BIT P3.3 ;数据输出接口(复用) ADDI BIT P3.3 ;数据输入接口 ;以下语句在调用转换程序前设定 MOV B,#00H ;装入通道功能选择数据值 ;以下为 ADC0832 读取数据子程序 ;==== ADC0832 读数据子程序==== ADCONV: SETB ADDI ;初始化通道选择 NOP NOP CLR ADCS ;拉低/CS 端 NOP NOP

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

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 C程序

adc0832 C程序
通道6+,(单端方式)
// =1100 通道1+, =1101
通道3+,(单端方式)
// =1110 通道5+, =1111
通道7+,(单端方式)
//引脚/SE可以接地,不使用其控制反响字节的输出延时功能!
chanel |=0x10; //附加起始位
for(i=0; i<5; i++)
uchar adc083x_do_one_change(uchar chanel)
{
uchar data ad_val;
uchar data i;
//转换前的初始化
SET_ADC083X_CS;
CLR_ADC083X_CLK;
SET_ADC083X_DO;
CLR_ADC083X_CS;
关键词:ADCADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换
芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,
其目前已经有很高的普及率。学习并使用ADC0832 可是使我们了解A/D转换器
的原理,有助于我们单片机技术水平的提高。
adc0832 C程序
//功能:
// 读出AD数据字节
//输入:
// chanel 通道号以及单、双端设置选择,它的值被类型值限制!
// 即有效值是select分别取最低4、3、2位或不使用
// 具体的值参见pdf文档!
//输出:
// AD转换的结果字节
//********************************************************

单片机对串行A_D转换器ADC0832的C51编程

单片机对串行A_D转换器ADC0832的C51编程
[1 ] 蔡向 东. 单 片机 软件 模拟 SP I接 口的 解 决方 案 [ J ]. 信息 技术 , 2006 (6 ) : 134~135. [2 ] 王幸之 ,钟爱琴 ,王雷等. AT89系列单片机原理与 接口技术 [M ].
北京 :北京航空航天大学出版社 , 2004: 345 ~346.
3. 2 单片机串行口方式 0与 ADC0832 的接口 单片机串行工作方式时 , 串行口 是作为同步移 位寄存器使用 。这时以 RXD 端作为 数据移位的入 口和出口 ,而由 T XD 端提供移位时钟脉冲 。
图 3 STC89C51 串行口方式 0 时与 ADC 0832 的 接口
图 3 为单片机串 行口方式 0 与 ADC0832 的接 口 , 单片机 P1. 4 接 ADC0832的 CS, TXD (接 0832 的 CLK)作为时钟信号输出端 , RXD (接 0832 的 DO 和 D I) 作为启动位 、 配置位的发送端以及 A /D 转换后 输出数据的接收端 。由于 ADC0832 在 CS变低后的 前 3个周期内 , DO 端为高阻态 ; 转换开始后 , D I线禁 止 , 因此 , D I端和 DO 端可连接在一起 。 ADC0832的时钟频率最高为 400kHz, 单片机晶 振可选用 4M Hz, 在 TXD 的输出频率为 4MHz/ 12 = 333. 3kHz, 符合要求 。 ADC0832输出的串行数据共 15位 ,由两段 8 位 数据组成 , 前一段是最高 位在先 , 后一段是最 高在 后 , 两段数据的最低位共用 。只有在时钟的下降沿 , ADC0832的串行数据才移出一位 。由单片机控制时 钟信 号的 发送 , 并 由 TXD 发 出 , 以 达到 控 制 ADC 0832输出数据位的目的。为了得到一列完整的 8 位 数据 ,单片机分两次采集含有不同位的数据 , 再合成 一列完整的 8 位数据 。 (源程序略 ) 参考文献

单片机ADC0832液晶显示程序

单片机ADC0832液晶显示程序

//第三个脉冲
for(i=0;i<8;i++) {
clk=1; clk=0; if(dout) {
dat1|=0x80>>i; } } /* for(i=0;i<8;i++) {
clk=1; clk=0; if(dout) {
dat2|=0x01<<i; } } */ cs=1; din=1; clk=0; // if(dat1==dat2) // { return dat1; // }
if(*p=='\0') break; lcd_writedata(*p); p++; } }
//lcd 从第(行,列,字符)开始写
uchar adc0832(uchar channel) { /* uchar i=0;
uchar dat=0;
if(channel==0)channel=2; if(channel==1)channel=3; din=0;cs=1;clk=0; din=1;cs=0;clk=1;
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int /*.......引脚的定义得根据自己具体的板子原理图......*/ sbit cs =P1^2; //adc0832 使能端引脚定义 sbit din=P3^3; //adc0832 输入端定义
sbit dout=P3^2;
//adc0832 输出端定义
sbit clk=P1^1; //时钟引脚

ADC0832简单应用c程序

ADC0832简单应用c程序

ADC0832简单应用c程序#include#include "intrins.h"#define uint unsigned int#define uchar unsigned char//ADC0832的引脚sbit ADCS =P1^0; //ADC0832 chip seclectsbit ADDI =P1^2; //ADC0832 k insbit ADDO =P1^2; //ADC0832 k outsbit ADCLK =P1^1; //ADC0832 clock signalunsigned chardispbitcode[8]={0xf7,0xfb,0xfd,/*0xfe,0xef,0xdf,0xbf,0x7f*/}; //位扫描unsigned chardispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x 80,0x90,0xff} ; //共阳数码管字段码unsigned char dispbuf[3];uint temp;uchar getdata; //获取ADC转换回来的值void delayms(void) //12mhz delay 1.01ms{unsigned char x,y;x="10";while(x--){y="4";while(y--);}}void display(void) //数码管显示函数{char k;for(k=0;k<3;k++){P0 = dispbitcode[k];P2 = dispcode[dispbuf[k]];delayms();if(k==2) //加上数码管的dp小数点P2&=0x7f;delayms();P0=0xff;}}/************读ADC0832函数************///采集并返回unsigned int Adc0832(unsigned char channel) //AD转换,返回结果{uchar i="0";uchar j;uint dat="0";uchar ndat="0";if(channel==0)channel=2;if(channel==1)channel=3;ADDI="1";_nop_();_nop_();ADCS="0";//拉低CS端_nop_();_nop_();ADCLK="1";//拉高CLK端_nop_();_nop_();ADCLK="0";//拉低CLK端,形成下降沿1 _nop_();_nop_();ADCLK="1";//拉高CLK端ADDI="channel"&0x1;_nop_();_nop_();ADCLK="0";//拉低CLK端,形成下降沿2 _nop_();_nop_();ADCLK="1";//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK="0";//拉低CLK端,形成下降沿3 ADDI="1";//控制命令结束_nop_();_nop_();dat="0";for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK="1";_nop_();_nop_();ADCLK="0";//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j="0";j="j|ADDO";//收数据ADCLK="1";_nop_();_nop_();ADCLK="0";//形成一次时钟脉冲_nop_();_nop_();j="j"<<7;ndat="ndat|j";if(i<7)ndat>>=1;}ADCS="1";//拉低CS端ADCLK="0";//拉低CLK端ADDO="1";//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat); //return ad k}void main(void){while(1){getdata="Adc0832"(0);temp="getdata"*1.0/255*500; //电压值转换,5V做为参考电压,分成256份。

ADC0832的应用电路与源程序

ADC0832的应用电路与源程序
当此2位数据为“1”、“0”时,只对CH0进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
for(i=8;i>0;i--)
{
clk=1;
_nop_();
clk=0;
_nop_();
if(dout)
//addata1=(addata1"dout)<<1; //dout是1位(bit),addata1是8位(Byte),不能直接按位或
addata1=(addata1<<1)|0x01; //左移
return addata1;
else
return 0;
}
void main()
{
while(1)
{
P1=adconverse(0); //选择ch图如下:
参考程序如下(该程序已在硬件上调试通过):
#include <reg52.h>

stc89c52驱动ADC0832数模转换与显

stc89c52驱动ADC0832数模转换与显
}
//LCD忙状态检测
bit lcd_busy_check()
{
bit result;
rs=0;rw=1;e=1;
delay4us();
result=(bit)(P0&0x80);
e=0;return result;
}
//led命令
void lcd_write_command(uchar cmd)
{
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_();
while(lcd_busy_check());
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);

ADC0832驱动程序讲解

ADC0832驱动程序讲解

物理与电子工程系《电子设计与实践》
2011年春
一、 ADC0832介绍
3、与MCU的常用连接电路
物理与电子工程系《电子设计与实践》
2011年春
一、 ADC0832介绍 4、工作时序与通道选择
物理与电子工程系《电子设计与实践》
2011年春
MCU 对ADC0832控制过程:
(1)当要进行A/D转换时,须先将CS使能端置于 低电平并且保持低电平直到转换完全结束。此时 芯片开始转换工作; (2)同时由处理器向芯片时钟输入端CLK 输入时 钟脉冲,DO/DI端则使用DI端输入通道功能选择 的数据信号。 (3)在第1 个时钟脉冲的下沉之前DI端必须是高 电平,表示启始信号。在第2、3个脉冲下沉之前 DI端应输入2 位数据用于选择通道功能,其功能 项资料。
第十二 讲 模数转换(ADC0832)应用
一、 ADC0832介绍 二、C语言程序设计 三、实训
物理与电子工程系《电子设计与实践》
2011年春
一、 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

ADC0832——C程序

ADC0832——C程序

//******************adc0832****************************// sbit CS=P1^0; //使能。

sbit CLK=P1^1;//时钟sbit Do=P1^2; // 数据输出sbit Di=P1^2;//数据输入unsigned char CH=0x02;//通道的选择:0x02就是单通道0;0x03就是单通道1;//0x00就是双通道ch0=“+”;ch0=“-”//0x01就是双通道ch0=“-”;ch0=“+”//*****************************************************// unsigned char ADconv(void){unsigned char i;unsigned int data_f=0,data_c=0;Di=1;CS=1;_nop_();CS=0;Di=1; ;//芯片使能之前的初始化。

第一个下降沿CLK=1;_nop_();_nop_();/****************************************/CLK=0; // 确定通道模式、第2个下降沿_nop_();_nop_();CLK=1;Di=(bit)(0x02&CH); //设定通道初始化_nop_();CLK=0;_nop_();_nop_();CLK=1;Di=(bit)(0x01&CH); //设定通道初始化 .第3个下降沿_nop_();_nop_();CLK=0; //AD转化的初始化完成。

Di=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();CLK=1;for(i=8;i>0;i--)//得到一个正常排序的8位数据{data_f|=Do;data_f<<=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();}for(i=8;i>0;i--)//得到一个反序排列的8位数据{data_c<<=1;data_c|=Do;_nop_();CLK=1;_nop_();_nop_();CLK=0;_nop_();CLK=0;_nop_();_nop_();CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();CLK=1;_nop_();CS=1;_nop_();_nop_();return data_f;}void main(void){ unsigned int data_temp=0; while(1){ data_temp=ADconv();xs_int(196*data_temp,1);}}//***********************led.h*******************************************// //******************led1602**********/#include<intrins.h>#include<math.h>#define DD P2sbit Rs=P3^0;sbit Rw=P3^1;sbit E=P3^2;sbit busy_p=ACC^7;//********************************//void delay_1ms(unsigned char i) //最小延时1ms{ unsigned char j;while(i--)for(j=0;j<125; j++);}void delay_10ns(unsigned char i) //最小延时10ns{ unsigned char j;for(j=0;j<10; j++);}/*void rd_busy(void) //读忙。

adc0832程序

adc0832程序
while(1){
if(i==0){
tmp=ad0832read(1,0); //循环255个周期读取一次0832,因CPU运行比较快,没必要每次循环都去读取,选择通过CH0输入
l_tmpdate[0]=tmp/100; //得到百位
tmp=tmp%100;
{
unsigned char i=0,tmp=0,tmp2=0;
SCL=0;_nop_();_nop_();
SDA=1;_nop_();_nop_();
CS=0;_nop_();_nop_(); //开始
SCL=1;_nop_();_nop_(); //第一个上升沿
P2=0; //清0端口,准备显示下位
if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到P13数据
break;
P1++; //下一位数码管
}
}
////////////////延时子函数 /////////////////////////////////
SCL=1;_nop_();_nop_();
SCL=0;_nop_();_nop_();
}
CS=1;_nop_();_nop_(); //结束
SCL=1;
if(tmp==tmp2) //与校验数据比较,正确就返回数据,否则返回0
return tmp;
void display(unsigned char *lp,unsigned char lc);//显示函数
void delay(unsigned int timer); //延时子函数
unsigned char ad0832read(bit SGL,bit ODD); //读模数转换ADC0832的数据,参数为通道选择

ADC--ADC0832及其应用

ADC--ADC0832及其应用

DAC0832一) D/A转换器DAC0832DAC0832是采用CMOS工艺制成的单片直流输出型8位数/模转换器。

如图4-82所示,它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。

运算放大器输出的模拟量V0为:图4-82由上式可见,输出的模拟量与输入的数字量()成正比,这就实现了从数字量到模拟量的转换。

一个8位D/A转换器有8个输入端(其中每个输入端是8位二进制数的一位),有一个模拟输出端。

输入可有28=256个不同的二进制组态,输出为256个电压之一,即输出电压不是整个电压范围内任意值,而只能是256个可能值。

图4-83是DAC0832的逻辑框图和引脚排列。

图4-83D0~D7:数字信号输入端。

ILE:输入寄存器允许,高电平有效。

CS:片选信号,低电平有效。

WR1:写信号1,低电平有效。

XFER:传送控制信号,低电平有效。

WR2:写信号2,低电平有效。

IOUT1、IOUT2:DAC电流输出端。

Rfb:是集成在片内的外接运放的反馈电阻。

Vref:基准电压(-10~10V)。

Vcc:是源电压(+5~+15V)。

AGND:模拟地 NGND:数字地,可与AGND接在一起使用。

DAC0832输出的是电流,一般要求输出是电压,所以还必须经过一个外接的运算放大器转换成电压。

实验线路如图4-84所示。

图4-85IN0~IN7:8路模拟信号输入端。

A1、A2、A0 :地址输入端。

ALE地址锁存允许输入信号,在此脚施加正脉冲,上升沿有效,此时锁存地址码,从而选通相应的模拟信号通道,以便进行A/D转换。

START:启动信号输入端,应在此脚施加正脉冲,当上升沿到达时,内部逐次逼近寄存器复位,在下降沿到达后,开始A/D转换过程。

EOC:转换结束输出信号(转换接受标志),高电平有效。

OE:输入允许信号,高电平有效。

CLOCK(CP):时钟信号输入端,外接时钟频率一般为640kHz。

Vcc:+5V单电源供电。

ADC0832程序完整版-源码

ADC0832程序完整版-源码

ADC0832程序完整版源码+Proteus仿真来源:互联网作者:后都出现了一些奇怪的问题,有的根本没法读取数据,有的数据有错误。

当参考电压为5V时,如果把输入电压从0一直调到5V,读取的数据应该是从0到255,2.5V 时应该是128。

但是我发现一些源码在输入0~2.5V时读取出来的是0~255,到2.5V时读取的数据为0,从2.5到5V,读出的值又从0增加到255,始终不正确。

今天下午特地查阅的ADC0832英文原版的DataSheet,又参考了一篇中文文档,终于写出了其完整的程序,并且先后读取了MSB FIRST DATA和LSB FIRST DATA,进行比较,如果两个数据相等,返回读取的数据,否则返回0,这样可以避免读取发生错误,更稳定可靠。

并通过了Proteus仿真。

下图是ADC0832的时序图:其中T-SetUp为250ns,由于使用的是51单片机,晶振11.0592MHz,机器周期比这个值大,可以不考虑,但为了防止出现异常,还是延时了两个机器周期。

注意在第11个时钟下降沿之后,DO上的电平既是MSB FIRST输出的最后一位,又是LSB FIRST输出的第一位。

以下是读取ADC0832的代码。

[cpp] view plaincopysbit CS_0832 = P1^0;sbit CLK_0832 = P1^1;sbit DO_0832 = P1^2; // DI、DO不同时有效,可共用一个接口sbit DI_0832 = P1^2;extern void _nop_ ( void );#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0 //把模拟电压值转换成8位二进制数并返回unsigned char read0832(){unsigned char i, ch = 0, ch1 = 0;CS_0832=0; // 片选,DO为高阻态DI_0832=1;// 此处暂停T-SetUp: 250ns (由pulse0832完成)pulse0832(); // 第一个脉冲,起始位,DI置高DI_0832=1;pulse0832(); // 第二个脉冲,DI=1表示双通道单极性输入DI_0832=1;pulse0832(); // 第三个脉冲,DI=1表示选择通道1(CH2)// 51单片机为准双向IO口:应先写入1再读取DI_0832=1;// MSB FIRST DATAfor(i = 0; i < 8; ++i) {pulse0832();ch <<= 1;if(DO_0832==1)ch |= 0x01;}// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse// LSB FIRST DATAfor(i = 0; i < 8; ++i) {ch1 >>= 1;if(DO_0832==1)ch1 |= 0x80;pulse0832();}CS_0832=1; // 取消片选,一个转换周期结束return (ch==ch1) ? ch : 0; // 返回转换结果}。

ADC0832驱动子程序

ADC0832驱动子程序

1.ADC0832驱动子程序#include <REGX51.H>#include <intrins.h> //常用汇编指令引用。

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98}; //共阳代码//接口电路sbit AD0832_CS = P3^5ﻩ; //片选信号sbit AD0832_CLK = P3^6; //时钟接口sbit AD0832_DI = P3^7; //数据接口void main( void){unsigned char i=0 , x =0 , y = 0 ;unsigned int temp=0;while(1){//时钟12Mhz, 整个转换时间为224us//使用芯片准备(参考PDF时序图)ﻩAD0832_CLK = 0 ; //时钟置低平ﻩ AD0832_DI = 1 ; //开始信号为高电平ﻩ AD0832_CS = 0;//片选信号置低,启动AD转换芯片//输入开始信号(构成一个正脉冲)_nop_();ﻩAD0832_CLK = 1 ; //时钟上升沿,输入开始信号_nop_();ﻩ AD0832_CLK = 0 ; //时钟下降沿//模拟信号输入模式选择(1:单模信号,0:双模差分信号)AD0832_DI = 1 ;ﻩ _nop_();ﻩ AD0832_CLK = 1 ; //时钟上升沿,输入开始信号ﻩ _nop_();AD0832_CLK = 0 ; //时钟下降沿//模拟信号输入通道选择(1:通道CH1,0:通道CH0)AD0832_DI = 0 ; //选择通道0_nop_();ﻩAD0832_CLK = 1 ; //时钟上升沿,输入开始信号_nop_();ﻩ AD0832_CLK = 0 ; //时钟下降沿///////////////////////////////////////////AD0832_DI = 1; //数据线置高,准备接收数据for(i = 0 ; i<8 ; i++)ﻩ //从高位移入数据{ﻩ AD0832_CLK = 1 ;_nop_();AD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先x = x<<1;ﻩﻩﻩ//数据左移位,补0if(AD0832_DI ==1)ﻩx = x | 0x01; //如果数据为“1”,移入1,} ﻩﻩﻩﻩ //如果数据为“0”,移入0,for(i = 0 ; i<8 ; i++)ﻩ //从低位移入数据ﻩ{y = y>>1; ﻩ//数据左移位,补0if(AD0832_DI==1)ﻩy =y| 0x80;ﻩ //如果数据为“1”,移入1,ﻩﻩﻩ//如果数据为“0”,移入0ﻩ AD0832_CLK = 1 ;_nop_();ﻩAD0832_CLK = 0 ; //时钟下降沿,AD0832输出数据,高位(MSB)先}//数据线置高,释放总线,完成一次转换AD0832_CLK = 1 ;ﻩ AD0832_DI = 1 ;AD0832_CS = 1 ;ﻩﻩ if(x==y) //输出{ﻩ temp = x *2 ; //(参考电压为5V,8位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档