STC系列单片机内部AD应用

合集下载

stc单片机内部adc采样原理及c语言

stc单片机内部adc采样原理及c语言

一、STC单片机内部ADC采样原理STC单片机是一种常用的嵌入式控制器,而ADC即模数转换器,是用于将模拟信号转换成数字信号的重要电子元件。

STC单片机内部ADC 采样原理是指在STC单片机中内置的ADC模块如何实现对模拟信号的采样和转换。

1. ADC的基本原理ADC的基本原理是将模拟信号按一定的时间间隔进行采样,然后将这些采样值转换成数字信号。

在STC单片机中,内部ADC采样原理遵循这一基本原理。

2. 采样电路STC单片机内部ADC采样电路包括采样保持电路、模拟开关电路和模拟比较器电路。

采样保持电路用于在采样过程中保持模拟信号的稳定,模拟开关电路用于控制模拟信号的模拟开关,模拟比较器电路用于将模拟信号转换成数字信号。

3. 采样精度STC单片机内部ADC采样精度通常取决于其ADC模块的位数,不同型号的STC单片机内部ADC模块位数不同,一般有8位、10位、12位等。

采样精度越高,转换得到的数字信号就越精准。

4. 采样速率STC单片机内部ADC模块的采样速率指的是它每秒钟能够进行的采样次数。

采样速率越高,能够实时捕捉到信号的变化,但也会增加系统的负荷。

5. 采样触发方式STC单片机内部ADC有自动触发采样和手动触发采样两种方式。

自动触发采样是指ADC模块在接收到一定触发条件后自动开始采样,而手动触发采样则需要在程序中通过相应的指令手动触发ADC模块进行采样。

二、C语言在STC单片机内部ADC采样中的应用C语言作为一种高级程序设计语言,在STC单片机内部ADC采样中扮演着重要的角色,通过编写相应的C语言程序,可以实现对STC单片机内部ADC模块的配置和使用。

1. ADC配置在C语言中,可以通过对STC单片机内部寄存器的操作来配置ADC 模块的工作参数,包括采样精度、采样速率、采样触发方式等。

2. 采样程序编写C语言可以通过读取ADC模块的寄存器来获取采样值,然后根据需要进行相应的处理,例如计算电压值、控制外设等。

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转换非常方便,只需要简单的几行代码就可以完成。

STCCASAD功能的使用

STCCASAD功能的使用

S T C12C5A60S2系列单片机A D功能详解作者:裴博宇作者原本旨在对STC12C5A60S2(后文简称该单片机、12C单片机)系列单片机相对传统51内核单片机升级内容进行详细解析,和程序应用分析,但是由于时间原因只写到了AD的查询方式使用,抱歉了,如果有什么错误欢迎批评指正,但是申明本人是一个学生,文章也只适合于初学者,希望行业的老人不要骂的太狠。

本文以STC12C5A60S2系列单片机芯片手册为母本编写。

一、相关寄存器介绍12C单片机自带8路10位AD,要使用他就必须明确其相关寄存器:P1ASF 寄存器P1口模拟配置寄存器,地址:9DH,复位值:00H。

12C单片机的AD转换引脚与P1I/O口复用,P1ASF寄存器指定P1寄存器哪一位用于AD 转换,哪一位做I/O口用。

具体是,P1ASF寄存器的8位对应P1的8位,1代表做AD转换通道用,0代表做I/O口用。

不可位寻址。

ADC_CONTR寄存器ADC控制寄存器,地址BCH,复位值:00H。

位说明:ADC_CONTR.7(这种写法其实是有问题的,因为该寄存器不支持位寻址,仅供阅读方便)——ADC_POWER。

ADC开关,要使用AD转换功能该位必须置“1”。

开在初始化时直接将其置“1”,但考虑到能耗的因素,最好在使用时开启,使用结束后关闭。

ADC_CONTR.6——SPEED1、ADC_CONTR.5——SPEED2,AD转换速率控制寄存器。

00——540个时钟周期转换一次;01——360个时钟周期转换一次;10——180个时钟周期转换一次;11——90个时钟周期转换一次。

转换速率并非越快越好,当然从效率角度来讲我们希望他更快,但是转换速率愉快能耗越高,同时准确度越低,所以请选择一个合理的周期。

ADC_CONTR.5——FLAG,AD转换结束标志位。

当AD转换结束时,自动拉高,标志转换结束。

注意,需用软件拉低。

ADC_CONTR.4——SRART,AD转换启动位。

STC单片机ADC采样程序设计

STC单片机ADC采样程序设计

STC单片机ADC采样程序设计单片机是一种集成电路,拥有微处理器、内存和外设接口等功能,可用于控制各种电子设备。

ADC(模拟数字转换器)是单片机的一个重要外设,用于将模拟信号转换为数字信号,便于单片机进行处理。

以下是一个示例的STC单片机ADC采样程序设计:1.硬件准备:-STC单片机(例如STC51或STC89系列)-ADC外设(通常内置于单片机)-模拟信号源(例如电位器)2.硬件连接:-将模拟信号源连接到单片机的ADC引脚(例如P3.0)-连接电源和地线3.软件设计:-引入头文件和定义常量:在程序开始处引入相关头文件,并定义ADC引脚和其他常量。

```c#include <STC89.H>#define ADC_PIN P3_0#define ADC_RESULT P2```-配置ADC参数:设置ADC的工作模式、参考电压等参数。

```cvoid ADC_InitADC_CONTR=0x80;//打开ADC电源,设置ADC模式ADC_CONTR&=0xFE;//清除ADC_BUSY标志位ADC_RES=0;ADC_CONTR&=0x9F;//设置参考电压为VDD}```-ADC采样过程:通过设置ADCCONTR和ADCRES寄存器进行ADC采样。

```cunsigned int ADC_Read(unsigned char channel)unsigned int ADC_value;ADC_CONTR&=0xF8;//清除原通道配置ADC_CONTR ,= channel; // 选择ADC通道ADC_CONTR,=0x08;//启动ADC转换_nop_(; // 延时等待ADC转换完成_nop_(;_nop_(;while (!(ADC_CONTR & 0x10)) //等待ADC转换完成;}ADC_CONTR&=~0x10;//清除ADC完成标志位ADC_value = ADC_RES; // 读取ADC结果ADC_value = (ADC_value << 2) , ADC_RESL; // 合并ADC高位和低位return ADC_value;}```- 主函数:在主函数中调用ADC_Init初始化ADC,并使用ADC_Read 进行采样。

stc单片机ad温度转换计算

stc单片机ad温度转换计算

STC单片机AD温度转换计算一、概述STC单片机是一种常用的嵌入式微控制器,广泛应用于各种电子设备中。

其中,采集温度传感器的数据是STC单片机的常见应用之一。

本文将介绍如何利用STC单片机的AD转换功能,实现温度数据的采集和计算。

二、AD转换原理1. STC单片机内部的AD转换器是一种10位逐次逼近式AD转换器,可以将模拟信号转换为数字信号。

2. 要进行温度转换,需要先连接温度传感器到STC单片机的AD输入引脚,并将相应的引脚配置为输入模式。

3. 通过编程,设置AD转换器的工作模式、参考电压和时钟频率等参数,以确保AD转换的准确性和稳定性。

三、温度传感器的接入1. 常用的温度传感器有NTC热敏电阻、DS18B20数字温度传感器等。

这些传感器可以通过一定的电路连接到STC单片机的AD输入引脚。

2. 在连接时,需要考虑传感器的电气特性,如输入电压范围、输出信号类型等,以确保传感器与单片机的兼容性。

3. 另外,还需要考虑传感器的精度、响应时间和稳定性等性能指标,以选择合适的传感器用于温度测量。

四、温度转换计算1. 获取AD转换后的数字数据后,需要利用一定的算法将其转换为实际的温度数值。

2. 对于NTC热敏电阻传感器,可以利用斯特林公式和双参数B25/85值来计算温度。

3. 而对于DS18B20数字温度传感器,可以直接从AD转换的数字值中得到温度数据。

4. 在计算过程中需要考虑温度传感器的特性曲线、环境温度补偿等因素,以提高温度测量的准确性和可靠性。

五、温度数据的处理与显示1. 获取到温度数据后,可以进行一定的数据处理和滤波,以消除测量中的噪声和干扰。

2. 可以通过串口通信或LCD显示屏等外设,将温度数据实时显示出来,以方便用户对温度进行监测和控制。

3. 另外,还可以将温度数据存储到EEPROM或外部存储器中,以便后续的数据分析和应用。

六、实验验证1. 为了验证温度转换计算的准确性,可以进行一定的实验验证。

STC内部AD采集程序

STC内部AD采集程序

// 存放计算出来的外部输入电压 // 存放 AD 转换返回的结果 // 串口初始化 9600/22.1184MHz

// 采样 P1.1 口模拟输入电压 // 注意是 1023 才正确
// 若不用串口显示,此行可设置断点仿真观察结果
// 这里所有带内部 AD 采集的 STC 单片机都可以
//注意后面没分号 //注意后面没分号 //注意后面有分号
//下面代码设置定时器 1 TMOD = 0x20; // 0010 0000 定时器 1 工作于方式 2(8 位自动重装方式) TH1 = 0xFA; // 波特率:9600 /22.1184MHZ (FD/11.0592M) TL1 = 0xFA; // 波特率:9600 /22.1184MHZ (FD/11.0592M) TR1 = 1;
P1ASF|=0x02; ADC_CONTR=0xE1; 成标志。 for (i=0;i<1000;i++); // 如果是多通道模拟量进行 AD 转换,则更换 AD 转换通道后要 适当延时, // 使输入电压稳定,延时量取 20μs~200μs 即可,与输入电压源的内阻有关,如果输入 电压信号源的内 // 阻在 10K 以下,可不加延时,如果是单通道模拟量转换,则不需要更换 AD 转换通道,也
不需要加延时。 ADC_CONTR|=0x08; status=0; while(status==0) { } ADC_CONTR&=0xE7; ADC_START=0。 AD_Dat = ADC_RES; AD_Dat <<= 2; Tmp = ADC_RESL; Tmp &= 0x03; AD_Dat |= Tmp; return AD_Dat; } void main(void) { float Vin; unsigned int ADvalue; UART_init(); printf("串口初始化完毕"); while(1) { ADvalue=ADC_P11(); Vin=VCC*ADvalue/1023; printf("%.3f ",Vin); delay500ms(); } }

STC12C5A32S2单片机的ADC采样功能示例

STC12C5A32S2单片机的ADC采样功能示例

//打开 AD 转换电源、
设定转换速度、设定通道号、AD 转换开始
_nop_();_nop_();_nop_();_nop_();_nop_();
//延时4个时钟周期左右
while(!(ADC_CONTR&ADC_FLAG));
//等待转换
结束 =0x10 ADC_FLAG 位=1
adc_data=(ADC_RES&0x03)*256+ADC_RESL;
STC12C5A32S2单片机的 ADC 采样功能示例(C51)
//本程序主要演示了 //1、1602液晶的编程与使用,包括显示定位、显示2/4位整数、显示浮点数等 //2、STC12C5A32S2单片机的 ADC 采样功能(以第0、1通道为例) // //注:本示例仅仅演示如何进行 ADC 和显示,每 ADC 一次就显示一次,实际应用时, //应多次 ADC 并进行相应处理,比如取平均值后,才能得到比较稳定的 AD 值
6、直流电压精密可调电阻输出:P1.0 可通过跳线帽断开
7、光敏电阻:P1.1 可通过跳线帽断开
8、按键:均通过二极管连接到 P3.2(外部中断0口),低电平有效,下降沿触发
K0:P3.3、
K1:P3.4、
K2:P3.5、
P3.6、
K4:P3.7
9、24C02连接:
SDA:P2.7 (上拉有发光二极管,低电平亮)
{
n&=0x07;
//确保 n=0----7通道
AURX1|=0x04;
//转换结果存储格式:数据的高2位放 ADC_RES,低8位放 ADC_RESL
P1ASF=1<<n;
//将 P1.n 设为 ADC 采样功能

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示STC单片机内部ADC采集电压用数码管显示/////////////////////////////////////////////////////////////////// /////////////////////////////////// ///特点:/// ///1、数码管显示用中断方式/// ///2、STC12C5A60S2内ADC采样电压值,先采样30次然后去掉上下10个再取平均值/// ///3、采集数据用串口发送到PC /// ///------------------------------------------------------------------------shenzhen---iqss----2011/02/23--------/////////////////////////////////////////////////////////////////////////// //////////////////////////////#include#define uchar unsigned char#define uint unsigned int#define segp P0#define scanp P2uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带点段驱动信号uchar code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带点段驱动uchar code scan[]={0xfe,0xfd,0xfb,0xf7}; //位扫描驱动信号uint display[4]={0,0,0,0}; //初始显示数字uint con=0, _data=0,data2=0; //con显示循环变量_data为ADC采样值临时变量data显示数据临时变量sfr P1ASF=0x9d; //下面五行为ADC定义sfr ADC_CONTR=0xbc;sfr ADC_RES=0xbd;sfr ADC_RESL=0xbe;sfr AUXR1=0xa2;void t0_t1_init(); //t0显示扫描定时器和t1串口比特率定时器初始化函数void adc_init(); //adc初始化函数void uart_out(uchar byte); //串口发送字节函数uint average(uint buffer[30]); //采样数据处理函数void AD(); //电压采样30次函数void delay1ms(uchar x); //延时函数void main(){t0_t1_init();adc_init();while(1){AD();}}/////////定时器初始化///////void t0_t1_init(){ SCON=0x50;PCON=0;TMOD=0x21;TH1=TL1=0xe6;TH0=0xf0;TL0=0x60;EA=ET0=1;// ES=1;TR1=1;TR0=1;}/////ADC初始化///////void adc_init(){ P1ASF=0x01; //启动P10为ADC模拟输入口把内部上拉电阻断开AUXR1 &= 0xfb; //adrj_0 高8位在ADC_RESADC_RES=0; //初值ADC_CONTR=0x80; //开启ADC电源SPEED_1_1,chs000(选择AD采样通道p10) delay1ms(2);// IE|=0xa0;}//////采集30次电压值//////void AD(){ char i;uint temp_buf[30]={0};for(i=0;i<30;i++){ ADC_CONTR |=0x08; //开启转换while((ADC_CONTR&0x10)==0);ADC_CONTR &=0xe7; //清除标志temp_buf[i]=ADC_RES; //取出数值到temp_buf}_data=average(temp_buf); //采样30次后的数据代入处理函数处理后返回处理后的数值,给下面用串口发送出去uart_out(_data);}/////先对整个数组的三十个值进行从小到大的排列,/////////再去掉最大5个和最少5个再求平均值;函数返回temp值/// uint average(uint buffer[30]){uchar i,j;uint temp;for(i=1; i<30; i++)for(j=29; j>=i; --j){if(buffer[j-1] > buffer[j]){temp = buffer[j-1];buffer[j-1] = buffer[j];buffer[j] = temp;}}temp = 0;for(i=5; i<25; i++){temp += buffer[i];}temp = (uint)(((float)temp) / 20 + 0.5);return(temp);}///显示数据处理及扫描显示中断服务函数//// void t0_4ms(void) interrupt 1{data2=_data;data2=_data*19.53;display[3]=tab_d[data2/1000];display[2]=tab[(data2/100)%10];display[1]=tab[(data2/10)%10];display[0]=tab[data2%10];TH0=0xf0;TL0=0x60;if(++con==5) con=1;// segp=0xff;segp=display[con-1];scanp=scan[con-1];}///串口发送节字函数//// void uart_out(uchar byte) { SBUF=byte;while(TI==0);TI=0;}///1ms延时////void delay1ms(uchar x) { uchar i,j;for(i=0;i<x;i++)< p=""> for(j=0;j<250;j++); }</x;i++)<>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CHS1
CHS0
xxx0
制寄存器
0000
ADC_DATA
C6H
AD转换结
--
--
--
--
--
--
--
--
0000
果寄存器
0000
P1_ADC_EN P1.X
相应位设置为“1”时,对应地P1.X口作为AD转换使用,内部上拉 电阻自动断开•
ADC_CONTR AD
ADC_STARTAD转换启动控制位,设置为“1”时,AD开始转换.
delay(0x200);
delay(0x200);
}typedef:类型定义,其功能是用户为已有数据类型取“别名”
女口:typedef int INT;意思是将int重新定义为INT,以后使用INT
a;就相当于inta;
用typedef定义数组、指针、结构等类型将带来很大地方便,不仅使 程序书写简单,而且使意义更为明确,因而增强了可读性•例如:typedef
RCAP2L=0xDB;
ES= 1;//允许串口中断
}
void Send_Byte(INT8U one_byte)//发送一个字节
{
TI= 0;//清零串口发送中断标志
SBUF=one_byte;
while (TI== 0);
TI = 0;//清零串口发送中断标志
}
INT8U get_AD_result(INT8U channel)
typedef unsigned char INT8U;
typedef unsigned int INT16U;
void delay(INT8U delay_time) //延时函数
{
INT8U n;
INT16U m;
for (n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
ADC_FLAG AD
CHS2 CHS1 CHS0
表2STC89系列单片机AD模拟通道选择设置
CHS2
CHS1
CHS0
模拟输入通道选择
0
0
0
选择P1.0作为AD输入来用
0
0
1
选择P1.1作为AD输入来用
0
1
0
选择P1.2作为AD输入来用
0
1
1
选择P1.3作为AD输入来用
1
0
0
选择P1.4作为AD输入来用
void main()
initiate_RS232();
P1 = P1 | 0x63; // 0110,0011,要设置为A/D转换地P1.x口,先设为高
P1_ADC_EN=0x63; //0110,0011, P1地P1.0,P1.1,P1.5,P1.6设置为A/D转换输入脚
//断开P1.0,P1.1,P1.5,P1.6内部上拉电阻
while(1)
{
delay(0x200);
Send_Byte(0);//连续发送4个00H,便于观察输出显示
Send_Byte(0);
Send_Byte(0);
Send_Byte(0); delay(0x200); //延时delay(0x200);
delay(0x200);
delay(0x200);
新建文件part3.4.5.c,程序代码如下:
#include <reg52.H>
#include <intrins.H>
//定义与ADC有关地特殊功能寄存器
sfr P1_ADC_EN=0x97; //A/D转换功能允许寄存器
sfr ADC_CONTR=0xC5; //A/D转换控制寄存器
sfr ADC_DATA=0xC6; //A/D转换结果寄存器
名称
地址
功能描述
D7
D6
D5
D4
D3
D2
D1
D0
复位值
P1_ADC_EN
97H
允许P1.X
AD P17
AD P16
AD P15
AD P14
AD P13
AD P12
AD P11
AD P10
0000
成为AD口
0000
ADC_CONTR
C5H
AD转换控
--
--
--
ADC_FLAG
ADC_START
CHS2
while(AD_finished== 0 ) //等待A/D转换结束
{
AD_finished=(ADC_CONTR&0x10);〃0001,0000,ADC_FLAG==测试A/D转
换结束否
ADC_CONTR&=0xF7;//1111,0111令ADC_START= 0,关闭A/D转换,
return (ADC_DATA);//返回A/D转换结果
}
}
void initiate_RS232(void)//串口初始化
{
ES= 0;//禁止串口中断
SCON=0x50;// 0101,0000 8位数据位,无奇偶校验
T2CON=0x34;// 0011,0100, 由T2作为波特率发生器
RCAP2H=0xFF;//时钟11.0592MHz,9600波特率
STC系列单片机内部AD地应用
STC89LE52AD 54AD 58AD、516AD这几款89系列地STC单片机内部 自带有8路8位地AD转换器,分布在P1口地8位上,当时钟在40MHz以 下时,每17个机器周期可完成一次AD转换.
与AD相关地几个寄存器如表1所示.
表1STC89系列单片机AD相关寄存器
{
INT8U AD_finished= 0; //存储A/D转换标志
ADC_DATA= 0;
ADC_CONTR=channel; //选择A/D当前通道
delay(1);//使输入电压达到稳定
ADC_CONTR|=0x08;//0000,1000令ADC_START= 1启动A/D转换
AD_finished= 0;
int a[10];表示a是整型数组类型,数组长度为10,然后就可用a定义变量,如:a si, s2;完全等效于:int s1[10], s2[10];
define:宏定义.
女口:#define PI 3.14意思是以后程序中出现PI地地方将用3.14代替,这个替换是 在编译预处理阶段完成地,注意#define最后没有分号,否则编译时将分号一同带入PI
1
0
1
选择P1.5作为AD输入来用
1
1
0
选择P1.6作为AD输入来用
1
1
1
选择P1.7作为AD输入来用
ADC_DATA AD转换结果寄存器.模拟/数字转换结果计算公式如下:
结果=256XVin/Vcc
Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工 作电压作为模拟参考电压•
下面一个例程演示STC89LE516AD/X系列单片机地A/D转换功能•时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程 序观察输出结果.(本代码摘自宏晶科技芯片手册,经作者调试可正常运行).
相关文档
最新文档