实验十adc0832数模转换的显示
单片机驱动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位的值,如果不相同舍去。
0832 DA转换器实验

集美大学计算机工程学院实验报告课程名称微机系统与接口技术实验名称实验五0832 D/A转换器实验实验类型设计型姓名学号日期地点成绩教师1. 实验目的及内容1.1实验目的1.了解数模转换的原理及与8086的接口逻辑。
2.掌握使用DAC0832进行数模转换的技术。
1.2实验内容1)设计DAC0832与8086CPU的硬件连接图,分配DAC0832的基地址为0FF00H。
2)设计DAC0832的硬件连接,编写程序,实现让0832依次输出方波、负向锯齿波、三角波、正弦波、,并不断重复。
要求在示波器上可看到每个波形2个完整的波形。
产生正弦波的数据如下:7FH,8BH,96H,0A1H,0ABH,0B6H,0C0H,0C9H,0D2H0DAH,0E2H,0E8H0EEH,0F4H,0F8H,0FBH,0FEH,0FFH,0FFH,0FFH,0FEH,0FBH,0F8H,0F4H0EEH,0E8H,0E2H,0DAH,0D2H,0C9H,0C0H,0B6H,0ABH,0A1H,096H,08BH07FH74H,69H,5EH,54H,49H,40H,36H,2DH,25H,1DH,17H11H,0BH,7,4,2,0,0,0,2,4,7,0BH11H,17H,1DH,25H,2DH,36H,40H,49H,54H,5EH,69H,74H3)画出各种波形的示意图,并在示意图上标示出波形的最高、最低峰值和周期(根据示波器测量各种波形的最高、最低峰值与波形的周期)。
2. 实验环境星研电子软件,STAR系列实验仪一套、PC机一台、导线若干3. 实验方法DAC0832是双列直插式8位D/A转换器。
能完成数字量输入到模拟量(电流)输出的转换。
本次实验将形成各种波形的数字量送给DAC0832D/A转换器形成模拟电流量,再将模拟量送到示波器显示出来。
编程时用地址0FF00H的选通作为CS和WR的控制信号,DAC0832输入一个数字量,经过转换器转换后变成一个电压模拟量,输出到示波器并显示,编程时设置一个合适的延时来间隔每个数字量的输入,当向示波器输入一组完整的波形数据后,示波器上显示将显示对应的完整波形。
实验 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源程序,进行编译,直到编译无误。
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即可。
数模转换器DAC0832的应用

实训报告十一实训目的:通过DAC0832作为D/A转换器,在虚拟显示正弦波或三角波,从而了解DAC0832的工作方式,把数字量转化为模拟量,学会利用c语言编程实现输出正弦波、三角波等波形。
实训原理图:实训步骤:1.在ptoteus平台找出所需的元器件2.理解该实验的原理,按照原理图画出仿真图;3.根据实验要求写出如下程序:#include <reg51.H>#include<absacc.h>#define DAC0832 XBYTE[0X12ef]unsigned char sindot[64]={0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3,0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c,0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0,0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e,0x38,0x43,0x4e,0x5a,0x66,0x73};//正弦代码表sbit K1=P2^7;//控制开关,void delay(unsigned char m)//延时{ unsigned char i;for(i=0;i<m;i++);}void main(void){unsigned char k;while(1){ if (K1==0)//K1为1时,输出三角波,K1为0时,输出为正弦波{for(k=0;k<64;){ DAC0832=sindot[k];//取正弦代码并输出k++;delay(10);}}else{ for(k=0;k<255;){ DAC0832=k;k+=5;delay(1);}for(k=255;k>0;){ DAC0832=k;k-=5;delay(1);}}}}总结:经过此次的实验,通过DAC0832作为D/A转换器,在虚拟显示正弦波或三角波,深刻地理解了DAC0832的结构以及工作方式。
使用DAC0832的DA转换实验

实验一使用DAC0832的D/A转换实验一、实验目的熟悉DAC0832数模转换器的特性和接口方法,掌握D/A 输出程序的设计和调试方法。
1、DAC0832结构DAC0832是用先进的CMOS/Si-Cr工艺制成的双列直插式单片8位D/A转换器。
它可以直接和8088CPU相接口。
它采用二次缓冲方式(有两个写信号/WR1、/WR2),这样可以在输出的同时,采集下一个数字量,以提高转换速度。
而更重要的是能够在多个转换器同时工作时,有可能同时输出模拟量。
它的主要技术参数如下:分辨率为8 位,电流建立时间为1us,单一电源5V-15V直流供电,可双缓冲、单缓冲或直接数据输入。
DAC0832内部结构见图5-3 。
图5-3 DAC0832内部功能* /LE=“1”,Q输出跟随D输入,/LE=“0”,D端输入数据被锁存2、DAC0832引脚功能*DI0~DI7:数据输入线,TTL电平,有效时间应大于90ns(否则锁存的数据会出错);*ILE:数据锁存允许控制信号输入线,高电平有效;*/CS:选片信号输入线,低电平有效;*/WR1:输入锁存器写选通输入线,负脉冲有效(脉宽应大于500ns)。
当/CS为“0”、ILE 为“1”、/WR1为“0”时,DI0~DI7状态被锁存到输入锁存器。
*/XFER:数据传输控制信号输入线,低电平有效;*/WR2:DAC寄存器写选通输入线,负脉冲(宽于500ns)有效.当/XFER为“0”且/WR2有效时,输入锁存器的状态被传送到DAC寄存器中;*Iout1:电流输出线,当输入为全1时Iout1最大;*Iout2:电流输出线,其值和Iout1值之和为一常数;*Rfb:反馈信号输入线,改变Rfb端外接电容器值可调整转换满量程精度;*Vcc:电源电压线,Vcc范围为+5V~+15V;*VREF:基准电压输入线,VREF范围为-10V~+10V;*AGND:模拟地;*DGND:数字地。
2、DAC0832工作方式根据对DAC0832的输入锁存器和DAC寄存器的不同的控制方法,DAC0832 有如下三种工作方式:(1) 单缓冲方式此方式适用于只有一路模拟量输出或几路模拟量非同步输出的情形。
黄杰-实验三十一、集成DAC0832数模转换实验

实验三十一、集成DAC0832数模转换实验一、实验目的:1、了解D/A转换的基本原理和基本结构、掌握大规模集成D/A转换器的功能及典型应用二、要求:1、学习D/A和转换的工作原理2、熟悉DAC0832引脚功能、使用方法3、会好完整的实践线路和所需的实验记录表格4、拟定实验内容的具体实验方案三、试验设备及器件:1、+5V、15V直流电源2、双踪示波器3、计数脉冲源4、逻辑电平开关5、逻辑电平显示器6、直流数字电压表实验原理集成DAC0832转换器为CMOS型8位数模转换器,它内部具有双数据锁存器,且输入电平与TTL电平兼容,所以能与8080、8085、Z-80及其他微处理器直接对接,也可以按设计要求添加必要的集成电路块而构成一个能独立工作的数模转换器,其引脚功能及其使用如下:(1)片选信号输入端,低电平有效。
(2)ILE输入寄存器允许信号输入端,高电平有效。
(3)1输入寄存器与信号输入端,低电平有效。
该信号用于控制将外部数据写入输入寄存器中。
(4)XEFR允许传送控制信号的输入端,低电平有效。
(5)2、寄存器写信号输入端,低电平有效。
该信号用于控制将输入寄存器的输出数据写入DAC寄存器中。
(6)D0~D7 8位数据输入端。
(7)Iout1、DAC电流流出1,在构成电压输出DAC时此线应外接运算放大器的反相输入端。
(8)Iout2、DAC电流输出2,在构成电压输出DAC时此线应接运算放大器的同相输入端一起接模拟地。
(9)Rfb反馈电阻引出端,在构成电压输出DAC时此端应接运算放大器的输出端。
(10)UREF基准电压输入端,通过该外引线将外部的高精度电压源与片内的R—2R电阻网络相连。
其电压范围为-10V~+10V。
(11)Vcc、DAC0832的电源输入端,电源电压范围为+5V~+15V。
(12)AGND模地、整个电路的模拟地必须与数字地相连。
(13)DGND数字地。
DAC0832是8位的电流输出型数/模转换器,为了把电流输出变成电压输出,可在数/模转换器的输出端接一运算放大器(LM324),输出电压Uo的大小有反馈电阻Rf决定,整个线路见图10—2。
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液晶曲线显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告十实验名称: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+进行输入。
到第三个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的下降沿DO端输出下一位数据。
直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降沿输出Data0。
随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
时序说明请参照图4。
作为单通道模拟信号输入时ADC0832的输入电压是0—5V且8位分辨率时的电压精度为19.53mV,即(5/256)V。
如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。
但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
硬件原理图:仿真图:程序如下所示:/*********************************包含头文件********************************/ #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位的值,如果不相同舍去。
若一直出现显示为零,请将该行去掉dat = test;_nop_();CS = 1; //释放ADC0832DATO = 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或0x01TMOD = 0x01; //设置中断TH0=(65536-50000)/256;//定时器1初值定时50msTL0=(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初值定时50msTL0=(65536-50000)%256;IE = 0x82;TR0 = 1;count++;if (count == 0x01){count = 0x00;dat = adc0832(CH);}}程序流程图:.现象:调节AD1,使AD1顺时针转动,LED1上的电压不断减小;调节AD0,使ADO顺时针转动,LED2上的电压不断减小。