实验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--);}}。

嵌入式系统实验五-ADC转换实验

嵌入式系统实验五-ADC转换实验

《嵌入式系统》课程实验报告学生姓名:所在班级:指导教师:记分及评价:一、实验名称ADC转换实验二、实验目的了解S3C2410X处理器ADC相关控制寄存器的使用;通过实验掌握模数转换的原理;掌握S3C2410X处理器的ADC转换功能。

三、实验内容设计分压电路,利用S3C2410X集成的ADC模块,把分压值转换为数字信号,并通过超级终端和数码管观察转换结果。

四、实验原理1、S3C2410X处理器的A/D转换处理器内部集成了采用近似计数式的8路10位ADC,集成零比较器,内部产生比较时钟信号;支持软件使能休眠模式,以减少电压损耗。

其主要特性:—分辩率:10-位—微分线性度误差:±1.0 LSB—积分线性度误差:±2.0 LSB—最大转换速率:500 KSPS—低功耗—供电电压:3.3V—输入模拟电压范围:0 ~ 3.3V—片上采样保持功能—普通转换模式—分离的X/Y轴坐标转换模式—自动(连续) X/Y轴坐标转换模式—等待中断模式2、S3C2410X的AD转换的使用寄存器组处理器集成的ADC只使用到两个寄存器,即ADC控制寄存器(ADCCON)、ADC数据寄存器(ADCDAT)。

AD转换器的结构图如下:五、实验结果超级终端上显示以下信息:六、练习题参考实验程序,对第四通道的输入电压进行循环采样,循环周期为0.5S,并求出采样数据的平均值。

void adc_test(void){int i,j;UINT16T usConData;float usEndData;float usAllData=0.0;float usArvData;uart_printf("\n ADC_IN Test\n");uart_printf(" ADC conv. freq. = %dHz\n",ADC_FREQ);unPreScaler = PCLK/ADC_FREQ - 1;rADCCON=(1<<14)|(unPreScaler<<6)|(1<<5)|(0<<2)|(1<<1);uart_printf(" Please adjust AIN0 value!\n");uart_printf(" The results of ADC are:\n");usConData=rADCDAT0&0x3FF;for(j = 0; j < 20; j++){while(!(rADCCON & 0x8000));usConData = rADCDAT0&0x3FF;usEndData = usConData * 3.3000 / 0x3FF;uart_printf(" %0.4f ",usEndData);usAllData=usAllData+usEndData;delay(5000);}usArvData= usAllData/20;uart_printf("\n 平均值:%0.4f ",usArvData);uart_printf(" End.\n");}。

STC单片机通用AD转换程序

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}}。

单片机AD模数转换实验报告

单片机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模块的使用方法。

通过实际操作,我们掌握了实验步骤和注意事项,提高了实际操作的能力和理论知识的运用。

这对我们的电子技术学习和应用都起到了积极的促进作用。

单片机 DA、AD转换实验

单片机 DA、AD转换实验

实验目的: 实验目的:
1.掌握A/D转换与单片机的接口方法 .掌握 转换与单片机的接口方法. 转换与单片机的接口方法 2.了解A/D芯片 .了解 芯片ADC0809转换性能及编程 转换性能及编程. 芯片 转换性能及编程 3.通过实验了解单片机如何进行数据采集. .通过实验了解单片机如何进行数据采集
实验程序框图
源代码: 源代码:
A_DPORT EQU 8000H ;0809通道0 地址 ORG 0000H LJMP START ORG 0003H LJMP INT_0 ORG 0040H START: MOV SP,#60H MOV R7,#0FFH ;初始化 SETB IT0 SETB EA SETB EX0 ;INT0 允许 A_D:
MOV DPTR,#A_DPORT MOVX @DPTR,A ;启动 A_D CJNE R7,#00H,$ ;等待 A_D 转 换结束 CPL A MOV P1,A ;数据输出 MOV R7,#0FFH ;清读数标志 SJMP A_D INT_0: MOVX A,@DPTR ;读 A_D 数据 MOV R7,#00H ;置读数标志 RE实验
实验要求: 实验要求:
利用实验板上的ADC0809做A/D转换器,利 做 转换器, 利用实验板上的 转换器 用实验板上的电位器W1提供模拟量输入。编制程 提供模拟量输入。 用实验板上的电位器 提供模拟量输入 将模拟量转换成二进制数字量, 序,将模拟量转换成二进制数字量,用发光二极管 将模拟量转换成二进制数字量 显示. 显示
实验电路及连线: 实验电路及连线: CS0809接8000H. 模块电位器V-OUT点(即中心 抽头)接至ADC0809的IN0(通道0).EOC连 P3.2(INT0).将单片机的P1.0~P1.7接至八位发光二 极管L1 -- L8.

STC单片机通用AD转换程序

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}}。

单片机电位器模拟量转换实验总结与反思

单片机电位器模拟量转换实验总结与反思

单片机电位器模拟量转换实验总结与反思在单片机电位器模拟量转换实验中,我学到了如何将电位器的模拟信号转换为数字信号进行处理。

通过这个实验,我深入了解了单片机的模拟转换原理和相关的编程方法。

在实验中,我们需要连接电位器到单片机的模拟输入引脚,并编写相应的程序来将模拟信号转换为数字量。

我首先通过将电位器的引脚连接到单片机的相应引脚上,并且正确设置引脚的输入模式,确保单片机可以正确读取电位器的模拟信号。

然后,我学习了如何使用ADC(模拟数字转换)模块来将模拟信号转换为数字值。

在编程过程中,我需要设置ADC的参考电压和采样频率,以及控制ADC的启动和停止。

在实验中,我还学习了如何读取和处理ADC转换得到的数字值。

我可以将这些值用于进一步的计算或控制其他的电路元件。

通过这个实验,我进一步理解了模拟量和数字量之间的转换过程,并且学会了如何利用单片机的ADC模块进行模拟信号的转换。

这对于我以后的电子设计和开发工作将有很大的帮助。

然而,在实验中也遇到了一些问题和困难。

例如,我可能会遇到电位器的接线问题,导致模拟信号无法正确传输到单片机。

此外,在编程过程中,我可能会遇到一些语法或逻辑错误,导致程序无法正确运行。

为了解决这些问题,我需要更加细心地检查电路连接,确保接线正确。

在编程过程中,我需要仔细检查代码,并进行适当的调试。

此外,我还可以请教老师或同学的帮助,以解决遇到的问题。

总的来说,单片机电位器模拟量转换实验是一次很有意义的实践活动。

通过这个实验,我加深了对单片机的模拟转换原理的了解,并且学会了如何使用单片机进行模拟信号的转换和处理。

同时,我也在实验中遇到了一些问题和困难,但通过认真调试和请教他人的帮助,我最终克服了这些困难。

这个实验对于我以后的学习和工作将有很大的帮助。

单片机ADC实验报告

单片机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、实验成果接线图。

实验五AD转换实验

实验五AD转换实验

实验五,AD转换实验【1.实验目的和要求】(1)了解典型AD芯片结构与功能;(2)掌握ADC0809与8051接口电路设计;(3)掌握查询和中断方式的AD 编程。

【2.实验工具与软件】计算机、KeiluVision4集成开发环境、Proteus8Professional仿真软件【3.主要原理和方法步骤】(1)任务说明正确连接ADDA板与CPU板,包括:ADC、WR#、RD#、ALE、EOC等信号;根据所连电路确定ADC0809各模拟通道的外RAM地址。

#includeabsacc.h#defineADC0809_AIN0XBYTE[0x]#defineADC0809_ AIN1XBYTE[0x]#defineADC0809_AIN2XBYTE[0x]#defineADC0809_AIN 3XBYTE[0x]#defineADC0809_AIN4XBYTE[0x]#defineADC0809_AIN5XB YTE[0x]#defineADC0809_AIN6XBYTE[0x]#defineADC0809_AIN7XBYTE [0x]采用查询方式连续对AIN0通道进行AD转换,并将转换结果通过串口向PC机发送,借助示波器、万用表等仪表比较测量结果与实际电压。

可调节R1可变电阻改变AIN0通道电压;(2)仿真电路原理图(3)程序流程图(4)实例代码及注释分析#includereg51.h#includeabsacc.h#defineCOUNT5000#defineAIN0X BYTE[0x0000]sbitEOC=P3^3;unsignedcharLED_seg[]={0x3f,0x06,0 x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码unsignedcharLED_bit[4]={0x01,0x02,0x04,0x08};//位码unsignedcharLED_buf[3]={0};unsignedcharLED_S;unsignedcharLE D_B;unsignedcharascii_num[10]={0x30,0x31,0x32,0x33,0x34,0x3 5,0x36,0x37,0x38,0x39};//??0~9?ASCII?voiddelay(unsignedintn )//延时函数{unsignedinti;for(i=0;ii++);}voidSbuf_Init(void)//串口初始化函数9600bps,fosc=11.0592MHz{SCON=0x50;//10位方式PCON=0x00;//波特率不倍增TMOD=(TMOD0x0f)|0x20;//T1方式2TH1=0xfd;//T1计数初值//波特率设置TL1=0xfd;EA=1;//串口中断使能TR1=1;//启动定时器}voidTimer0_Init(void){TMOD=(TMOD0xf0)|0x01;//工作方式选择TH0=(65536-COUNT)/256;TL0=(65536-COUNT)%256;//计数初值ET0=1;EA=1;//中断使能TR0=1;//启动T0}voidsend_char(unsignedcharc)//发送字符{SBUF=c;while(TI==0);TI=0;}voidsend_str(unsignedchar*s)//发送字符串{while(*s!="\0"){send_char(*s);s++;delay(5);}}voidmain(void ){unsignedinti=0,ad,pre_ad=0;Sbuf_Init();Timer0_Init();whil e(1){AIN0=0;//启动转换i=i;i=i;//延时delay(20);while(EOC==0);//等待AD转换结束ad=AIN0;//读AD转换结果if(ad!=pre_ad)//当前状态与上一个状态不同{//ad=ad/51;LED_buf[2]=(ad*100/51)/100;//百位LED_buf[1]=(ad*100/51)/10%10;//十位LED_buf[0]=(ad*100/51)%10;//个位send_char(ascii_num[(ad*100/51)/100]);//通过串口将数据发送给虚拟主机send_char(".");send_char(ascii_num[(ad*100/51)/10%10]);send _char(ascii_num[(ad*100/51)%10]);send_str(\r\n}pre_ad=ad;}} voidT0_ISR(void)interrupt1{staticunsignedchari=0;TH0=(65536 -COUNT)/256;TL0=(65536-COUNT)%256;//计数初值if(i==2){P2=~LED_bit[i];//先送位码P1=LED_seg[LED_buf[i]]|0x80;//再送段码}//小数点显示else{P2=~LED_bit[i];//先送位码,不加非号则位码写成0xfe,0xfd,0xfb,0xf7(共阴极位码)P1=LED_seg[LED_buf[i]];//再送段码}i++;if(i==3)i=0;//延时}【4.数据记录】通过调节R1可变电阻可以改变AIN0通道电压,通过AD转换,将获取的数字量通过串口发送到虚拟主机上,并通过电压表测量实际电压与之对比,仿真结果如下图所示:通过调节R1可变电阻可以改变AIN0通道电压,记录数据如下表所示:编号测量参考电压Vref(V)ADC0809的12、16引脚A/D转换结果(数字量)由A/D转换结果计算出的模拟量(V)万用表测量的模拟量(V)相对误差150xc43.843.850.0026250xc13.803.800350xbf3.743.750.0026450x bc3.703.700550xba3.643.650.0027【5.实验思考与小结】通过本次实验,我了解典型AD芯片结构与功能,对该芯片有了一定的了解,并掌握了ADC0809与8051接口电路设计,理解了电路设计后再去进行查询和中断方式的AD编程,感觉理解的更加容易深刻一点,并通过示波器、电压表测量实际电压和AD转换电压值进行比较,从而检测编程电路是否有错误,以及AD转换的准确值;同时还将上次的串口通信实验联系在一起,不仅复习了上次的知识点,还掌握了新的知识点,映像深刻,收获颇多!评语:教师:日期:。

adc转换实验心得

adc转换实验心得

adc转换实验心得
ADC转换实验心得
在完成ADC(模拟数字转换器)转换实验的过程中,我学到了很多关于电子技术和微控制器应用的知识。

这个实验不仅增强了我的理论理解,也提高了我的实践技能。

在实验初期,我学习了ADC的基本工作原理,包括它的转换过程和在各种应用中的重要性。

这让我对ADC有了深入的理解,为我后续的实验打下了坚实的基础。

在实验过程中,我遇到了许多挑战。

例如,我曾多次遇到数据不稳定或转换错误的问题。

通过反复调试和查阅资料,我逐渐找到了解决问题的方法,这让我更加熟悉了ADC的工作原理和特性。

此外,我也学会了如何设置微控制器的ADC模块,以及如何编写和优化ADC转换的代码。

这次实验让我认识到理论与实践相结合的重要性。

理论知识是指导我们实验的基础,而实践则是加深理解和提高技能的关键。

同时,实验中的挑战和问题也让我明白,面对困难时要有耐心和毅力,不断探索和学习是解决问题的关键。

总的来说,这次ADC转换实验是一次非常有价值的经历。

它不仅提高了我的技术水平,也培养了我解决问题的能力。

我相信这些经验对我未来的学习和工作都会有很大的帮助。

第13章 STC单片机ADC原理及实现(5)

第13章 STC单片机ADC原理及实现(5)

LCD的特性指标。
12864图形点阵LCD主要技术参数
显示容量
128×64个像素。每屏可显示4行8列共32个16×16点阵的汉字,或 者4行16列共64个ASCII字符
工作电压范围 4.5V~+5V。对于STC单片机来说,推荐5.0V给12864供电
显示颜色 黄绿/蓝屏/灰屏
LCD类型 STN
与MCU接口 8/4位并行,或者3位串行
交流电压测量和12864 LCD显示
--12864图形点阵字符/图象表示方法
12864图形点阵128×64像素的构成方式。
从后图(a)和(b)中可以看出,将屏幕分成上下部分,每部分包含 32行和128列的像素。
X方向以字节为单位,而Y方向以位为单位。X方向确定列,Y 方向确定行。
该绘图显示RAM 提供128×8 个字节的存储空间。
扩充功能 设定
0
0
0
0
1
1
--
RE= 1
G
0 G=1,打开绘图模式;G=0,关闭绘图模

设定IRAM
SR=1,AC5~AC0为垂直卷动地址
地址或卷 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0
动地址
SR=0,AC3~AC0为ICON IRAM地址
设置绘图 RAM地址
0
0
1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 在地址计数器中,设置CGRAM地址
地址与屏幕显示对应关系如下:
12864第一行:80H、81H、82H、83H、84H、85H、86H、87H 12864第二行:90H、91H、92H、93H、94H、95H、96H、97H 12864第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 12864第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FH

模数转换器(ADC)实验

模数转换器(ADC)实验

模/数转换器(ADC)实验1.实验目的(1)掌握LM3S8962中的ADC 的基本原理和使用方法(2)掌握CCS 开发环境平台2.实验内容(1)ARM 的初始化配置(2)ADC 的初始化配置(3)ADC 对内部温度传感器的温度值采样输出的实验3.ADC 的工作原理ADC 能够将连续变化的模拟电压转化成离散的数字量。

通常通过传感器或变送器将生产过程中的工艺参数转换为电信号,然后经过模拟量输入通道来处理:一般由I/V 变换将电流信号转化为电压信号处理,然后由多路转换器选择输入通道,经过采样保持器保持信号后由A/D 转换器转换信号,转换过程由接口及控制逻辑控制。

在上述模拟输入通道中A/D 转换器和接口及控制逻辑是必不可少的两块。

下图1是ADC 的模块框图。

模数转换器ADCPSSI ADCSAC ADCSSFIFO0ADCSSFIFO1ADCSSFIFO2ADCSSFIFO3ADCSSMUX0ADCSSCTL0ADCSSFSTAT0ADCACTSS ADCOSTATADCUSTATADCSSPRI 采样序列发生器0ADCSSMUX1ADCSSCTL1ADCSSFSTAT1采样序列发生器1ADCSSMUX2ADCSSCTL2ADCSSFSTAT2采样序列发生器2ADCSSMUX3ADCSSCTL3ADCSSFSTAT3采样序列发生器3SS3ADCEMUXADCIMADCRISADCISC 中断控制模拟输入硬件平均电路FIFO 块控制状态SS2SS1SS0比较器GPIO定时器PWM 比较器GPIO定时器PWM 比较器GPIO定时器PWM 比较器GPIO 定时器PWM 触发事件SS0中断SS0中断SS0中断SS0中断图1 ADC 模块框图LM3S8962 ADC 模块的转换分辨率为10位,并支持4个输入通道,以及一个内部温度传感器。

ADC 模块含有4个可编程的采样序列发生器,它可在无需控制器干涉的情况下对多个模拟输入源进行控制。

  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运行结果。

相关文档
最新文档