STC单片机ADC转换
STC单片机内置ADC的使用方法
STC单片机内置ADC的使用方法STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。
这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。
ADC转换过程需要17个机器周期。
通过对相关功能寄存器的适当配置,就可以控制其工作。
下面就对相关功能寄存器进行介绍。
A/D转换寄存器总表:寄存器地址名称7 6 5 4 3 2 1 0 初始初P1_A DC_EN97H允许P1.x成为A/D口P17P16P15P14P13P12P11P10000000ADC _CON TRC5HA/D转换控制寄存器---ADC_FLAGADC_STARTCHS2CHS1CHS0xxx0000ADC _DATAC6HA/D转换结果寄存器--------0000000(1)P1_ADC_EN:特殊功能寄存器P1.x作为A/D转换输入通道来用允许特殊功能寄存器。
相应位为“1”时,对应的P1.x口作为A/D转换使用,内部上拉电阻自动断开。
(2)ADC_CONTR:特殊功能寄存器CHS2/CHS1/CHS0是模拟输入通道选择,CHS2/CHS1/CHS0的取值如下表所示:C HS2CHS1CHS0模拟输入通道选择0 0 0 选择P1.0为A/D输入0 0 1 选择P1.1为A/D输入0 1 0 选择P1.2为A/D输入0 1 1 选择P1.3为A/D输入1 0 0 选择P1.4为A/D输入1 0 1 选择P1.5为A/D输入1 1 0 选择P1.6为A/D输入1 1 1 选择P1.7为A/D输入ADC_START是模拟/数字转换(ADC)启动控制位,设置为1时,开始转换。
ADC_FLAG是模拟/数字转换结束标志位,当A/D转换完成后,ADC_FLAG=1。
(3)ADC_DATA:A/D转换结果特殊功能寄存器模拟/数字转换结果计算公式为结果=256×Vin/VccVin是模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
实验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 转换,若能将定时器/串行口/中断系统关闭更好。
第13章 STC单片机ADC原理及实现(3)
直流电压测量和串口显示
--具体实现过程
tmp=(ADC_RES*4+ADC_RESL); //得到ADC转换的数字量
voltage=(tmp*5.0)/1024;
//计算得到对应的浮点模拟电压值
sprintf(tstr,“%1.4f”,voltage); //将浮点数转换成对应的字符
if(voltage!=old_voltage)
}
//重新启动ADC转换
ADC_CONTR=ADC_POWER |ADC_SPEEDLL | ADC_START | ch;
}
直流电压测量和串口显示
--具体实现过程
void main()
//主程序
{
unsigned int i;
SCON=0x5A;
//串口1为8位可变波特率模式
T2L=65536-OSC/4/BAUD;
//定义无符号整型变量tmp
float old_voltage=0;
//定义浮点变量old_voltage
直流电压测量和串口显示
--具体实现过程
void SendData(unsigned char dat) {
while(!TI); TI=0; SBUF=dat; }
//定义函数SendData
直流电压的测量和串口显示
--直流分压电路原理
直流电压的测量和串口显示
--直流分压电路原理
在该结构中,存在SW1~SW16个按键,当:
按下按键SW16时,将VCC的电压送到单片机P1.4引脚上 按下按键SW15时,将VCC电压的15/16送到单片机P1.4引脚上 按下按键SW14时,将VCC电压的14/16送到单片机P1.4引脚上 按下按键SW13时,将VCC电压的13/16送到单片机P1.4引脚上 按下按键SW12时,将VCC电压的12/16送到单片机P1.4引脚上 按下按键SW11时,将VCC电压的11/16送到单片机P1.4引脚上 按下按键SW10时,将VCC电压的10/16送到单片机P1.4引脚上
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模块的寄存器来获取采样值,然后根据需要进行相应的处理,例如计算电压值、控制外设等。
STC12C5A60S2中的AD转换
STC12C5A60S2中的AD转换逐次逼近原理AD 里面包含da,当输入电压Vin时,da的最高位是1,即为0.5Vref与输入信号比较,如果输入大于0.5Vref则比较器输出为1,同时da的最高位为1,反之DA最高位则为0,通过8次比较后得到8个01数据即完成ad转换。
现在说下程序中用到stc12单片机两个寄存器ADC_CONTR;主要用来配置ad启动的工作模式;还有个result的寄存器程序中的注意点:配置完ADC_CONTR后要延时4个时钟周期先把程序附上#include "stc12.h"#include "intrins.h"#include "ad.h"uint ad;#define ADC_POWER 0X80 //ADC最高位给adc部分供电,类似于片选#define ADC_START 0X08 //模数转换启动控制位#define ADC_FLAG 0x10 //ad转换需要时间,这个是转换完成标志位#define ADC_SPEEDLL 0X00 //540 clock#define ADC_SPEEDL 0X20 //360 clock#define ADC_SPEEDH 0X40 //180 clock#define ADC_SPEEDHH 0X60 //90 clockuchar ADCresult(uchar aa) //这里的参数是哪个口来ad转换{P1ASF=0X01; //这里的选择和用哪一个P1口作为ad采样ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|aa;//ADC_CONTR=0X88|aa;_nop_();_nop_();_nop_();_nop_();//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器while (!(ADC_CONTR & ADC_FLAG)); //等待ADC_CONTR,这里的ADC_FLAG相当于一个常数,不是寄存器里面的某个位//while(!ADC_FLAG);//ADC_FLAG=0;ADC_CONTR &= ~ADC_FLAG; //Close ADC 将标志位清零等待下次硬件置1ad=(ADC_RES<<2)+ADC_RESL; //打开10位AD采集功能如果用8位AD 屏掉这句把下一句改为Vo=(float)(ADC_RESL)*500/256; 即可//ADC_RES结果寄存器的高2位;ADC_RES结果寄存器的低8位ad=(float)(ad)*5*100/1024; //Return ADCresult(为显示整数,这里将电压值扩大了十倍)//10位AD采集即2的10次方满值为1024 这里用1024表示5伏的电压//那么用采集到的数量值除以1024 在乘以5 得到的值就是采集的电压数值//这里又*100 是为了扩大100倍显示小数位//ADC_RES*(5/256)为采集的电压值然后扩大10倍便于计算return ad;}这里只是个ad.c源文件,这里有几个问题想说一下1.怎么知道是10位还是8位的ad结果;你可以在ADCresult(uchar aa)最前面加一条AUXR1&=0x04;什么意思呢,转换结果的低2位放在ADC_RES,高8位ADC_RESL 中2为什么不用//while(!ADC_FLAG);//ADC_FLAG=0;这两条因为ADC_FLAG相当于常量前面用宏定义而头文件里只有ADC_CONTR的地址映射;但是如果在头文件中用sbit ADC_FLAG=ADC_CONTR^4会出现错误,具体原因还不清楚先说到这吧。
STC单片机AD转换结果
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
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。
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转换非常方便,只需要简单的几行代码就可以完成。
STC单片机的特殊功能
STC单片机的特殊功能
1.引脚配置和功能扩展:
STC单片机具有大量的引脚,并且可以通过软件对不同引脚进行功能
配置,以满足不同应用的需求。
例如,可以将一些引脚配置为输入或输出,也可以将其配置为模拟输入或输出。
此外,还可以通过外部扩展芯片实现
额外的引脚功能扩展。
2.定时器和计数器功能:
3.串口通信功能:
4.A/D和D/A转换功能:
5.中断和优先级功能:
6.快速IO口和双端口RAM功能:
7.PWM输出功能:
8.电源管理功能:
总之,STC单片机具有丰富的特殊功能,可以满足各种应用的需求。
无论是控制、通信、数据处理还是电源管理等功能,STC单片机都可以提
供可靠的支持,并且具有较高的性能和灵活性。
STC15的ADC转换
STC15的ADC转换和ADC转换有关的寄存器一、P1ASF //设置P1口做普通IO口还是ADC输入口,0--普通IO口,1--ADC入口二、P1M0P1M1、这两个寄存器的相同位状态决定P1口的输入状态,00 01 10 11,期中11为ADC转换常采用的状态三、ADC_CONTR不能位寻址,最好赋值 D7是开关ADC电源开关,0关,1开;D6D5为转换速度,00最慢,11最快,D4转换标志位,当转换完成后自动为1,未完成就为0,D3为转换开始位,1开始,0等待,D2D1D0为输入选择,由于是8路可转换,选择那一路有着三位确定。
000---111分别P10---P17。
四、CLK_DIV,这个寄存器主要是分频用,但是它的D5位用来设置转换结果的存储方式,0时CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位,1时转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;#include"stc15.h"#include"intrins.h"#define uchar unsigned char#define uint unsigned intuint ADC_DATA;void delay(uchar ms){uchar i;while(ms--)for(i=0;i<120;i++);}void ADC_init(void){P1=0xff;P1ASF=0x08; //P1ASF的哪一位为1,对于的P1脚位ADC输入模式,为0是普通IO模式CLK_DIV | = 0x20; //CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位;//CLK_DIV的D5位为1,转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;ADC_CONTR |=0x80; //开AD转换电源 1000 0000delay(80);P1M0=0x04; //0000 0100P1M1=0x04; //0000 0100 //设置P1.3为AD转换输入模式}uint ADC(){unsigned char DATA_H,DATA_L;ADC_DATA =0; //清除转换结果ADC_CONTR =0xE0; //保持电源开,设置转换速度 1110 0000_nop_();_nop_();_nop_();_nop_();ADC_CONTR =0xE3; /保持电源开,保持转换速度,并选择P1.3输入1110 0011 delay(10);ADC_CONTR =0xEB; // 开转换开关,开始转换 1110 1011 while(ADC_CONTR & 0x10==0);//查询转换是否结束,结束后读取结果ADC_CONTR &=0xE7;/清除转换结果标志位,关闭转换DATA_H=ADC_RES;DATA_L=ADC_RESL;ADC_DATA=DATA_H;ADC_DATA=ADC_DATA<<2;ADC_DATA |=ADC_RESL;ADC_CONTR=0x00;return(ADC_DATA); //返回转化结果}void main(void){ADC_init();while(1){ADC();}}。
stc adc 参考电压电路
STC ADC 参考电压电路随着科技的不断发展,模拟数字转换器(ADC)在各种应用中扮演着越来越重要的角色。
在ADC的设计中,参考电压电路是至关重要的一部分。
STC(单片机)内置的ADC是一种广泛应用的ADC,其参考电压电路设计是需要仔细考虑的。
本文将介绍STC ADC参考电压电路的设计原理和方法。
1. 参考电压电路的作用在ADC中,参考电压电路的作用是提供一个稳定、精确的参考电压,用于对模拟信号进行采样和转换。
参考电压电路的质量将直接影响ADC的性能和精度。
设计一个稳定而精确的参考电压电路至关重要。
2. STC ADC参考电压电路的原理STC单片机内置的ADC采用基于电压比较器的SAR(逐次逼近寻址)转换方式。
在该转换方式中,参考电压将直接影响ADC的分辨率和精度。
STC ADC参考电压电路的设计需要考虑多个因素,包括参考电压的稳定性、温度漂移、噪声水平等。
3. STC ADC参考电压电路的设计要点(1)参考电压源的选择。
在STC ADC的设计中,参考电压源的选择至关重要。
常见的参考电压源包括外部参考电压源和内部参考电压源。
对于外部参考电压源,需要考虑其稳定性、温度系数和噪声水平。
对于内部参考电压源,需要了解其输出电压和电压漂移特性,以便进行合理的校准和补偿。
(2)参考电压稳定性的提高。
为了提高STC ADC的性能,参考电压电路需要具备较高的稳定性。
通过采用稳压器、滤波器等措施,可以有效降低参考电压的波动和噪声水平。
合理的PCB布局和良好的接地设计也能提高参考电压电路的稳定性。
(3)温度漂移的补偿。
温度对参考电压的影响是不可忽视的。
为了补偿温度漂移带来的误差,可以采用温度传感器和温度补偿电路来实现对参考电压的动态调整。
这样可以有效减小温度变化对ADC性能的影响。
(4)噪声的抑制。
噪声会降低ADC的信噪比和精度。
为了抑制参考电压电路中的噪声,可以采用滤波器、隔离器等方法来减小噪声的影响。
合理的供电和接地设计也能有效降低噪声水平。
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--);}}。
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格式的文章,使用标题副标题的形式进行组织。
最新STC12C5A60S2单片机的10位AD转换程序
STC12C5A60S2单片机的10位AD转换程序#include"stc12c5a.h" //头文件在STC公司主页上下载#include"stdio.h" //输入输出函数#include"intrins.h"//------------------------------------------------------------------------------void AD_init(); //初始化ADvoid serial_init();void delay(unsigned int a);float AD_work(unsigned char channel);unsigned int AD_get(unsigned char channel);//------------------------------------------------------------------------------void main() //主程序{AD_init(); //A/D转换初始化serial_init(); //串口初始化while(1){unsigned char i;for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值{TI=1; //使用printf函数前须先将发送标志位TI置1printf("The P1.%bd voltage is %f\n",i,AD_work(i));TI=0;delay(1000); //延时约1s}}}//------------------------------------------------------------------------------unsigned int AD_get(unsigned char channel){ADC_CONTR=0x88|channel; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0_nop_(); _nop_(); _nop_(); _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器while(!(ADC_CONTR&0x10)); //等待转换完成ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)}//------------------------------------------------------------------------------float AD_work(unsigned char channel){float AD_val; //定义处理后的数值AD_val为浮点数unsigned char i;for(i=0;i<100;i++)AD_val+=AD_get(channel); //转换100次求平均值(提高精度)AD_val/=100;AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;}//------------------------------------------------------------------------------void delay(unsigned int a) //延时约1ms{unsigned int i;while (--a!=0)for(i=600;i>0;i--); //1T单片机i=600,若是12T单片机i=125}//------------------------------------------------------------------------------void serial_init(){TMOD=0x20;TH1=0xfd;TL1=0xfd; //设置9600波特率SCON=0x50; //串口方式1,允许接收TR1=1;}//------------------------------------------------------------------------------void AD_init(){P1ASF=0xff; //P1口全部作为模拟功能AD使用ADC_RES=0; //清零转换结果寄存器高8位ADC_RESL=0; //清零转换结果寄存器低2位ADC_CONTR=0x80;//开启AD电源delay(2); //等待1ms,让AD电源稳定}/* 酱炒牛柳条:Sautéed Beef Filet in XO Sauce阿香婆石头烤肉:Beef BBQ with Spicy Sauce八宝菠菜:Spinach with Eight Delicacies白菜豆腐焖酥肉:Braised Pork Cubes with Tofu and Chinese Cabbage白菜心拌蜇头:Marinated Jellyfish and Chinese Cabbage in Vinaigrette白灵菇扣鸭掌:Mushrooms with Duck Feet白灵菇牛柳:Stir-Fried Beef Filet with Mushrooms白切鸡:Boiled Chicken with Sauce白灼肥牛:Scalded Beef百叶结烧肉:Stewed Pork Cubes and Tofu Skin in Brown Sauce 板栗红烧肉:Braised Pork with Chestnuts拌八爪鱼:Spicy Cuttlefish拌豆腐丝:Shredded Tofu with Sauce拌海螺:Whelks and Cucumber拌苦菜:Mixed Bitter Vegetables拌茄泥:Mashed Eggplant with Garlic拌双耳:Tossed Black and White Fungus拌爽口海苔:Sea Moss with Sauce拌香椿苗:Chinese Toon with Sauce包子:Baozi鲍鱼红烧肉:Braised Pork with Abalone鲍汁扣东坡肉:Braised Dongpo Pork with Abalone Sauce。
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外部电压指的是STC单片机中的模数转换器(ADC)所
能接受的外部电压范围。
STC单片机通常会有多个模拟输入引脚,
这些引脚可以连接外部电压源,并通过ADC转换成数字信号进行处理。
STC单片机的ADC通常能够接受的外部电压范围取决于具体型
号和系列。
一般来说,STC单片机的ADC外部电压范围是0V至Vref,其中Vref是参考电压。
在STC单片机中,Vref可以是内部参考电
压或外部参考电压,因此在使用ADC时需要注意参考电压的设置。
对于不同的应用场景,STC单片机的ADC外部电压范围可能会
有所不同。
一些型号的STC单片机可能支持负电压输入,而另一些
可能仅支持正电压输入。
因此,在使用STC单片机的ADC时,需要
查阅具体型号的数据手册,以确定其支持的外部电压范围。
另外,在连接外部电压源到STC单片机的ADC引脚时,还需要
考虑输入阻抗、采样率、信噪比等因素,以确保获取到准确的模拟
输入信号并进行有效的转换。
总之,STC单片机的ADC外部电压范围是一个重要的参数,需要根据具体型号和应用需求来确定,并在设计和应用过程中进行合理的考虑和配置。