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

合集下载

单片机中的ADC转换原理及精度分析

单片机中的ADC转换原理及精度分析

单片机中的ADC转换原理及精度分析近年来,单片机技术的发展使得它们在各个领域中被广泛应用。

在许多应用中,模拟信号需要被转换成数字信号才能被单片机处理。

这就需要使用模数转换器(ADC)。

本文将介绍单片机中ADC转换的原理以及精度分析。

第一部分:ADC的原理ADC(Analog-to-Digital Converter)是一种将模拟信号转换为数字信号的电路。

在单片机中,ADC的主要任务是将模拟信号采样后转换为数字信号,以便单片机进行数字处理。

ADC转换的基本原理包括采样和量化两个过程。

1. 采样过程:采样过程是将模拟信号在一定时间内进行离散化的过程。

单片机中的ADC通常采用采样保持电路来实现。

该电路可以在一定时间内将模拟信号的值固定住,然后通过转换电路将其转换成数字信号。

采样速率是指每秒钟采样的次数,采样速率越高,能保留更多模拟信号的信息。

2. 量化过程:量化过程是将连续的模拟信号转换为离散的数字信号的过程。

单片机中的ADC通常采用逐次逼近(SAR)ADC或逐段逼近(Sigma-Delta)ADC来实现。

逐次逼近ADC通过逐位比较来逼近模拟信号的大小,逐段逼近ADC则将模拟信号分成多个区间进行量化。

第二部分:ADC的精度ADC的精度是指其输出与输入之间的误差。

精度通常用位数(bits)表示,即ADC的分辨率。

分辨率越高,ADC能够区分的模拟信号范围越小,精度越高。

1. 分辨率:分辨率是ADC能够分辨的最小电压变化。

在一个n位的ADC中,分辨率可以通过电压范围除以2的n次方得到。

例如,一个10位ADC的电压范围是0-5V,其分辨率为5V/2^10 ≈ 4.88mV。

这意味着ADC可以分辨出离散电压变化大于约4.88mV的信号。

2. 误差:ADC的输出与输入之间存在一定的误差。

误差通常包括无线性误差、增益误差和偏移误差。

无线性误差是指ADC输出值与输入信号之间的非线性关系;增益误差是指ADC输出值与输入信号之间的放大倍数误差;偏移误差是指ADC输出值与输入信号之间的偏移量误差。

STC单片机AD转换结果

STC单片机AD转换结果
ADC_CONTR=0 ;//关闭ADC电源
PIASF=0 ; //关闭ADC通道
EA=1 ; //打开总中断使能 } Nhomakorabea{
while(--t);
}
unsigned char ADC_run(unsigned char pass) //只要输入0到7它就可以把AD结果返回
{
unsigned char temp ;
AUXR1=0x04 ;// 取10位AD的低8位结果
EA=0 ; //总中断关闭
//选择是那个通道
temp=0x01<<pass ; //先把通道放在临时寄存器上
PIASF=temp ; //把P1.0设定为AD输入
temp=0xe0+pass ;
ADC_CONTR=temp; //启动ADC转换电源同时先择一路
Delay2xus(30); //延时一会
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h> //
sfr ADC_CONTR = 0xbc ; //AD控制位 不可位寻址
sfr ADC_RES = 0xbd ; //AD转换结果8位寄存器
temp=0xe8+pass ;
ADC_CONTR=temp ; //开始转换
Delay2xus(30); //延时一会
while(ADC_CONTR&0x08==0); //等待 //P1.0路转换结束
// return ADC_RES; //返回ADC_RES
return ADC_RESL; //返回ADC_RESL

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用STC单片机AD转换及EEPROM使用随着各种电子设备的普及,信号处理的重要性日益凸显。

而一款好的ADC (Analog to Digital Convertor) 和一个高效的存储平台EEPROM (Electrically Erasable Programmable Read-Only Memory) 就成为建立可靠稳定的信号处理系统的重要组成部分。

本文将讨论STC单片机如何进行AD转换及EEPROM的使用。

首先,AD转换是将模拟信号转换成数字量的过程,是建立信号处理系统的关键步骤之一。

STC单片机内置了一个12位的AD转换器,也就是说,它可以将模拟信号转换成一个12位的数字信号,这是非常精确的。

下面我们来看看如何在代码中使用AD转换。

AD转换的原理很简单,即将待转换的模拟信号输入到AD口,接着启动AD转换。

当转换结束后,检测转换结束标志位,然后将转换结果读出。

这里具体介绍一下代码的实现方法。

首先,需要定义AD口的引脚、参考电压及转换效率等参数。

代码如下:#define ADC_PIN 0x01 //定义AD口所连接的引脚为P1.1#define ADC_REF 0x80 //定义参考电压为内部参考电压#define ADC_MODE 0xC0 //定义转换效率为最快接着,需要配置AD口所连接的引脚,使其成为输入口。

代码如下:P1ASF = 0x02; //定义P1.1为AD口输入接下来,启动AD转换,等待转换结束标志位的出现。

代码如下:ADC_CONTR = ADC_REF | ADC_MODE | ADC_PIN; //配置AD口ADC_CONTR |= 0x08; //启动AD转换while (!(ADC_CONTR & 0x20)); //等待转换结束标志位最后,将AD转换结果读出。

代码如下:uint16_t value;value = ADC_RES;value |= ADC_RESL << 8;我们可以看到,在STC单片机中使用AD转换非常方便,只需要简单的几行代码就可以完成。

单片机AD转换实验

单片机AD转换实验

一、实验目的1、掌握单片机与ADC0809的接口设计方法。

2、掌握Proteus软件与Keil软件的使用方法。

二、实验要求1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。

2、在0809的某一模拟量输入通道上接外部模拟量。

3、在单片机的外部扩展数码管显示器。

4、分别采用延时和查询的方法编写A/D转换程序。

5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。

三、实验电路图四、实验程序流程框图和程序清单1、查询ORG 0000H START:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8H MOVX @DPTR, ALOOP1:JNB P3.2, LOOP1MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, A LCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEH LOOP2:MOV P2, R3 MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETEND2、延时ORG 0000HSTART:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8HMOVX @DPTR, ALCALL DELAY100MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, ALCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEHLOOP2:MOV P2, R3MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETDELAY100: MOV R6,#01H;误差 0usDL0:MOV R5,#2FHDJNZ R5,$DJNZ R6,DL0RETEND3、中断ORG 0000HSTART:LJMP MAINORG 0003HLJMP INTT0ORG 0100HMAIN: MOV SP, #6FHSETB EASETB EX0MOV DPTR, #0000HMOVX @DPTR, AHERE: LJMP HEREINTT0:MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, A //整数部分放22H中MOV A, #10MOV 22H, A //小数点放22H中MOV A, BLCALL CHULIMOV 21H, A //小数点后第一位放21H中 MOV A, BLCALL CHULIMOV 20H, A //小数点后第一位放21H中 LCALL DIRMOV DPTR, #0000HMOVX @DPTR, ARETIDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #01HLOOP2:MOV P2, R3 //位控码初始值MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JB ACC.3 LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LJMP LP3LP2: MOV A, #5MOV B, #0LP3: RETEND五、实验结果六、实验总结通过本次试验掌握了A/D转换的电路设计,掌握了AD0808的使用以及编址技术,熟悉了A/D转换的方法和A/D转换的程序设计方法。

实验AD转换

实验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。

实验5stc单片机adc转换实验

实验5stc单片机adc转换实验

实验5S T C单片机A D C转换实验(总6页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除1.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:hex路径:3.实验原理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?转换,若能将定时器/串行口/中断系统关闭更好。

SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表3.4 SPEED1、SPEED0描述ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0。

微机原理 实验五 AD转换实验

微机原理  实验五 AD转换实验

实验五 A/D转换实验一、实验目的了解模/数转换基本原理,掌握ADC0809的使用方法;掌握定时数据采集程序的编制方法。

二、实验内容1、A/D转换实验利用实验系统上电位器提供的可调电压作为0809模拟信号的输入,编制程序,将模拟量转换为数字量,通过数码管显示出来。

(1)实验接线图图6-1(2)编程指南ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和WR,故启动A/D转换只须如下两条指令:MOV DX,ADPORT ;ADC0809端口地址OUT DX,AL ;发CS和WR信号并送通道地址用延时方式等待A/D转换结果,使用下述指令读取A/D转换结果。

MOV DX,ADPORT ;ADC0809端口地址IN AL,DX循环不断采样A/D转换的结果,边采样边显示A/D转换后的数字量。

(3)实验程序框图(4)实验步骤①将0809 CS4插孔连到译码输出FF80H插孔、连JX6→JX17。

②将通道0模拟量输入端IN0连电位器W1的中心插头AOUT1(0-5V)插孔,8MHZ→T。

③运行实验程序如在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM文件夹,点击H0809.ASM文件,单击“确定”即可装入A/D转换实验源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“R运行”或工具图标运行,即开始运行程序。

如果在没有PC机的情况下,则在8086K系统显示监控提示符“P.”时,用户段地址固定为0000(省略输入),按SCAL键,输入起始偏移地址1000,按EXEC键,在系统上显示“0809 XX”。

“XX”表示输入模拟量转换后的数字量。

④调节电位器Wl, 显示器上会不断显示新的转换结果。

STC单片机的A D转换

STC单片机的A  D转换

/*------------------------------------------------------------------*//* --- STC1T系列单片机的A / D转换演示-------------------------------*//*------------------------------------------------------------------*/#include "reg51.h"#include "intrins.h"#define FOSC 18432000L#define BAUD 9600typedef unsigned char BYTE;typedef unsigned int WORD;/*声明与ADC相关的SFR */sfr ADC_CONTR = 0xBC; //ADC控制寄存器sfr ADC_RES = 0xBD; //存放ADC高8位的寄存器sfr ADC_LOW2 = 0xBE; //存放ADC低2位的寄存器sfr P1ASF = 0x9D; //P1辅助功能控制寄存器/*ADC_COUNT中的ADC操作常量定义*/#define ADC_POWER 0x80 //ADC电源控制位#define ADC_FLAG 0x10 //ADC完成标志#define ADC_START 0x08 //ADC启动控制位#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clocksvoid InitUart();void SendData(BYTE dat);void Delay(WORD n);void InitADC();BYTE ch = 0; //ADC channel NO.void main(){InitUart(); //初始化UART,显示ADC结果InitADC(); //初始化ADC的SFRIE = 0xa0; //启用ADC中断和打开主中断开关//启动A / D转换while (1){;}}/*--------------------------------------------ADC中断服务程序---------------------------------------------*/void adc_isr() interrupt 5 using 1{ADC_CONTR &= !ADC_FLAG; //ADC中断标志位清零SendData(ch); //获取通道号SendData(ADC_RES); //获取ADC的高8位结果,并发送至UART//如果你想显示的10位结果,取消下一行// SendData(ADC_LOW2); //显示ADC的低2位结果if (++ch > 7) ch = 0; //切换到下一个通道ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;}/*----------------------------初始ADC的SFR----------------------------*/void InitADC(){P1ASF = 0xff; //所有的P1设置为模拟输入端口ADC_RES = 0; //清除以前的结果ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;Delay(2); //ADC的上电延迟,并启动A / D转换}/*----------------------------初始化UART----------------------------*/void InitUart(){SCON = 0x5a; //8位数据,无校验位TMOD = 0x20; //定时器T1的方式2,8位自动重装TH1 = TL1 = -(FOSC/12/32/BAUD); //设置UART的波特率TR1 = 1; //定时器T1开始运行}/*----------------------------一个字节的数据发送到PC输入:DAT(UART数据)输出:-----------------------------*/void SendData(BYTE dat){while (!TI); //等待数据发送完毕TI = 0; //清除TI标志SBUF = dat; //发送当前数据}/*----------------------------软件延时----------------------------*/void Delay(WORD n){WORD x;while (n--){x = 5000;while (x--);}}。

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

实验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 转换,若能将定时器/串行口/中断系统关闭更好。

SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表3.4 SPEED1、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.5 CHS2/CHS1/CH0定义ADC_RES、ADC_RESL:ADC结果寄存器。

该寄存器用于存A/D转换结果,其定义如表3.6所示:表3.6 ADC_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.7 ADRJ=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.8 IE寄存器定义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.9 IPH、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 STC 单片机ADC转换实验-V20170317下的工程文件,编译源码,生成ADC.hex可执行文件,该可执行文件自动保存在配套光盘\源代码\单片机原理与技术\实验5 STC单片机ADC转换实验-V20170317\out目录下。

(注意:请根据该目录下ADC.hex文件的生成时间,判断该文件是否是自己刚刚编译完成的)4.1.2 将12号节点的开关S1拨打到左边,让STC单片机与DB9相连。

4.1.3 根据配套光盘\第三方应用软件\STC_ISP\STC-ISP软件使用说明书,使用STC-ISP软件将4.1.1步中生成的可执行ADC.hex文件通过STC_ISP串口下载软件,下载到12号节点的STC单片机中。

4.2 实验源代码解析ADC.c源代码/*************************************************************** 晶振频率:选取用RC 11.0592MHz* 文件名:ADC.c* 功能说明:STC12C5A16S2单片机的A/D转换演示实验* 制作:* 变更记录:2013.05.5* 变更内容:新建造**************************************************************//************* 用户系统配置**************/#define MAIN_Fosc 11059200L //定义主时钟, 模拟串口和和延时会自动适应。

5~35MHZ/************* 以下宏定义用户请勿修改**************/#include "reg51.H"#define uchar unsigned char#define uint unsigned int/****************特殊寄存器声明************************/sfr P1ASF = 0x9D; //12C5A60AD/S2系列模拟输入(AD或LVD)选择sfr ADC_CONTR = 0xBC; //带AD系列sfr ADC_RES = 0xBD; //带AD系列sfr ADC_RESL = 0xBE; //带AD系列#define ADC_OFF() ADC_CONTR = 0 //ADC转换关#define ADC_ON (1 << 7) //ADC转换开#define ADC_90T (3 << 5) //90个时钟周期转换一次#define ADC_180T (2 << 5) //180个时钟周期转换一次#define ADC_360T (1 << 5) //360个时钟周期转换一次#define ADC_540T 0 //540个时钟周期转换一次#define ADC_FLAG (1 << 4) //软件清0#define ADC_START (1 << 3) //开始ADC转换#define ADC_CH0 0 //P1_0作为AD转换通道#define ADC_CH1 1 //P1_1作为AD转换通道#define ADC_CH2 2 //P1_2作为AD转换通道#define ADC_CH3 3 //P1_3作为AD转换通道#define ADC_CH4 4 //P1_4作为AD转换通道#define ADC_CH5 5 //P1_5作为AD转换通道#define ADC_CH6 6 //P1_6作为AD转换通道#define ADC_CH7 7 //P1_7作为AD转换通道/************* 本地变量声明 **************/sbit P_TXD1 = P3^1;/************* 本地函数声明 **************/void Tx1Send(uchar dat);void PrintString(unsigned char code *puts);void delay_ms(unsigned char ms);uint adc10_start(uchar channel); //channel = 0~7/************************************************************** 函数名:main( void )* 输入:无* 输出:无* 功能描述:串口初始化参数为9600 8 N 1.* 程序一开始执行输出"",然后将A/D转换的* 值通过串口输出**************************************************************/void main(void){uint j;PrintString("*********\r\n");//上电后串口发送一条提示信息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(uchar channel)* 输入:需要转换的ADC通道* 输出:无* 功能描述:串口初始化参数为9600 8 N 1.* 程序一开始执行输出"",然后将A/D转换的* 值通过串口输出**************************************************************/uint adc10_start(uchar channel){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; //软件清0 AD转换结束标志位adc = (uint)ADC_RES; //获取AD转换的高位adc = (adc << 2) | (ADC_RESL & 3); //获取AD转换的低位return adc; //返回AD转换值}}while(--i);return 1024;}/************************************************************** 函数名:delay_ms(unsigned char ms)* 输入:延时数* 输出:无* 功能描述:产生毫秒级别延时**************************************************************/void delay_ms(unsigned char ms){unsigned int i;do{i = MAIN_Fosc / 14000;while(--i) ; //14T per loop}while(--ms);}/************************************************************** 函数名:BitTime(void)* 输入:无* 输出:无* 功能描述:位操作时间函数**************************************************************/void BitTime(void) //位时间函数{uint i;i = ((MAIN_Fosc / 100) * 104) / 140000L - 1; //根据主时钟来计算位时间while(--i);}/************************************************************** 函数名: Tx1Send(uchar dat)* 输入:发送字符* 输出:无* 功能描述:串口初始化参数为9600 8 N 1.* 通过串口发送一个字符**************************************************************/void Tx1Send(uchar dat){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(unsigned char code *puts)* 输入:无* 输出:无* 功能描述:通过串口输出字符串**************************************************************/void PrintString(unsigned char code *puts){for (; *puts != 0; puts++) Tx1Send(*puts); //遇到停止符0结束}4.3 程序执行效果第一步:关闭STC-ISP软件,S1开关拨打至左边,让DB9与STC单片机相连,打开串口调试助手软件,配置串口参数,如图4.1所示:图4.1 串口参数配置第二步:给12号节点上电,可以看到串口助手返回的AD值信息,如图4.2所示:图4.2 ADC运行结果。

相关文档
最新文档