基于51单片机的ADC0809多路测量
ADC0809芯片的原理及应用

目录引言(1)1 ADC0809的逻辑结构(1)1.1 ADC0809引脚结构(1)1.2 ADC0809的主要性能指标(3)1.3 ADC0809的部逻辑结构(3)1.4 ADC0809的时序(4)2 ADC0809与MCS-51单片机的接口电路(5)2.1 0809与51单片机的第一种连接方式(7)2.2 0809与51单片机的第二种连接方式(9)2.3 0809与51单片机的第三种连接方式(10)3 ADC0809与单片机制作的数字电压表(11)总结(16)参考文献(16)英文翻译(17)ADC0809芯片的原理及应用摘要:ADC0809是8位逐次逼近型A/D转换器,是目前应用比较广泛、典型的A/D转换芯片之一。
本文主要介绍ADC0809芯片的部逻辑结构、引脚分布,并详细阐述了其工作原理。
在此基础上设计了两种相关应用电路——ADC0809与单片机的接口电路及数字电压表,并对这两种应用电路的可行性进行了讨论。
通过对ADC0809应用电路的探究,能更全面的提高对应用系统的分析、设计能力,对实践具有重要的指导意义。
关键词:ADC0809;模数转换;单片机引言A/D转换器是模拟信号源与计算机或其它数字系统之间联系的桥梁,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机等数字系统进行处理、存储、控制和显示。
在工业控制和数据采集及许多其它领域中,A/D转换器是不可缺少的重要组成部分,它的应用已经相当普遍。
目前用软件的方法虽然可以实现高精度的A/D转换,但占用CPU时间长,限制了应用。
8位A/D转换器ADC0809作为典型的A/D转换芯片,具有转换速度快、价格低廉及与微型计算机接口简便等一系列优点,目前在8位单片机系统中得到了广泛的应用。
1 ADC0809的逻辑结构ADC0809是带有8位A/D转换器、8路模拟开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,是目前应用比较广泛的A/D转换芯片之一,主要适用于对精度和采样速率要求不高的场合或一般的工业控制领域,可以和单片机直接相连。
ADC08_09电压测量实验(基于查询、中断两种方式的数据读取)

·数字电压表1.实验任务利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,两位数码显示。
2.现有元件模数转换器ADC0809,STC89C52单片机,两个共阴极数码管。
3.硬件设计3.1模数转换器ADC0809与单片机STC89C52的连接(1) ADC0809规格及引脚分配图如下图3-1所示:图3-1 ADC0809引脚图(2) STC89C52各个引脚分布如下图3-2所示:图3-2 STC89C52引脚图(3) 硬件连线(a) 把“单片机系统”区域中的P3.0与”模数转换模块ADC0809“区域中的ST端子用导线相连接。
(b) 把“单片机系统”区域中的P3.1与”模数转换模块ADC0809“区域中的ALE端子用导线相连接。
(c) 把“单片机系统”区域中的P3.2与”模数转换模块ADC0809“区域中的EOC端子用导线相连接。
(d) 把“单片机系统”区域中的P3.6与”模数转换模块ADC0809“区域中的OE端子用导线相连接。
(e) 把“单片机系统”区域中的P3.7与”模数转换模块ADC0809“区域中的CLK端子用导线相连接。
(f) 把“模数转换模块ADC0809”区域中的ADDA、ADDB、ADDC端子用导线连接到单片机的VCC端子上。
把“模数转换模块ADC0809”区域中IN7与外接输入电压相连。
(g) 把“单片机系统”区域中的P2.0-P2.7连接到“模数转换模块ADC0809”区域中D0D1D2D3D4D5D6D7端子上。
(h) 把“单片机系统”区域中的P1.0-P1.7连接到“数码管”区域中ABCDEFGH端子上,且在P1.0-P1.7上分别接上0.5KΩ的上拉电阻。
把“单片机系统”区域中的P0.0-P0.1分别连接到两个共阴极“数码管”的GND。
4. 电路原理图图4 电路原理图5. 程序设计内容由于ADC0809在进行A/D转换时需要CLK信号,而此时ADC0809的CLK是接在单片机的P3.7口,也就是要求从P3.7输出CLK信号供ADC0809使用。
51单片机测量5V电压

51单片机测量5V电压数字电压表1. 实验任务利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V 之间的直流电压值,四位数码显示。
2. 现有元件模数转换器ADC0804,STC89C52单片机,两个共阳极数码管。
3. 硬件设计3.1 模数转换器ADC0809与单片机STC89C52的连接(1) ADC0809规格及引脚分配图如下图3-1所示:图3-1 ADC0809引脚图(2) STC89C52各个引脚分布如下图3-2所示:图3-2 STC89C52引脚图(3) 硬件连线(a) 把“单片机系统”区域中的P3.0与”模数转换模块ADC0809“区域中的ST 端子用导线相连接。
(b) 把“单片机系统”区域中的P3.1与”模数转换模块ADC0809“区域中的ALE 端子用导线相连接。
(c) 把“单片机系统”区域中的P3.2与”模数转换模块ADC0809“区域中的OE 端子用导线相连接。
(d) 把“单片机系统”区域中的P3.6与”模数转换模块ADC0809“区域中的EOC 端子用导线相连接。
(e) 把“单片机系统”区域中的P3.7与”模数转换模块ADC0809“区域中的CLK 端子用导线相连接。
(f) 把“模数转换模块ADC0809”区域中的ADDA 、ADDB 、ADDC 端子用导线连接到单片机的VCC 端子上。
把“模数转换模块ADC0809”区域中IN7与外接输入电压相连。
(g) 把“单片机系统”区域中的P2.0-P2.7连接到“模数转换模块ADC0809”区域中D0D1D2D3D4D5D6D7端子上。
(h) 把“单片机系统”区域中的P1.0-P1.7连接到“数码管”区域中ABCDEFG 端子上。
把“单片机系统”区域中的P0.0-P0.1连接到“数码管”区域中12端口。
4. 电路原理图图4 电路原理图5. 程序设计内容由于ADC0809在进行A/D转换时需要CLK 信号,而此时ADC0809的CLK 是接在单片机的P3.7口,也就是要求从P3.7输出CLK 信号供ADC0809使用。
ADC0809电压检测

2.1 简易数字电压表基本组成部分 .................................................................................................... 8 2.2 数字电压表模拟电路图 .................................................................................................................. 9 2.3 数字电压表模拟单路状态图 ......................................................................................................... 9
Keywords: SCM, double integral circuit, 89 51, ADC0809
目录
工程概况 ................................................................................................................................................... 1 第 1 章 系统方案的选择与论证 ................................................................................................. 1 设计任务 ................................................................................................................................................... 1
51单片机与ADC0809应用做AD转换(电路图附程序)

uchar AD_DATA[2]; II 保存INO 和IN1经AD 转换后的数据ADC0809与51单片机应用程序电路原理图如下:说明: DO 〜D7接51单片机的 P2 口(P2.0〜P2.7)ADIN1和ADIN2为通道IN0和IN1的电压模拟量输入(0〜5V )应用程序如下: #i nclude"reg52.h"#defi ne uchar un sig ned char sbit ST=P1A 0; sbit EOC=P1A1; sbit OE=P1A2; sbit CLK=P1A3; sbit ADDCS=P1A4;1 2 3 45 ST6 EOC"7DJ SO9CLK io 1 : 1121J DI 14XIINSIN2INITNIIN5 [NO EM6AIN7 B ST C EOC ALEDJ D7 OE D6 CT Ji D5VCCD4 Vrefb DO GNDVref-DI D2II 0592MHzADCO8O?^51^片■机嬪口电路矗应冃趕用ADIN! OE焉-ADDCS €LKI"ADDGW2008-5-18S —22 ____TTTr~DtS TT'D ?IS D4 17 DO 16 15 U2:Cl JOpFRST10 11IS19P1.0.-TPl.J/T TM iP1JPl.4 Pl.5 Pl .6Pl. 7RSTATDP3.O/RXD PJ .]/TO2PJ.2.-WTU P33.-WTIPJ.4/T0 PI-ST 】P3.6/WRPJ-VMXTAL2 XTAL1GidVccPOO PO.lPO.2 PO.3 F0.4 P0.5 P0.6P0.7EA/VPP J \LE-PROGPSEN P2.7 P2.6 PZ.5 Pi .4P2JP2.2P2.1 P2.0—39.17.沁J5J43332JI2" D624 D323~D222~01 21 DOVCC VCCC.T1lOUf27 ADIN2STFOCBy niica,******** 延时函数**********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; // 启动定时器T0ET0=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;OE=0;ST=0;ADDCS=1; // 选择通道IN1 delay(10);ST=1; //启动AD 转换delay(10);ST=0;while(0==EOC);OE=1;AD_DATA[1]=P2;OE=0;/***************** 主函数**************/void main()init();while(1)AD();。
DIY 51单片机 + ADC0809 示波器

通过对两个单片机的控制实现电压信号的采集以及显示波形,可以调整显示频率... 主单片机控制12864的显示,从单片机实现对ADC0809的驱动转换...下面是该系统的程序:主单片机:#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned int#define dataIO P1#define ADdataIO P0unsigned char p[]={0xf7,0xfb,0xfd,0xfe};int num;static int count=20;sbit RS=P2^5;sbit RW=P2^4;sbit E=P2^3;sbit PSB=P2^2;sbit NC=P2^1;sbit BF=P1^7;sbit EOC=P3^4;sbit EN=P3^5;static unsigned char DATA[128]=0;void delay(long int x){long int i;for(i=0;i<x;i++);}void checkbusy(){RS=0;RW=1;E=1;while(BF);E=0;}void transfer(uchar word ,bit a ,bit b) //数据交换, a:1数据, 0指令b:1读,0写。
// {checkbusy();RS=a;RW=b;E=1;dataIO = word;delay(2);E=0;RS=~RS;RW=~RW;}uchar readRAM(bit a)//a:1.data 2.cmd//{uchar x;checkbusy();dataIO=0xff;RS=a;RW=1;E=1;delay(2);x=dataIO;delay(2);E=0;RS=~RS;RW=~RW;return(x);}void clear(){transfer(0x01,0,0);delay(10);}void LCDstatus(uchar a){checkbusy();transfer(a,0,0);}void clr(){unsigned char x,y,i;checkbusy();transfer(0x36,0,0);for(i=0;i<9;i+=8)for(x=0;x<32;x++)for(y=0;y<16;y++){transfer(x+0x80,0,0);transfer(y+0x80+i,0,0);transfer(0x00,1,0);transfer(0x00,1,0);}}void Point(unsigned char x,unsigned char y){char x_real,y_real,data_H,data_L, Memory_H,Memory_L; if(x>=128||y>=64);else{if(y<32){x_real=x/16+0x80;y_real=0x80+y;}else{x_real=x/16+0x88;y_real=0x80+y%32;}if(x%16<8){data_H=(0x01<<(7-x%16));data_L=0;}else{data_H=0;data_L=(0x01<<(15-x%16));}checkbusy();transfer(0x36,0,0);transfer(y_real,0,0);transfer(x_real,0,0);transfer(0x34,0,0);transfer(0x30,0,0);checkbusy();readRAM(1);Memory_H=readRAM(1);Memory_L=readRAM(1);checkbusy();data_H=data_H|Memory_H;data_L=data_L|Memory_L;}checkbusy();transfer(0x36,0,0);transfer(y_real,0,0);transfer(x_real,0,0);transfer(data_H,1,0);transfer(data_L,1,0);}void reset(){delay(2000);transfer(0x30,0,0);delay(50); //选择基本指令集transfer(0x30,0,0); //选择8bit数据流delay(20);transfer(0x0c,0,0); //开显示(无游标、不反白)delay(20);transfer(0x01,0,0); //清除显示,并且设定地址指针为00Hdelay(500);transfer(0x06,0,0); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位delay(0);}void enterdata(char * word){while(*word!='\0'){transfer(*word,1,0);word++;delay(10);}}void line(uchar x0,uchar y0,uchar x1,uchar y1){char temp;char dx,dy; //定义起点到终点的横、纵坐标增加值char s1,s2,status,i;uchar Dx,Dy;int sub;dx=x1-x0;if(dx>=0) //X的方向是增加的{ s1=1;Dx=dx;}else //X的方向是降低的{ s1=-1;Dx=-dx;}dy=y1-y0; //判断Y的方向是增加还是降到的if(dy>=0){s2=1;Dy=dy;}else{s2=-1;Dy=-dy;}/******Dx=fabs(x1-x0); //计算横、纵标志增加值的绝对值Dy=fabs(y1-y0);******/if(Dy>Dx) //{ //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0 temp=Dx;Dx=Dy;Dy=temp;status=1;}elsestatus=0;/*********Bresenham算法画任意两点间的直线********/sub=2*Dy-Dx; //第1次判断下个点的位置for(i=0;i<Dx;i++){Point(x0,y0); //画点if(sub>=0){if(status==1) //在靠近Y轴区,x值加1x0+=s1;else //在靠近X轴区,y值加1y0+=s2;sub-=2*Dx; //判断下下个点的位置}if(status==1)y0+=s2;elsex0+=s1;sub+=2*Dy;}}main(){unsigned char x,x_m,y_m,i;TCON=0x05;IE=0x85;reset();clr();EOC=0;while(1){x_m=0;for(x=0;x<128;){if(EOC==1);{EN=1;DATA[x++]=ADdataIO;EN=0;i=0;while(i<=count)i++;}}y_m=DATA[0]/4;for(x=0;x<128;x++){line(x_m,y_m,x,DATA[x]/4);x_m = x;y_m = DATA[x]/4;}clr();}}void stop() interrupt 0 /*用两个外部中断实现对频率的控制*/ {count--;delay(100);}void stop1() interrupt 2{count++;delay(100);}从单片机程序:#include<reg51.h>sbit dataIO=P1;sbit ADD_A =P2^1;sbit ADD_B =P2^2;sbit ADD_C =P2^3;sbit ALE =P2^4;sbit START =P2^5;sbit EOC =P2^6;sbit EN =P2^7;void delay(){unsigned char i,j;for(i=0;i<34;i++)for(j=0;j<1;j++);main(){unsigned char DATA;START=0;ALE=0;ALE=1;ADD_A = 0;ADD_B = 1;ADD_C = 1;ALE=0;while(1){START=1; START=0; delay();}}。
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 charsbit 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; //启动定时器T0ET0=1;ST=0;OE=0;}/***********T0中断服务程序************/void t0(void) interrupt 1 using 0{CLK=~CLK;}/***********AD转换函数**********/void AD(){ST=0;ADDCS=0; //选择通道IN0delay(10);ST=1; //启动AD转换delay(10);ST=0;while(0==EOC);OE=1;AD_DATA[0]=P2;OE=0;ST=0;ADDCS=1; //选择通道IN1 delay(10);ST=1; //启动AD转换delay(10);ST=0;while(0==EOC);OE=1;AD_DATA[1]=P2;OE=0;}/*****************主函数**************/。
ADC0809
7 2
A/D转换器的主要技术指标 A/D转换器的主要技术指标
1.分辨率 .
分辨率表示输出数字量变化一个相邻数码所需输入模 拟电压的变化量。 拟电压的变化量。 转换器的分辨率定义为满刻度电压与2 之比值,其中n 转换器的分辨率定义为满刻度电压与 n之比值,其中 为ADC的位数。 的位数。 的位数 例如具有12位分辨率的 能分辨出满刻度的1/2 例如具有 位分辨率的ADC能分辨出满刻度的 12或 位分辨率的 能分辨出满刻度的 满刻度的0. 满刻度的12位 满刻度的 . 0245% 。 一个 % 一个10V满刻度的 位 ADC能 满刻度的 能 够分辨输入电压变化的最小值为2. 够分辨输入电压变化的最小值为 .4mV。 。
7
13
3.影响A/D转换技术指标的主要因素 影响A/D转换技术指标的主要因素 A/D 工作电源电压不稳定; 工作电源电压不稳定; 外接时钟频率不适合, 外接时钟频率不适合, 环境温度不适合; 环境温度不适合; 与其它器件的电特性不匹配,如负载过重; 与其它器件的电特性不匹配,如负载过重; 外界有强干扰; 外界有强干扰; 印刷电路板布线不合理。 印刷电路板布线不合理。
基于51单片机和ADC0809数模转换的C程序
#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned int/********************定义LCD1602接口信息********************************/sbit lcdrs=P3^0;//数据命令选择位sbit lcden=P3^1;//使能位sbit lcdrw=P3^2;/********************定义ADC0808接口信息********************************/sbit ADA=P2^0;sbit ADB=P2^1;sbit ADC=P2^2;sbit EOC=P2^3;sbit CLK=P2^4;sbit START=P2^5;sbit OE=P2^6;/*****************键盘管脚定义*************/sbit key1=P3^3;sbit key2=P3^7;/*********************定义数据********************************/uchar tab1[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};//存放AD采集数据uchar tab2[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};uchar tab3[]="TONGLU:";uchar tab4[]="DIANYA:";uchar tab5[]="12345678";uchar num,m=0,getdata=0;uint temp=0;/*延时函数*/void delay(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void delayl(uchar ltime){uchar i;for(i=ltime;i>0;i--)delay(255);}/*写命令函数*/void write_com(uchar com){lcdrs=0;P0=com;delay(10);lcden=1;delay(10);lcden=0;}/*写数据函数*/void write_data(uchar date){lcdrs=1;P0=date;delay(10);lcden=1;delay(10);lcden=0;}void disp(uchar h,l,uchar *p){write_com(0x80+h*0x40+l);while(*p!='\0'){write_data(*p);p++;}}/*初始化函数*/void LcdInit(){lcdrw=0;delay(5);lcden=0;//使能位置低电平write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delayl(20);}void TimeInit(){TMOD=0x10;//定时器1工作于方式1,16位不重装初值TH1=(65536-200)/256; //定时200us(5KHz)TL1=(65536-200)%256;EA=1;ET1=1;TR1=1;}void AdTr(bit ADDA,ADDB,ADDC,uchar channel){START=0;OE=0;START=1;START=0;//A/D转换启动信号,正脉冲启动选中的模拟信号开始转换ADA=ADDA;ADB=ADDB;ADC=ADDC;delay(5);while(EOC==0);//启动转换后EOC变为L,转换结束后变为HOE=1;getdata=P1;temp=getdata*1.0/255*500;OE=0;if(channel<4){tab1[4*channel]=temp/100+0x30;tab1[4*channel+2]=(temp%100)/10+0x30;tab1[4*channel+3]=(temp%100)%10+0x30;}if(channel>=4){channel=channel-4;tab2[4*channel]=temp/100+0x30;tab2[4*channel+2]=(temp%100)/10+0x30;tab2[4*channel+3]=(temp%100)%10+0x30;}}void keyscan()/* 按键2进行减1*/{uint k;if(key1==0){m--;if(m<5){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab1[4*(m-1)+k]);}if(m>=5&&m<9){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab2[4*(m-5)+k]);}if(m==1)m=1;}while(key1==0); //等待按键释放if(key2==0){m++;if(m<5){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab1[4*(m-1)+k]);}if(m>=5&&m<9){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab2[4*(m-5)+k]);}if(m==9)m=0;}while(key2==0); //等待按键释放}void main(){LcdInit();TimeInit();while(1){AdTr(0,0,0,0);delay(5);AdTr(0,0,1,1);delay(5);AdTr(0,1,0,2);delay(5);AdTr(0,1,1,3);delay(5);AdTr(1,0,0,4);delay(5);AdTr(1,0,1,5);delay(5);AdTr(1,1,0,6);delay(5);AdTr(1,1,1,7);delay(5);disp(0,0,tab3);disp(1,0,tab4);keyscan();}}void t1(void) interrupt 3 using 0 {TH1=(65536-200)/256;TL1=(65536-200)%256;CLK=~CLK;}。
51单片机 adc0809数码管
//51单片机控制adc0809读取外部模拟信号(只读取一路,0809上的ABC三个引脚接地,模拟信号由in0接入(0-5v电压),在数码管上显示当前的数值#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)sbit oe=P3^3;//(以下原来想与p1.4和p1.5相连,但是这连个引脚与蜂鸣器和继电器相连,结果连上之后老是响,我就与p3口相连了)sbit eoc=P3^2;sbit clk=P1^6;//为0809提供时钟sbit st=P1^7;//与0809的ale相连,一起启动a/d转换uchar getdata=0;//转换后得到数据uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管0-9void adc0809();//初始化0809并得到转换数据void delay(void);void display(uchar da);//显示数值void init();////初始化定时器0模式2(主要是为了给0809提供时钟)void main(){uint j;init(); //初始化定时器,为0809提供时钟while(1){ adc0809();//初始化0809j=200;//修改此值可以修改数值在数码管上的刷新速度(数值越大刷新的速度越慢)while(j--)display(getdata);//显示数值}}void init()//初始化定时器0模式2(主要用于给0809提供时钟){TMOD=0x02;//定时器0的模式2TH0=0xfb;//定时5usTL0=0xfb;TR0=1;//启动定时器0ET0=1;//开定时器0中断控制位EA=1;//开总中断}void time0() interrupt 1//定时器0中断{clk=~clk;}void adc0809()//初始化0809并得到转换数据{st=0;//以下三个表达式表示启动ad转换st=1;st=0;while(!eoc);//等待转换结束oe=1;//为高电平时,转换的数据输送个单片机getdata=P2;//从P2引脚读转换后的信息oe=0;}void display(uchar da)//显示数值{SMG_b=0; //选择百位数码管P0=table[(da*2)/100]&0x7f; //获取百位值,查表输出定义好的数码管段值与P0口,显示相应的0-9(&0x7f表示显示小数点)delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_b=1; //关闭百位数码管SMG_s=0; //选择十位数码管P0=table[(da*2)%100/10]; //获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_s=1; //关闭十位数码管SMG_g=0; //选择个位数码管P0=table[(da*2)%10]; //获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_g=1; //关闭个位数码管}void delay(void){unsigned char i=10;while(i--);}。