实验STC单片机ADC转换实验V
实验5 STC单片机ADC转换实验-V20170317

实验5 STC单片机ADC转换实验-V201703171.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317hex路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317\out\ADC.hex3.实验原理3.1 A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1 A/D相关寄存器P1ASF:P1口的模拟功能控制器。
STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。
需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。
P1ASF寄存器的定义如表3.2所示:表3.2 P1ASF寄存器定义ADC_CONTR:ADC控制寄存器。
该寄存器的描述如表3.3所示:表3.3 ADC_CONTR寄存器定义对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。
ADC_POWER: ADC电源控制位。
0:关闭A/D转换器电源1:打开A/D转换器电源建议进入空闲模式时,将ADC电源关闭,即ADC_POWER =0。
启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。
初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。
建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D 转换,若能将定时器/串行口/中断系统关闭更好。
第12章 STC单片机ADC原理及实现

逐次逼近寄存器型(Successive Approximation Register,SAR) ADC结构
模数转换器的类型
--Σ-Δ ADC(Sigma-delta ADC)
模数转换器的类型
--积分型ADC
模数转换器的类型
--数字跃升型ADC
STC单片机内ADC的结构原理
ADC控制寄存器ADC_CONTR
该寄存器位于STC单片机特殊功能寄存器地址为0xBC的位置。
当复位后,该寄存器的值为“00000000”。
ADC控制寄存器ADC_CONTR各位的含义
比特
B7
B6
B5
B4
B3
B2 B1 B0
名字 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
--STC单片机内ADC的结构
STC15系列单片机内集成了8路10位高速ADC转换器模块
通过ADC控制寄存器ADC_CONTR中SPEED1和SPEED0比特 位的控制,该ADC模块的最高采样速率可以达到300KHz,即: 30万次采样/秒(30kSPS,30k Sample Per Second)。
P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF
P17ASF
模拟输入通道7控制位。当该位为1时,P1.7引脚用于模拟信号输入;当该位为0 时,P1.7引脚用作普通I/O。
STC单片机内ADC寄存器组
--P1口模拟功能控制寄存器P1ASF
ADC结果高位寄存器ADC_RES各位的含义
比特 B7 B6 B5 B4 B3 B2 B1 B0
stc 8位ADC转换实验程序

stc 8位ADC转换实验程序/************************************************************** *******************************程序名: 8位ADC转换实验程序编写人:杜洋编写时间:2010年3月24日硬件支持:STC12C2052AD 使用ADC功能外部晶体12MHz接口说明:修改日志:1-/************************************************************** *******************************说明:PC串口端设置 [ 4800,8,无,1,无 ]将ADC读出的数值通过串口以十六进制方式显示。
/************************************************************** *******************************/#include <STC12C2052AD.H> //单片机头文件#include <intrins.h> //51基本运算(包括_nop_空函数)/************************************************************** *******************************函数名:毫秒级CPU延时函数调用:DELAY_MS (?);参数:1~65535(参数不可为0)返回值:无结果:占用CPU方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i<600,应用于12T单片机时i<125 /************************************************************** *******************************/void DELAY_MS (unsigned int a){unsigned int i;while( a-- != 0){for(i = 0; i < 600; i++);}}/************************************************************** *******************************//************************************************************** *******************************函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]/************************************************************** ********************************/void UART_init (void){//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)//ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}/************************************************************** ********************************//************************************************************** *******************************函数名:UART串口发送函数调用:UART_T (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出备注:/************************************************************** ********************************/void UART_T (unsigned char UART_data){ //定义串口发送数据变量SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)}/************************************************************** ********************************//************************************************************** *******************************函数名:8位A/D转换初始化函数调用:Read (?);参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)返回值:无结果:开启ADC功能并设置ADC的输入端口备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)/************************************************************** ********************************/void Read_init (unsigned char CHA){unsigned char AD_FIN=0; //存储A/D转换标志CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX 控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= CHA; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源DELAY_MS(1); //使输入电压达到稳定(1ms即可)}/************************************************************** ********************************//************************************************************** *******************************函数名:8位A/D转换函数调用:? = Read ();参数:无返回值:8位的ADC数据结果:读出指定ADC接口的A/D转换值,并返回数值备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)/************************************************************** ********************************/unsigned char Read (void){unsigned char AD_FIN=0; //存储A/D转换标志ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FIN ==0){ //等待A/D转换结束AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,return (ADC_DATA); //返回A/D转换结果(8位)}/************************************************************** ********************************//************************************************************** *******************************函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/************************************************************** ********************************/void main (void){unsigned char R;UART_init();//串口初始程序Read_init(0);//ADC初始化P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
单片机ADC实验报告

ADC实验报告1.实验任务利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示。
2.现有元件模数转换器ADC0804,STC89C52单片机,两个共阳极数码管。
3.硬件设计3.1模数转换器ADC0809与单片机STC89C52的连接(1)ADC0809规格及引脚分配图如下图3-1所示:(2)STC89C52各个引脚分布如下图3-2所示:图3-1 ADC0809引脚图图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、程序设计流程图Y N开始 启动前准备初始化INTO=1?开始转换 延时 取转换后的数值 将数值送显示结束6. C语言源程序#include<reg52.h>sbit ALE = P3^1;sbit ST = P3^0;sbit EOC = P3^2;sbit OE = P3^6;sbit CLK = P3^7;sbit wexuan1=P0^0;sbit wexuan2=P0^1;//sbit IN1 = P0^5;//sbit IN2 = P0^6;//sbit IN3 = P0^7;unsigned int code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码表unsigned int n=0,flag1=1;flag=1,ad_data,num1=0,num2=0;void delay(xms){unsigned int x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void display()//2位数码管显示{float a;a=(float)ad_data/256*5*1000;num1=(int)a/1000;num2=(int)a/100-num1*10;P1=table[num1];wexuan1=0;delay(1);wexuan1=1;P1=0x00;P1=0x80; //小数点wexuan1=0;delay(1);wexuan1=1;P1=0x00;P1=table[num2];wexuan2=0;delay(1);wexuan2=1;P1=0x00;}void init(){ST = 0;ALE = 0;OE = 0;CLK = 0;// _EOC= 1;TMOD=0x12;IP=0x09;TH0=(65536-22)/256;TL0=(65536-22)%256;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;EX0=1;//打开外部中断IT0=1;//从高到低的负跳变有效P0=0x00;}void start() //int a,int b,int c) //选择通道{// IN1 = a;IN2 = b;IN3 = c;ALE = 0;ALE = 1;ST = 0;ST = 1;ALE = 0;ST = 0;display();delay(10);}int read()unsigned int dat;P2 = 0xff;OE = 1;display();dat = P2;OE = 0;return (dat);}void main(){init();while(1){ ST = 0;ST = 1;ST = 0;if(n==20){flag=1;// display();// start();// while(EOC==0);//转换结束(EOC=1)读出数据后显示// _EOC=0;ad_data=read();flag=0;display();//n = 0;// display();// _EOC = 1;}display();//显示的是if中的电压值}}void INTR_0() interrupt 0while(1){ad_data = read();flag = 0;display();}}void timer0() interrupt 1 // 输出500kHz 方波{CLK=~CLK;}void timer1() interrupt 3{TH1=(65536-45872)/256;TL1=(65536-45872)%256;n++;flag1=0;}7、实验成果接线图。
实验三STC15系列单片机内部双通道10位AD转换程序

/*T8接T3和T2;或T8接T3,T7接T2;调电位器R36可改变内部10位AD转换0和1通道的电压Vin0或Vin1,采样周期5ms;送AD的电压用万用表在T8(对T6)测量;按照十六进制,0通道数字量由LCD显示(1行);1通道数字量由LCD显示(2行);0通道对应理论值在左边5个数码管显示(1个符号位,2个整数位,2个小数位);1通道对应理论值在右边5个数码管显示(1个符号位,2个整数位,2个小数位);研究2通道间是否需要适当延时*/#in clude <15f2k.h>#in clude <ab sacc.h>#d efine u8c uns igned char code//存放于代码中的无符号8位字符型缩写定义#de fineu8 unsi gnedchar//无符号8位字符型缩写定义#defin e u16 un signe d int //无符号16位整型缩写定义#def ine w ritec md XBYTE[0xEC FF]//1602写指令端口地址,E正脉冲有下降沿(A12=0),R/W=A9=0写,RS=A8=0写指令#defin e rea dstat e XB YTE[0xEEFF]//1602读状态端口地址,E正脉冲有高电平(A12=0),R/W=A9=1读,RS=A8=0读状态#de finewrite data XBYT E[0xE DFF]//1602写数据端口地址,E正脉冲有下降沿(A12=0),R/W=A9=0写,R S=A8=1读数据#defi ne Di splay seg X BYTE[0x7FF F]//数码管段码锁存器写端口地址(A15=0)#defi ne Di splay bit X BYTE[0xBFF F]//数码管位码锁存器写端口地址(A14=0)#defi ne LC D_CLR0x01 //清屏,清DD RAM内容为空,AC=00H#defi ne LC D_MOD E 0x38 //模式设置,001DLN F**,D L=1是8位数据接口,N=1两行显示,F=0是5*7点阵字符#def ine L CD_ON0x0c //显示开关控制,00001DCB,D=1开显示,C=0关光标,B=0关闪烁#de fineLCD_A_MODE 0x06//输入方式设置,000001I/DS,I/D=1数据读写后A C自动增1,S=0数据读写后画面不动b it new_cycl e_fla g=0; //有新采样数据标志,1有新数据sb it LSIG N=P1^6; //左边的符号位数码管公共端连接引脚,=0可能亮sbit RS IGN=P1^7; //右边的符号位数码管公共端连接引脚,=0可能亮u8r_kTH,m_kT H,r_k TL,m_kTL;//0通道和1通道AD转换结果u8 di spbuf[10],statu s,i; //10个数码管显示段码缓存区数组和AD转换状态及计算用中间变量int Vi n0x100,Vin1x100; //据AD值推算的0通道和1通道输入的100倍(显示用) u16A xx,j; //显示时用的中间变量float Vi n0,Vi n1; //据AD值推算的0通道和1通道输入-11.0V~+10.914Vu8 M=0; //扫描显示位计数变量定义u8cSG[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x 79,0x71};//0-F段码表u8c BT[10]={0xfe,0xfd,0xfb,0xf7,0xff,0xef,0xdf,0xbf,0x7f,0xff};//位码表u8c dis p1[16]={'0',' ','C','h','a','n','n','e','l',' ','A','D',' ',' ','H',''};u8c di sp2[16]={'1','','C','h','a','n','n','e','l',' ','A','D',' ',' ','H',' '};/***********LCD写指令************/voi d LCD write cmd(c har c md) //要传递指令{ w hile((read state&0x80)!=0); //查询LC D忙否?B F=1表示忙,循环,直到BF=0退出循环wr itecm d=cmd; //写指令,即把指令送[0xE3F F]端口}/***********L CD写数据************/v oid L CDwri tedat a(cha r dat) //要传递数据{ whil e((re adsta te&0x80)!=0); //查询LCD忙否?BF=1表示忙,循环,直到B F=0退出循环write data=dat;//写数据,即把数据送[0xE7FF]端口}/***********LCD初始化************/void LCD_init(void) //清屏/8位数据接口/1行/5*7点阵字符/关显示/AC自动增1{ L CDwri tecmd(LCD_MODE); //写模式设置指令 LCDw ritec md(LC D_ON); //写显示开关控制指令LCDwr itecm d(LCD_A_MO DE);//写输入方式设置指令L CDwri tecmd(LCD_CLR);//写清屏指令}/*******1602液晶屏幕初始化*******/voi d Dis play_init(void)//1602显示初始化{ LC Dwrit ecmd(0x80); //写指令,设置DDRA M指针AC=0x00fo r(i=0;i<16;i++) LCDw rited ata(d isp1[i]);//往第1行写数据:"0chan nel A D: H "LCDwr itecm d(0xc0); //写指令,设置DD RAM指针AC=0x40for(i=0;i<16;i++) LC Dwrit edata(disp2[i]);//往第2行写数据:"1ch annel AD: H "}/**********内部AD初始化**********/voi d AD_init(void)//内部AD初始化{ CLK_DIV&=0xDF; //MC KO_S1 MCKO_S0 A DRJ T X_RX- CLK S2CL KS1 C LKS0 //A DRJ=0,ADC_RES[7:0]存高8位ADC结果,AD C_RES L[1:0]存低2位ADC结果AD C_CON TR=0x80; //开A/D转换电源 for(j=0;j<10000;j++); //适当延时,一般延时1ms以内即可P1A SF=0x03; //开启P1.0和P1.1作为0通道和1通道模拟量输入通道A DC_CO NTR=0xC0;//ADC_POWER SPEE D1 SP EED0ADC_F LAG A DC_ST ART C HS2 C HS1 C HS0=1 10 0 0 000B//选择180个时钟周期转换1次,暂时不启动AD转换,选择0通道for(j=0;j<200;j++);//适当延时,20u s~200us即可}/***********T0T1初始化***********/v oid T0T1_i nit(v oid) //10数码管扫描1周AD转换1次,每管显1ms,AD周期10ms{ AUX R|=0x c0; //T0、T1定时器时钟1T模式,T0定时1m s,AD时间127.3us TMOD=0x20; //设置定时器模式,T0方式0定时,T1方式2定时T L0=0x66; //频率=11059200/(65536-0xea66)=1999.855Hz TH0=0xea; //定时周期=1/1999.855=0.000500036s=0.500036msEA=1;//允许中断E T0=1;//允许T0中断TR0=1; //定时器0开始计时}/*AD值倒推输入电压显示缓存区的更新*/voiddisp_g(voi d) //A D值倒推输入电压显示缓存区的更新{ i f(Vin0x100<0) //如果据0通道AD值推算的输入Vin0的100倍是负数{ Axx=-Vin0x100; //取绝对值 disp buf[9]=0x40; //符号位数码管对应送负号的段码}els e //据0通道AD值推算的输入Vin0的100倍是正数 { Ax x=Vin0x100; //取据AD值推算的输入Vi n0的100倍 dis pbuf[9]=0x00; //符号位数码管对应送正号的段码}i=(u8)(Axx/1000); //计算电压伏特十位 disp buf[8]=SG[i]; //电压十位数码管显示缓存更新段码 i=(u8)(Ax x/100%10); //计算电压伏特个位d ispbu f[7]=SG[i]|0x80; //电压个位数码管显示缓存更新段码(含小数点)i=(u8)(Axx/10%10); //计算电压小数后第1位dispb uf[6]=SG[i]; //电压小数后第1位数码管显示缓存更新段码i=(u8)(Axx%10);//计算电压小数后第2位d ispbu f[5]=SG[i]; //电压小数后第2位更新i f(Vin1x100<0) //如果据1通道AD值推算的输入Vin1的100倍是负数{ Axx=-Vin1x100; //取绝对值 disp buf[4]=0x40; //符号位数码管对应送负号的段码}els e //据1通道AD值推算的输入Vin1的100倍是正数 { Ax x=Vin1x100; //取据AD值推算的输入Vi n1的100倍 dis pbuf[4]=0x00; //符号位数码管对应送正号的段码}i=(u8)(Axx/1000); //计算电压伏特十位 disp buf[3]=SG[i]; //电压十位数码管显示缓存更新段码 i=(u8)(Ax x/100%10); //计算电压伏特个位d ispbu f[2]=SG[i]|0x80; //电压个位数码管显示缓存更新段码(含小数点)i=(u8)(Axx/10%10); //计算电压小数后第1位dispb uf[1]=SG[i]; //电压小数后第1位数码管显示缓存更新段码i=(u8)(Axx%10);//计算电压小数后第2位d ispbu f[0]=SG[i]; //电压小数后第2位更新}/*****AD结果显示缓存区的更新******/void disp_f(vo id) //A D结果显示缓存区的更新{ //0通道A D结果显示缓存区的更新L CDwri tecmd(0x8c); //写指令,设置DDR AM指针A C=0x4di=(r_k TH&0x f0)>>4; //取0通道8位AD数据的十六进制高位 if(i<10)LCDwr iteda ta(i+0x30);//更新AD数十六进制高位(数字)的A SCII码el se LC Dwrit edata(i+0x37); //更新AD数十六进制高位(大写字母)的AS CII码 i=r_kTH&0x0f; //取0通道8位AD数据的十六进制低位i f(i<10) LC Dwrit edata(i+0x30);//更新AD数十六进制高位(数字)的ASC II码 else LCDw rited ata(i+0x37); //更新AD数十六进制高位(大写字母)的ASCI I码LCDwr iteda ta('H'); //LCDwr iteda ta(r_kTL+0x30);//更新A D数十六进制高位(数字)的AS CII码 //1通道AD结果显示缓存区的更新LCD write cmd(0xcc); //写指令,设置DDRAM指针AC=0x4di=(m_kTH&0xf0)>>4; //取1通道8位AD数据的十六进制高位i f(i<10) LC Dwrit edata(i+0x30);//更新AD数十六进制高位(数字)的ASC II码 else LCDw rited ata(i+0x37); //更新AD数十六进制高位(大写字母)的ASCI I码i=m_k TH&0x0f; //取1通道8位AD数据的十六进制低位if(i<10) LCDw rited ata(i+0x30);//更新AD数十六进制高位(数字)的ASCII码e lse L CDwri tedat a(i+0x37);//更新AD数十六进制高位(大写字母)的A SCII码 LC Dwrit edata('H'); //LC Dwrit edata(m_kT L+0x30); //更新AD数十六进制高位(数字)的ASCI I码}/*************主程序*************/voi d ma in(vo id) //{ L CD_in it();//1602液晶显示模块初始化Dis play_init(); //1602液晶屏显示内容初始化 AD_i nit(); //内部AD初始化T0T1_in it(); //T0、T1初始化程序(11.0592MH z)do{ if(new_c ycle_flag==1) //有新采样数据标志,Vs1=-(R6/R5)*V in0=-0.2Vi n0 { //Vs2=-(R10/R8)*Vs1-(R10/R9)*(-5)=2.5+0.2Vin0 //当Vin0=-10V时,Vs2=0.5V;当Vin0=10V时,Vs2=4.5V //N=((2.5+0.2Vin0)/5)*256;V in0=0.09765625*N-12.5//Vs3=-(R17/R18)*Vin1=-0.2Vin1 //V s4=-(R13/R15)*V s3-(R13/R14)*(-5)=2.5+0.2Vin1 Vin0*=(fl oat)r_kTH; //A D转换需要127.3us,抽空做点计算 Vin0-=12.5; // Vin0x100=(int)(Vin0*100); //A D值倒推输入电压的100倍;小数点定点在第7位Vin1*=(flo at)m_kTH; //当V in1=-10V时,Vs4=0.5V;当Vin1=10V时,Vs4=4.5V Vin1-=12.5; //N=((2.5+0.2V in1)/5)*256;Vin1=0.09765625*N-12.5 Vin1x100=(int)(Vin1*100); //A D值倒推输入电压的100倍;小数点定点在第2位disp_g(); //0通道和1通道AD值倒推的输入电压显示缓存区的更新disp_f(); //0通道和1通道AD结果显示缓存区的更新n ew_cy cle_f lag=0; //新采样数据标志清0 }}whil e(1);}/*********T0中断服务程序*********/voi d t0() int errup t 1 u sing1 //0.5m s中断,自动重装,每次均要进行显示处理{ if(M==10) //5ms到了吗?因为0.5ms*10=5ms{ADC_C ONTR|=0x08; //到了5ms,启动0输入通道AD转换 new_cycl e_fla g=1;//置有新采样数据标志 M=0;//M清0s tatus=0; //状态变量先清0 whil e(sta tus==0) st atus=ADC_C ONTR& 0x10;//转换结束否?ADC_C ONTR=0xC1; //ADC_P OWERSPEED1 SPE ED0 A DC_FL AGAD C_STA RT CH S2 CH S1 CH S0=110 00 001B//选择180个时钟周期转换1次,将ADC_FLAG清0,暂时不启动AD转换,选择1通道 r_kTH=A DC_RE S; //读取0通道AD结果的高8位 r_kT L=ADC_RESL&0x03; //读取0通道AD结果的低2位,不用 Vin0=0.09765625; //AD转换需要127.3us,抽空预置常数 ADC_CONT R|=0x08; //启动1输入通道A D转换 Vi n1=0.09765625; // st atus=0; //状态变量先清0while(stat us==0) sta tus=A DC_CO NTR & 0x10;//转换结束否?A DC_CO NTR=0xC0; //A DC_PO WER S PEED1 SPEE D0 AD C_FLA GADC_STAR T CHS2 CHS1 CHS0=1 10 0 0 000B //选择180个时钟周期转换1次,将ADC_FLAG清0,暂时不启动AD转换,选择0通道 m_k TH=AD C_RES; //读取1通道AD结果的高8位m_kTL=ADC_RESL&0x03; //读取1通道AD结果的低2位,不用}RS IGN=1; //关闭右边符号位显示LSI GN=1; //关闭左边符号位显示 Disp laybi t=0xf f; //关闭8个数码管的显示 Disp layse g=dis pbuf[M]; //查显示缓存表送数显的段端口D ispla ybit=BT[M]; //查位码表送数显的位端口if(M==4) R SIGN=0; //扫描到右边符号位则该位显示 if(M==9) LSI GN=0; //扫描到左边符号位则该位显示 M++; //修改下一次的显示位}。
实验AD转换

实验AD转换实验AD转换⼀、实验⽬的了解STC单⽚机ADC的结构;掌握STC单⽚机ADC的使⽤。
⼆、实验原理STC15F2K60S2单⽚机内含8路10位⾼速AD转换器,速度可达30万次/秒。
单⽚机P1⼝既可作为普通I/O⼝,也可作为AD转换器模拟电压输⼊⼝。
AD转换器相关的寄存器如表1所⽰。
表1 ADC转换相关寄存器P1ASF某⼀位为“1”,P1⼝对应的引脚设为模拟功能。
某⼀位为“0”,对应的引脚设为普通I/O。
②ADC控制寄存器ADC_CONTRADC_POWER=1,打开AD转换器电源(关闭电源可降低功耗,ADC初次上电需适当延时,再启动AD转换)。
SPEED1、SPEED0选择AD转换速度。
ADC_FLAG:ADADC_START:AD转换启动控制。
CHS2、CHS1、CHS0:选择模拟输⼊通道P1.0~P1.7。
转换结果存放在ADC_RES和ADC_RESL寄存器中,当CLK_DIV.5/ADRJ=0时,ADC_RES为结果的⾼8位,ADC_RESL为结果的低2位(如表2所⽰)。
当CLK_DIV.5/ADRJ=1时,ADC_RES为结果的⾼2位,ADC_RESL为结果的低8位(如表3所⽰)。
STC15F2K60S2的AD 转换器以Vcc 为参考电压,当ADRJ=0时,10位转换结果与输⼊模拟电压的关系由式(1)计算:VccVin 10240]:ADC_RESL[10],:ADC_RES[7= (1)如果只取⾼8位,则由式(2)计算: VccVin 2560]:ADC_RES[7=……………………………………...…………………(2)当ADRJ=1时,10位转换结果与输⼊模拟电压的关系由式(3)计算:VccVin10240]:ADC_RESL[70],:ADC_RES[1=…………………………………(3)如果单⽚机Vcc 电压不稳,会引起AD 转换误差,在实际应⽤中,可⽤⼀路AD 采样外部的基准电压(如⽤TL431基准电源),另⼀路AD 采样被测电压,按式(4)计算:转换结果基准电转换结果被测VrefVin 源电压= (4)三、实验环境Windows XP ; Keil µ V ision 4; STC-ISP-6.28。
单片机AD转换实验_2

单片机实验报告实验名称:A/D转换实验姓名:学号:班级:实验时间:2010.12.13一、 实验目的1、理解A/D 转换的工作原理;2、理解掌握ADC0809的A/D 转换原理和并行A/D 转换器接口的编程方法;3、学习使用并行模/数转换芯片ADC0809进行电压信号的采集额数据处理。
二、 实验原理量化间隔和量化误差是A/D 转换器的主要指标之一。
量化间隔:Δ=单片机给ADC 提供一个启动信号后,ADC 转换开始;当A/D 转换结束时,ADC 输出一个转换结束标志信号,通知单片机读取转换结果。
单片机检查判断A/D 转换结束的方法一般有中断和查询两种方式。
整个A/D 转换都是在一定的时钟下作用完成的,其频率是决定芯片转换速度的基准。
实验参考流程:三、 实验内容程序流程:12 n 满量程输入电压程序中#define PIN0 XBYTE[0x7ff8] 表示启动A/转换#define PIN1 XBYTE[0x7ff9]PIN0=0; PIN1=0;result0_reg=PIN0; 表示读取A/D转换结果 result1_reg=PIN1;for(j=0;j<250;j++) 延时等待A/D转换完成for(k=0;k<250;k++);result0=(result0_reg*5)/255; 将转换结果转换为十进制result1=(result1_reg*5)/255;程序仿真,须将程序下载到试验箱中相应模块进行仿真。
在实验箱中,将D2区的1KΩ电位器的中间金属孔连接到A7区的P2_I02金属孔,D2区的10KΩ电位器的中间金属孔连接到A7区的P2_I01金属孔;将A7区的P2_I03-P2_I05分别连接到A2区的A2-A0;将A7区的P2_CS连接到A2区的A15;运行软件程序,每次跑到断点就会停止,此时观察转换的结果与数字万用表测量结果相比近似相同。
四、小结与体会对于具有模拟信号采集的单片机应用系统,A/D转换接口是前向通道中的一个重要环节。
单片机实现5v电压ad数模转换

Stc12c5a60s2系列单片机的A/d数模转换模块实验摘要:与时间成连续函数的物理量,一般都称之为模拟量。
人们在工业生产及科研过程中遇到的被测量绝大部分是模拟量。
例如:电压,电流,温度,压力,位移,速度等。
计算机技术是测量与控制自动化与智能化的关键,是现代测控技术的核心技术之一。
现代计算机是数字计算机,它无法直接处理模拟信号,因此欲实现基于计算机的测量与控制,必须具备将连续变化的模拟信号转变成计算机能够识别及处理的数字信号的手段。
为此模/数转换技术应运而成,并成为现代测控技术中的重要组成部分。
将模拟量转换为一定码制的数字量称为模/数转换。
Stc12c5a60s2系列单片机作为微型控制芯片的一种,其自身自带a/d装换口:P1(p1.0-p1.7),可实现数模转换功能。
实验目的:以Stc12c5a60s2单片机以及1602液晶显示屏做一个简易的”电压测量器“,测量线性稳压电源提供的直流电压,精度0.01v,通过调节电位器,将输入的电压转换为数字量实时显示在1602lcd上。
实现过程:1.理论学习:(1)在掌握1602lcd工作原理及使用方法的基础上,查阅Stc12c5a60s2单片机数模转换模块应用介绍,弄清楚a/d转换器的结构,了解a/d转换器是如何工作的。
(2)理解与a/d转换器相关的寄存器的设置,会根据实际需要设置相关的寄存器。
(3)了解如何配置a/d转换口,如何取出转换结果。
以十位结果为例,计算公式如下:Vcc即单片机实际工作电压,我们用单片机工作电压做模拟参考电压,则输出的实际电压vin=result(结果寄存器中的值)×vcc(单片机工作电压5v)/1024。
2.需注意的问题:(1)Stc12c5a60s2单片机的参考电压源是输入的工作电压vcc,所以一般不用外接参考电压源,如果单片机是采用电池供电,电池电压会在一定范围内漂移,所以vcc就不固定,这时候就需要在8路a/d转换的一个通道外接一个稳定的参考电压源,来计算此时的工作电压vcc,再计算出其他几路a/d转换通道的电压。
单片机adc进行连续电压转换

单片机adc进行连续电压转换
单片机的ADC(模数转换器)可以用于连续电压转换。
通常情况下,单片机的ADC模块可以配置为连续转换模式,这样就可以持续地将模拟输入信号转换为数字值。
下面我将从硬件配置和软件编程两个方面来详细说明。
硬件配置:
1. 确保选择的单片机具有内置ADC模块,或者外部ADC芯片与单片机连接。
2. 确保输入电压范围在ADC的输入范围内,否则需要外部电压分压电路。
3. 连接模拟输入信号到ADC引脚,并连接ADC引脚到单片机的对应引脚。
4. 确保ADC的参考电压源正确连接,以确保准确的电压转换。
软件编程:
1. 首先配置ADC的工作模式为连续转换模式,这通常需要设置ADC控制寄存器。
2. 确定转换的采样率,即多久进行一次转换,这取决于应用的要求和单片机的性能。
3. 在主程序中编写ADC中断服务程序或者轮询ADC转换完成标志位的状态,以获取转换结果。
4. 在获取转换结果后,可以对数字值进行进一步处理,比如显示在数码管上、发送到串口或者存储到内存中等。
总之,要实现单片机ADC的连续电压转换,需要合理配置硬件连接,并编写相应的软件程序来控制ADC的工作模式和获取转换结果。
这样就可以实现持续不间断地将模拟电压信号转换为数字值。
STC单片机通用AD转换程序

#include <reg52.H>#include <intrins.H>sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器sfr ADC_DATA = 0xC6; //A/D转换结果寄存器高8位,sfr ADC_LOW2 = 0xC7; //A/D转换结果寄存器低2位,如果是8位AD无此寄存器。
#define uchar unsigned char ;#define uint unsigned int ;Uint ad_out1,ad_out2;void delay(uchar delay_time) // 延时函数{uchar n;uint m;for (n=0;n<delay_time;n++){for(m=0;m<10000;m++);}}uchar get_AD_result(uchar channel){uchar AD_finished = 0; // 存储A/D 转换标志ADC_DATA = 0;ADC_CONTR = channel; // 选择A/D 当前通道_nop_();_nop_();_nop_(); //使输入电压达到稳定_nop_();_nop_();_nop_();ADC_CONTR |= 0x08; //0000,1000 令ADC_START = 1, 启动A/D 转换AD_finished = 0;while ( AD_finished == 0 ) // 等待A/D 转换结束{AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D 转换结束否}ADC_CONTR &= 0xF7; //1111,0111 令ADC_START = 0, 关闭A/D 转换,return (ADC_DATA); // 返回A/D 转换结果}void main(){P1 = P1 | 0x01; // 0000,0001,P1.0为A/D 转换,即通道0与1P1_ADC_EN = 0x01; //0000,0001, P1 的P1.0设置为A/D 转换输入脚// 断开P1.0,P1.1 内部上拉电阻while(1){get_AD_result(0);delay(10);//可以多采集几次求均值//8位数据输出,参考电压5Vad_out1= (ADC_DATA*5)/256//8位数据输出,参考电压5Vad_out2= ((ADC_DATA*4)+ ADC_LOW2)/1024}}。
stc单片机adc电压计算公式(一)

stc单片机adc电压计算公式(一)STC单片机ADC电压计算公式1. 简介在STC单片机的开发中,经常需要读取模拟量信号。
而ADC (Analog to Digital Converter,模数转换器)是一种常用的模拟量转数字量的设备。
为了正确地使用ADC,需要掌握相关的计算公式。
2. ADC简介ADC是一种将连续变化的模拟量信号转换为离散数字量的设备。
在单片机中,一般通过ADC测量模拟量信号,并将其转换为对应的数字值,以进行后续的处理和判断。
3. ADC电压计算公式在STC单片机中,使用的是10位的ADC,输入电压范围为0~VCC (单片机供电电压)。
在将输入电压转换为ADC的数字值时,可以使用以下计算公式:ADC_value = input_voltage / VCC * 1024其中,ADC_value表示输入电压对应的ADC值,input_voltage表示输入电压,VCC表示单片机供电电压。
在这个计算公式中,我们需要通过测量输入电压和单片机供电电压来得到准确的ADC值。
4. 举例说明假设我们使用的STC单片机的供电电压为5V(VCC=5V),我们要测量的电压为。
根据上述计算公式,我们可以得到:ADC_value = / 5 * 1024 = ≈ 673因此,当输入电压为时,对应的ADC值为673。
5. 总结使用STC单片机中的ADC模块进行模拟量信号的读取时,需要掌握电压计算公式。
该公式通过将输入电压转换为对应的ADC值,为后续的处理和判断提供了基础。
以上是关于STC单片机ADC电压计算公式的简介和解释,希望对你有所帮助!这是一篇使用Markdown格式的文章,使用标题副标题的形式进行组织。
单片机AD模数转换实验报告

单片机AD模数转换实验报告实验目的:通过单片机完成模数转换实验,了解AD模数转换的原理,掌握AD转换器的使用方法。
实验设备:1.STC89C52RC单片机开发板2.电位器3.电阻4.电容5.连接线实验原理:AD模数转换是将连续的模拟信号转换为离散的数字信号的过程。
在单片机中,通过ADC模块将模拟电压转换为数字量。
STC89C52RC单片机具有内置的10位ADC模块,可以将模拟电压转换为0-1023之间的数字量。
实验步骤:1.连接电位器、电阻和电容的引脚到单片机上。
2.在单片机的引脚配置中,将ADC0的引脚配置为模拟输入。
3.在主函数中初始化ADC模块。
4.使用AD转换函数来获取模拟电压的数字量。
5.将数字量通过串口输出。
实验结果:经过以上步骤,我们成功地将连续的模拟信号转换为了数字信号,并通过串口输出。
通过电位器、电阻和电容的调整,我们可以观察到不同的输入信号对应的数字量。
实验总结:通过本次实验,我们深入了解了AD模数转换的原理,并学会了使用单片机的ADC模块来完成模数转换。
在实验过程中,我们还发现了一些问题和注意事项。
首先,在连接电路时,需要将模拟输入连接到ADC0引脚,并在引脚配置中正确设置。
其次,在初始化ADC模块时,需要根据实际情况设置参考电压和转换速率等参数。
最后,在使用AD转换函数时,需要根据需要进行适当的调整和计算,以获取正确的数字量。
总体来说,本次实验帮助我们更好地理解了AD模数转换的原理和单片机的ADC模块的使用方法。
通过实际操作,我们掌握了实验步骤和注意事项,提高了实际操作的能力和理论知识的运用。
这对我们的电子技术学习和应用都起到了积极的促进作用。
adc转换实验心得

adc转换实验心得
ADC转换实验心得
在完成ADC(模拟数字转换器)转换实验的过程中,我学到了很多关于电子技术和微控制器应用的知识。
这个实验不仅增强了我的理论理解,也提高了我的实践技能。
在实验初期,我学习了ADC的基本工作原理,包括它的转换过程和在各种应用中的重要性。
这让我对ADC有了深入的理解,为我后续的实验打下了坚实的基础。
在实验过程中,我遇到了许多挑战。
例如,我曾多次遇到数据不稳定或转换错误的问题。
通过反复调试和查阅资料,我逐渐找到了解决问题的方法,这让我更加熟悉了ADC的工作原理和特性。
此外,我也学会了如何设置微控制器的ADC模块,以及如何编写和优化ADC转换的代码。
这次实验让我认识到理论与实践相结合的重要性。
理论知识是指导我们实验的基础,而实践则是加深理解和提高技能的关键。
同时,实验中的挑战和问题也让我明白,面对困难时要有耐心和毅力,不断探索和学习是解决问题的关键。
总的来说,这次ADC转换实验是一次非常有价值的经历。
它不仅提高了我的技术水平,也培养了我解决问题的能力。
我相信这些经验对我未来的学习和工作都会有很大的帮助。
stc adc外部电压

stc adc外部电压
STC ADC外部电压指的是STC单片机中的模数转换器(ADC)所
能接受的外部电压范围。
STC单片机通常会有多个模拟输入引脚,
这些引脚可以连接外部电压源,并通过ADC转换成数字信号进行处理。
STC单片机的ADC通常能够接受的外部电压范围取决于具体型
号和系列。
一般来说,STC单片机的ADC外部电压范围是0V至Vref,其中Vref是参考电压。
在STC单片机中,Vref可以是内部参考电
压或外部参考电压,因此在使用ADC时需要注意参考电压的设置。
对于不同的应用场景,STC单片机的ADC外部电压范围可能会
有所不同。
一些型号的STC单片机可能支持负电压输入,而另一些
可能仅支持正电压输入。
因此,在使用STC单片机的ADC时,需要
查阅具体型号的数据手册,以确定其支持的外部电压范围。
另外,在连接外部电压源到STC单片机的ADC引脚时,还需要
考虑输入阻抗、采样率、信噪比等因素,以确保获取到准确的模拟
输入信号并进行有效的转换。
总之,STC单片机的ADC外部电压范围是一个重要的参数,需要根据具体型号和应用需求来确定,并在设计和应用过程中进行合理的考虑和配置。
第13章 STC单片机ADC原理及实现(3)

Hale Waihona Puke #define ADC_FLAG 0x10 //定义ADC_FLAG的值0x10
#define ADC_START 0x08 //定义ADC_START的值0x08
#define ADC_SPEEDLL 0x00 //定义ADC_SPEEDLL的值0x00
#define ADC_SPEEDL 0x20 //定义ADC_SPEEDL的值0x20
打开STC-ISP软件,在该界面内,选择硬件选项。将“输入用户 程序运行时的IRC频率”设置为18.432MHz。
单击下载/编程按钮,按前面的方法下载设计到STC单片机。 在STC-ISP软件右侧串口中,选择串口助手标签。在该标签串口
界面下,按下面设置参数:
串口:COM3(读者根据自己电脑识别出来的COM端口号进行设置) 波特率:9600。 校验位:无校验。 停止位:1位。
}
//重新启动ADC转换
ADC_CONTR=ADC_POWER |ADC_SPEEDLL | ADC_START | ch;
}
直流电压测量和串口显示
--具体实现过程
void main()
//主程序
{
unsigned int i;
SCON=0x5A;
//串口1为8位可变波特率模式
T2L=65536-OSC/4/BAUD;
//写定时器2低8位寄存器T2L
T2H=(65536-OSC/4/BAUD)>>8;//写定时器2高8位寄存器T2H
AUXR=0x14;
//定时器2不分频,启动定时器2
AUXR|=0x01;
//选择定时器2为串口1的波特率发生器
P1ASF=0xFF;
有关单片机AD转换的实验报告

有关单片机AD转换的实验报告一、试验目的1、理解A/D转换的工作原理;2、理解把握ADC20XX的A/D转换原理和并行A/D转换器接口的编程方法;3、学习使用并行模/数转换芯片ADC20XX进行电压信号的采集和数据处理。
二、试验原理在设计A/D转换器与单片机接口之前,往往要依据A/D转换器的技术指标选择A/D转换器。
A/D转换器的主要技术指标-----量化间隔和量化误差是A/D转换器的主要技术指标之一。
量化间隔可用下式表示,其中n为A/D转换器的位数: ?量化间隔肯定误差221 相对误差n20XX%2A/D转换器芯片种类许多,按其转换原理可分为逐次比较式、双重积分式、量化反馈式和并行式A/D转换器;按其辨别率可分为8~16位的A/D 转换器芯片。
目前最常用的是逐次靠近式和双重积分式。
A/D转换器与单片机接口具有硬、软件相依性。
一般来说,A/D转换器与单片机的接口主要考虑的是数字量输出线的连接、ADC启动方式、转换结束信号处理方法以准时钟的连接等。
一个ADC开头转换时,必需加一个启动转换信号,这一启动信号要由单片机供应。
不同型号的ADC,对于启动转换信号的要求也不同,一般分为脉冲启动和电平启动两种:对于脉冲启动型ADC,只要给其启动掌握端上加一个符合要求的脉冲信号即可,如ADC20XX、ADC574等。
通常用WR和地址译码器的输出经肯定的规律电路进行掌握;对于电平启动型ADC,当把符合要求的电平加到启动掌握端上时,马上开头转换。
在转换过程中,必需保持这一电平,否则会终止转换的进行。
因此,在这种启动方式下,单片机的掌握信号必需经过锁存器保持一段时间,一般采纳D触发器、锁存器或并行I/O接口等来实现。
AD570、AD571等都属于电平启动型ADC。
当ADC转换结束时,ADC输出一个转换结束标志信号,通知单片机读取转换结果。
单片机检查推断A/D转换结束的方法一般有中断和查询两种:对于中断方式,可将转换结束标志信号接到单片机的中断恳求输入线上或允许中断的I/O接口的相应引脚,作为中断恳求信号; ?对于查询方式,可把转换结束标志信号经三态门送到单片机的某一位I/O口线上,作为查询状态信号。
第13章 STC单片机ADC原理及实现(1)

不同厂商所提供的ADC,其输出的数字信号输出使用不同的编 码格式。
模数转换器原理
--模数转换器的参数
介绍ADC转换器中几个重要的参数,包括:
分辨率 响应类型 误差 采样率
模数转换器的参数
--分辨率
分辨率是指对于所允许输入的模拟信号范围,它能输出 离散数字信号值的个数。
分辨率由下面等式确定:
Q
V V RefHi
RefLow
2N
VRefHi和VRefLow是转换过程允许输入到ADC的电压上限和下限值。 N是模拟数字转换器输出数字量的位数宽度值,以比特为单位。
模数转换器的参数
--分辨率
很明显,如果输入电压的变化小于Q值,则ADC是无法分辨出 电压的变化。这样,就带来量化误差。
在实际使用时,为了能更加逼真地恢复出原始的模拟信号,建立采样频 率为信号最高频率至少5~10倍。
为了满足采样定理的要求,通常在信号进入ADC之前,要对信号进行带 限,即:将信号限制在一个有限的频率范围内。
模数转换器的类型
--Flash ADC
8-3线 优先级 编码器
二进制输出
模数转换器的类型
第13章 STC单片机ADC原理及实现
本章主要内容
模数转换器原理 STC单片机内ADC的结构原理 STC单片机内ADC寄存器组 直流电压采集和串口显示 直流电压采集和1602 LCD显示 交流电压采集和12864 LCD显示 温度测量及串口显示
模数转换器原理
数模转换器(Analog to Digital Converter,ADC), 简称为A/D。它用于将连续的模拟信号转换为数字形式 离散信号。
stc8adc电压计算

stc8adc电压计算
要计算STC8ADC的电压,您需要知道以下几个参数:
1. ADC转换结果:STC8ADC是一种单片机中的模数转换器(ADC),它将模拟信号转换为数字值。
您需要获取ADC转换结果,通常以十进制或十六进制表示。
2. 参考电压:ADC转换结果是相对于参考电压进行测量的。
参考电压是您提供给ADC的已知电压值。
在STC8ADC中,参考电压通常是VREF+和VREF-之间的电压差。
3. 分辨率:ADC的分辨率决定了其可以测量的最小电压变化量。
STC8ADC的分辨率通常为10位或12位,表示为ADC可以输出的不同离散电平数量。
使用以下公式可以计算STC8ADC的电压:
V oltage = (ADC_Result / (2^Resolution)) * Reference_V oltage
其中:
V oltage是通过ADC测量得到的电压值。
ADC_Result是ADC转换结果。
Resolution是ADC的分辨率,以位数表示。
Reference_V oltage是参考电压。
请确保将以上参数正确应用于计算,并注意单位的一致性(例如,如果ADC结果是十进制表示,则参考电压也应该是十进制表示)。
1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验51.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:KeiluVision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:配套光盘\源代码\单片机原理与技术\实验5hex路径:配套光盘\源代码\单片机原理与技术\实验53.实验原理3.1A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1A/D相关寄存器P1ASF:P1口的模拟功能控制器。
STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。
需作为A/D使用的口需先将P1ASF 特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。
P1ASF寄存器的定义如表3.2所示:表3.2P1ASF寄存器定义ADC_CONTR:ADC控制寄存器。
该寄存器的描述如表3.3所示:表3.3ADC_CONTR寄存器定义对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。
ADC_POWER:?ADC电源控制位。
0:关闭A/D转换器电源1:打开A/D转换器电源建议进入空闲模式时,将ADC电源关闭,即ADC_POWER?=0。
启动A/D转换前一定要确认A/D 电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。
初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。
建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D?转换,若能将定时器/串行口/中断系统关闭更好。
SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表3.4SPEED1、SPEED0描述ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0。
不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束,当A/D转换完成后,ADC_FLAG=1,一定要软件清0。
ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。
CHS2/CHS?/CHS0:模拟输入通道选择,CHS2/CHS1/CH0描述如表3.5所示:图3.5CHS2/CHS1/CH0定义ADC_RES、ADC_RESL:ADC结果寄存器。
该寄存器用于存A/D转换结果,其定义如表3.6所示:表3.6ADC_RES、ADC_RESL寄存器定义AUXR1寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位。
当ADRJ=0时,10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中,如表3.7所示:表3.7ADRJ=0时AD结果此时,如果用户需需取完整10位结果,按下面公式计算:如果用户只需要8位结果,按下面公式计算:式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
当ADRJ=1时,10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL 中。
此时,如果用户需要完整10位结果,按下面公式计算:式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
IE:中断允许控制寄存器。
该寄存器的描述如表3.8所示:表3.8IE寄存器定义EA:CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。
即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。
EADC:A/D转换中断允许位EADC=1,允许A/D转换中断EADC=0,禁止A/D转换中断如果要允许A/D转换中断则需要将相应的控制位置1:1、将EADC置1,允许ADC中断,这是ADC中断的中断控制位。
2、将EA置1,打开单片机总中断控制位,此位不打开,也是无法产生ADC中断的A/D中断服务程序中要用软件清A/D中断请求标志位ADC_FLAG(也是A/D转换结束标志位)。
IPH、IP:中断优先级控制寄存器,该寄存器的定义如表3.9所示:表3.9IPH、IP寄存器定义PADCH,PADC,A/D转换中断优先级控制位。
当PADCH=0且PADC=0时,A/D转换中断为最低优先级中断(优先级0)当PADCH=0且PADC=1时,A/D转换中断为较低优先级中断(优先级1)当PADCH=1且PADC=0时,A/D转换中断为较高优先级中断(优先级2)当PADCH=1且PADC=1时,A/D转换中断为最高优先级中断(优先级3)4.实验步骤4.1编写实验源代码文件4.1.1打开Keil集成开发环境,打开配套光盘\源代码\单片机原理与技术\实验5下的工程文件,编译源码,生成ADC.hex可执行文件,该可执行文件自动保存在配套光盘\源代码\单片机原理与技术\实验5目录下。
(注意:请根据该目录下ADC.hex文件的生成时间,判断该文件是否是自己刚刚编译完成的)4.1.2将12号节点的开关S1拨打到左边,让STC单片机与DB9相连。
4.1.3根据配套光盘\第三方应用软件\STC_ISP\STC-ISP软件使用说明书4.2实验源代码解析ADC.c源代码/***************************************************************晶振频率:选取用RC11.0592MHz*文件名:ADC.c*功能说明:STC12C5A16S2单片机的A/D转换演示实验*制作*变更记录:2013.05.5*变更内容:新建造**************************************************************/ /************* 用户系统配置**************/#define模拟串口和和延时会自动适应。
5~35MHZ/************* 以下宏定义用户请勿修改**************/#include "reg51.H"#define uchar unsignedchar#defineuint unsignedint/****************特殊寄存器声明************************/sfrP1ASF=0x9D; //12C5A60AD/S2系列模拟输入(AD或LVD)选择sfrADC_CONTR=0xBC; //带AD系列sfrADC_RES=0xBD; //带AD系列sfrADC_RESL=0xBE; //带AD系列#defineADC_OFF() ADC_CONTR=0//ADC转换关#defineADC_ON (1<<7) //ADC转换开#defineADC_90T (3<<5) //90个时钟周期转换一次#defineADC_180T (2<<5) //180个时钟周期转换一次#defineADC_360T (1<<5) //360个时钟周期转换一次#defineADC_540T 0 //540个时钟周期转换一次#defineADC_FLAG (1<<4) //软件清0#defineADC_START (1<<3) //开始ADC转换#defineADC_CH0 0 //P1_0作为AD转换通道#defineADC_CH1 1 //P1_1作为AD转换通道#defineADC_CH2 2 //P1_2作为AD转换通道#defineADC_CH3 3 //P1_3作为AD转换通道#defineADC_CH4 4 //P1_4作为AD转换通道#defineADC_CH5 5 //P1_5作为AD转换通道#defineADC_CH6 6 //P1_6作为AD转换通道#defineADC_CH7 7 //P1_7作为AD转换通道/*************本地变量声明**************/sbit P_TXD1=P3^1;/*************本地函数声明**************/void Tx1Send(uchardat);void PrintString(unsignedcharcode*puts);void delay_ms(unsignedcharms);uint adc10_start(ucharchannel); //channel=0~7/************************************************************* *函数名:main(void)*输入:无*输出:无*功能描述:串口初始化参数为96008N1.**值通过串口输出**************************************************************/ voidmain(void){uint j;P1ASF=(1<<ADC_CH0); //STC12C5A16S2的模拟输入(AD转换通道)选择ADC_CONTR=ADC_360T|ADC_ON;while(1){delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);j=adc10_start(0); //P1_0开启AD转换Tx1Send('A');Tx1Send('D');Tx1Send('0');Tx1Send('=');Tx1Send(j/1000+'0');Tx1Send(j%1000/100+'0');Tx1Send(j%100/10+'0');Tx1Send(j%10+'0');Tx1Send(0x0d);Tx1Send(0x0a);}}/**************************************************************函数名:adc10_start(ucharchannel)*输入:需要转换的ADC通道*输出:无*功能描述:串口初始化参数为96008N1.**值通过串口输出**************************************************************/uint adc10_start(ucharchannel){uint adc;uchar i;ADC_RES=0; //AD转换结果高位寄存器清零ADC_RESL=0; //AD转换结果低位寄存器清零ADC_CONTR=(ADC_CONTR&0xe0)|ADC_START|channel; //AD转换控制寄存器设置i=250;do{if(ADC_CONTR&ADC_FLAG) //如果AD转换结束{ADC_CONTR&=~ADC_FLAG; //软件清0AD转换结束标志位adc=(uint)ADC_RES; //获取AD转换的高位adc=(adc<<2)|(ADC_RESL&3); //获取AD转换的低位return adc; //返回AD转换值}}while(--i);return 1024;}/**************************************************************函数名:delay_ms(unsignedcharms)*输入:延时数*输出:无*功能描述:产生毫秒级别延时**************************************************************/ voiddelay_ms(unsignedcharms){unsignedinti;do{i=MAIN_Fosc/14000;while(--i) ;//14Tperloop}while(--ms);}/**************************************************************函数名:BitTime(void)*输入:无*输出:无*功能描述:位操作时间函数**************************************************************/ void BitTime(void) //位时间函数{uinti;i=((MAIN_Fosc/100)*104)/140000L-1; //根据主时钟来计算位时间while(--i);}/**************************************************************函数名:Tx1Send(uchardat)*输入:发送字符*输出:无*功能描述:串口初始化参数为96008N1.*通过串口发送一个字符**************************************************************/ void Tx1Send(uchardat){uchar i;EA=0;P_TXD1=0;BitTime();for(i=0;i<8;i++){if(dat&1) P_TXD1=1;else P_TXD1=0;dat>>=1;BitTime();}P_TXD1=1;EA=1;BitTime();BitTime();}/**************************************************************函数名:PrintString(unsignedcharcode*puts)*输入:无*输出:无*功能描述:通过串口输出字符串**************************************************************/voidPrintString(unsignedcharcode*puts){for(;*puts!=0; puts++)Tx1Send(*puts); //遇到停止符0结束}4.3程序执行效果第一步:关闭STC-ISP软件,S1开关拨打至左边,让DB9与STC单片机相连,打开串口调试助手软件,配置串口参数,如图4.1所示:图4.1串口参数配置第二步:给12号节点上电,可以看到串口助手返回的AD值信息,如图4.2所示:图4.2ADC运行结果。