AD0832数据程序1

合集下载

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

基于单片机的数字电压表制作——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位的值,如果不相同舍去。

ADC0832的数字电压表设计说明

ADC0832的数字电压表设计说明

目录1. 引言 (1)2. 方案设计 (1)2.1设计要求 (1)2.2设计方案 (1)3. 硬件设计 (2)3.1单片机最小系统 (2)3.2显示驱动部分 (2)3.3转换电路 (3)3.4单片机驱动部分 (3)4. 软件设计 (4)4.1软件流程 (4)4.2子程序模板 (5)5实验结果与讨论 (5)5.1实验仿真 (5)5.2结果讨论 (5)6心得体会 (6)7参考文献 (13)8附录8.1程序 (7)8.2原理图 (7)1. 引言随着片机技术的飞速发展,,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发肢和社会信息化程度的提商,人们为了寻求最好的科技,为了方便人类在使用科技产品的快速性,准确性。

例如数字电压表能够准确的,快速的量出电压。

利用ADC0832和AT89C52的结合再通过LCD来显示出来。

ADC0832是一个8位D/A转换器。

单电源供电,从+5V〜+15V均可正常工作。

基准电压的围为土10V;电流建立时间为1卩S; CMOS:艺,低功耗20mWADC0832 转换器芯片为20引脚,双列直插式封装。

该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。

使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。

2. 方案设计2.1设计要求按系统要实现功能,设计必须达到以下的几个步骤的要求(1)主电路系统是由ADC0832单片机AT89C52和LCD显示屏组成。

(2)ADC083是模拟数字转换芯片,是将外侧电压信号转换成数字信号再通过AT89C52处理,再通过LCD显示出来(3)能测量0-5V的数字电压(4)测量误差不大于0.1V2.2设计方案2.1.1 单片机的选择本设计选用单片机AT89C52它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS位微处理器该器件采用ATME高密度非易失存储器制造技术制造,与工业标准的MCS-51指令系统及8052产品引脚兼容,功能强大、使用方便的AT80C52单片机适用于许多较为复杂的应用场合。

ADC0832驱动程序讲解

ADC0832驱动程序讲解

物理与电子工程系《电子设计与实践》
2011年春
(4)如资料 所示,当此2 位数据为“1”、“0”时,只对 CH0 进行单通道转换。当2位数据为“1”、“1”时,只对 CH1进行单通道转换。当2 位数据为“0”、“0”时,将 CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。 当2 位数据为“0”、“1”时,将CH0作为负输入端IN-, CH1 作为正输入端IN+进行输入。
for(i=0;i<8;i++) { clk=1; _nop_();_nop_(); clk=0; _nop_();_nop_(); dat1=dat1<<1| (uchar)(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; }
1、建立连接,启动转换; 2、接收数据; 3、数据处理。
物理与电子工程系《电子设计与实践》
2011年春
二、C语言程序设计
1、建立连接,启动转换
ADC0832时序图
物理与电子工程系《电子设计与实践》 2011年春
2、接收数据
sbit cs=P1^0; sbit clk=P1^1; sbit dio=P1^2;
物理与电子工程系《电子设计与实践》
2011年春
MSB(Most Significant Bit),意为最高有效位 ; LSB(Least Significant Bit)。
ADC0832时序图

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数模转换的显示
பைடு நூலகம்实验操作步骤
硬件连接
将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的优缺 点

51单片机 液晶显示 串行模数转换ADC0832

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简单应用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份。

wang1jin带您从零学单片机(ADC0832)

主 讲:wang1jin
技术支持:/bbs
电容阵列逐次比较型
电容阵列逐次比较型AD在内置DA转换 器中采用电容矩阵方式,也可称为电荷再 分配型。一般的电阻阵列DA转换器中多数 电阻的值必须一致,在单芯片上生成高精 度的电阻并不容易。如果用电容阵列取代 电阻阵列,可以用低廉成本制成高精度单 片AD转换器。最近的逐次比较型AD转换器 大多为电容阵列式的。
主 讲:wang1jin
技术支持:/bbs
主 讲:wang1jin
技术支持:/bbs
逐次比较型AD
逐次比较型(如TLC0831) 逐次比较型AD由一个比较器和DA转换 器通过逐次比较逻辑构成,从MSB开始, 顺序地对每一位将输入电压与内置DA转换 器输出进行比较,经n次比较而输出数字值。 其电路规模属于中等。其优点是速度较高、 功耗低,在低分辩率(<12位)时价格便 宜,但高精度(>12位)时价格很高。
读出数据
配置位设置完后,就可以从读出AD数据,数据需要经过校验再输出
主 讲:wang1jin
技术支持:/bbs
∑-Δ调制型
调制型AD由积分器、比较器、1位DA转 换器和数字滤波器等组成。原理上近似于 积分型,将输入电压转换成时间(脉冲宽度) 信号,用数字滤波器处理后得到数字值。 电路的数字部分基本上容易单片化,因此 容易做到高分辨率。主要用于音频和测量。
输入配置
8路AD内部结构
输入保护
比较电路 输入切换
DA电路
主 讲:wang1jin 保护电路
技术支持:/bbs
数据输出
WJ-V4.0 ADC0832原理图
二路AD输入接口 AD_CS VCC S22 1 2 3 4 CON4 S23 1 2 CON2 2 3 1 2 3 4 U17 CS VCC CH0 CLK CH1 D0 GND D1 ADC0832 C38 104 C39 104 8 7 6 5 VCC P24 P23 VCC AD_CS

基于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 仿真如下:。

ADC0832模数转换与显示.


ADC0832模数转换与显示
电路所用元器件清单
仿真图
ADC0832介绍
ADC0832介绍
• 工 • • • • • • • • • • //主程序 //----------------------------------------------void main() { uchar i; uint d; //注意d的类型 LCD_Initialise(); //初始化LCD DelayMS(10); Set_Disp_Pos(0x01);
//设置显示位置
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++]) ;
程序总流程图
2、A/D转换子程序
A/D转换子程序用来控制对输入模块电压信号 的采集测量,并将对应的数值存入相应的 内存单元。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#defne uint unsigned int
#defne uchar unsigned char
//ADC0832的引脚设置
sbit ADCS=P13^5; //ADC0832 chip seclect
sbit ADDI=P3^7; //ADC0832 K in
sbit ADDO=P3^7; //ADC0832 K out
sbit ADCLK=P3^6; // ADC0832 clock signal
unsigned char dispbuf[4];
uint temp;
uchar getdata; //获取ADC转换回来的值
/******************
读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
}

相关文档
最新文档