STC系列单片机内部AD应用
- 格式:docx
- 大小:15.25 KB
- 文档页数:7
一、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使用随着各种电子设备的普及,信号处理的重要性日益凸显。
而一款好的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转换非常方便,只需要简单的几行代码就可以完成。
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采样程序设计单片机是一种集成电路,拥有微处理器、内存和外设接口等功能,可用于控制各种电子设备。
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单片机是一种常用的嵌入式微控制器,广泛应用于各种电子设备中。
其中,采集温度传感器的数据是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单片机内部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++)<>。
ORG 0000HLJMP MAINORG 0000HMAIN:MOV SP,#70H ;设置堆栈MOV P1ASF,#02H ;设置Pl.1为模拟量输入功能MOV ADC_CONTR,#81H ;打开A /D转换电源,设置输入通道MOV A,#20HLCALL DELAY ;打开A /D转换电源后,延时1 ms即可LOOP:MOV ADC_ CONTR,#10001001B ;启动A/D转换NOP ;适当延时,确保设置有效NOPNOPNOPWAIT_AD:MOV A,ADC_CONTRJNB ACC.4, WAIT_AD ;判断A/D转换是否完成MOV ADC_ CONTR,#81H ;将ADC_FLAG清零MOV A, ADC_RES ;读取A/D转换结果POP 02RETENDC51语言参考程序如下:# include " STC15F2K60S2. h" //包含STC15F2K60S2单片机寄存器定义文件unsigned char data adc_data _at_ 0x30;//定义(保存A/D转换结果)绝对地址变量void main(void){unsigned long i;unsigned char status;P1ASF = 0x02 ; //设置Pl..1为模拟量输入功能ADC _CONTR= 0x81; // 打开A /D转换电源,设置输入通道for (i = 0;i <10000; i++ );while(l){ADC_CONTR=0x89;//启动A/D转换_NOP_();_NOP_();解:设置ADRJ=1,转换结束后,ADC_ RES的低2位为转换结果的最高2位,ADC_ RESL为转换结果的低8位。
汇编语言参考程序如下:$INCLUDE (STC152K60S2. INC)ADC_DA TAH EQU 31H ;定义A/D转换结果高2位存储变量ADC_DA TAL EQU 30H ;定义A/D转换结果低8位存储变量ORG 0000HLJMP MAINORG 002BHLJMP ADC_ISR ;ADC中断矢量入口ORG 0050HMAIN:MOV SP,#70H ;设置堆栈MOV P1ASF,#02H ;设置Pl.1为模拟量输入功能MOV ADC_CONTR,#81H ;打开A /D转换电源,设置输入通道MOV A,#20HLCALL DELAY ;开A/D转换电源后要加适当延时,1ms即可ORL CLK_DIV,#20H ;设置A/D转换结果存储格式(ADR为1)SETB EADC ;开放ADC中断SETB EA ;开放CPU总中断MOV R4,A ;取最外循环的循环次数DELAY_LOOP0:MOV R3,#200DELAY_LOOP1:MOV R2,#249DELAY_LOOP:DJNZ R2,DELAY_ LOOPDJNZ R3,DELAY_LOOP1DJNZ R4,DELAY_LOOP0POP 04 ;恢复现场POP 03POP 02RETENDC51语言参考程序如下:# include "STC152K60S2. h" //包含STC15F2K60S2单片机寄存器定义文件unsigned char data adc_datah _at_ 0x31;//定义(保存A/D转换结果)绝对地址变量unsigned char data adc_datal _at_ 0x30;//定义(保存A/D转换结果)绝对地址变量void main(void)P2 =~adc_datal;//转换结果低8位送P3口LED灯显示ADC_CONTR =0x89;//重新启动A D转换}。