stc15单片机用自带的ad检测3.7v锂电池电压,问题是vcc是变动的,就是电池电量多少,vcc

stc15单片机用自带的ad检测3.7v锂电池电压,问题是vcc是变动的,就是电池电量多少,vcc,第1张

当然要增加基准电源,宴手顷无论测量什么都要有基准,对于用3.7v锂电池供电的单片机,当然不晌陆能用电池电压为基准,虽然该单片机AD基准电压不能单独设定,但AD模块有多个输入端子,可以在一个输入端接基准电压,如TL431或其它两端稳压源,在电源电压已知的情况下,测基准电压,得到一个数字量,将此值写入程序中或存入EEPROM中(批量生产,校正采用统一的电压,但基准源有离散性),以后每次测量前,测一下基准电压,获得另一个数字量,就可推算出电源电压

由于电池的电压不能突变,所以紧接着的其它测量(不只是求电源电压)就可以按已知的电源电压作为基准,也可以直接和稳压源的数字量对比得到真实值

如已知电源电压5V,测基准电压源获得数字量400(也可算出基准源的电压),若电源电压变动后测同一基准源得数字量500,则可知电源电压是4V,此时马上用AD的另一个端子测第三个输入电压得数字量得200,可推算此电压便是2V

因 所测实际电压=测得数字量/满量程数字量*电源电压

实测电压就是基准源是一定的,那么电源电压与所测数薯弊字量成反比关系

首先,AD软件自身所带的库,里面租脊的器件很少,里面没有你要的器件伍型握自然就找不到了。所以,经常有人提类似的问题“Altium里面的xxx器件腔庆在哪里”,一看就知道问这问题的90%以上的可能性是“学生”的身份,因为工作人群中基本上不使用AD自带的库,连最基础的电阻电容都是自己画的封装。

如下程序是在 STC 官方网站 提供的。应该很有用。

////

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译

//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"

#include "intrins.h"

#define FOSC18432000L

#define BAUD9600

typedef unsigned char BYTE

typedef unsigned int WORD

#define URMD0 //0:使用定时器2作为波特率发生器

//1:使用定山烂纯时器1的模式0(16位自动重载模式)作为波特率发生器

//2:使用定时器1的模式2(8位自动重载模式)作为历搭波特率发生器

sfr T2H = 0xd6 //定时器2高8位

sfr T2L = 0xd7 //定时器2低8位

sfr AUXR = 0x8e //辅助寄存器

sfr ADC_CONTR = 0xBC //ADC控制寄存器

sfr ADC_RES = 0xBD //ADC高8位结果

sfr ADC_LOW2= 0xBE //ADC低2位结果

sfr P1ASF = 0x9D //P1口第2功能控制寄存器

#define ADC_POWER 0x80//ADC电源控制位

#define ADC_FLAG0x10//ADC完成标志

#define ADC_START 0x08//ADC起始控制位

#define ADC_SPEEDLL 0x00//540个时钟

#define ADC_SPEEDL 0x20//逗咐360个时钟

#define ADC_SPEEDH 0x40//180个时钟

#define ADC_SPEEDHH 0x60//90个时钟

void InitUart()

void InitADC()

void SendData(BYTE dat)

BYTE GetADCResult(BYTE ch)

void Delay(WORD n)

void ShowResult(BYTE ch)

void main()

{

InitUart()//初始化串口

InitADC() //初始化ADC

while (1)

{

ShowResult(0) //显示通道0

ShowResult(1) //显示通道1

ShowResult(2) //显示通道2

ShowResult(3) //显示通道3

ShowResult(4) //显示通道4

ShowResult(5) //显示通道5

ShowResult(6) //显示通道6

ShowResult(7) //显示通道7

}

}

/*----------------------------

发送ADC结果到PC

----------------------------*/

void ShowResult(BYTE ch)

{

SendData(ch) //显示通道号

SendData(GetADCResult(ch))//显示ADC高8位结果

//SendData(ADC_LOW2) //显示低2位结果

}

/*----------------------------

读取ADC结果

----------------------------*/

BYTE GetADCResult(BYTE ch)

{

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START

_nop_() //等待4个NOP

_nop_()

_nop_()

_nop_()

while (!(ADC_CONTR &ADC_FLAG))//等待ADC转换完成

ADC_CONTR &= ~ADC_FLAG//Close ADC

return ADC_RES//返回ADC结果

}

/*----------------------------

初始化串口

----------------------------*/

void InitUart()

{

SCON = 0x5a //设置串口为8位可变波特率

#if URMD == 0

T2L = 0xd8//设置波特率重装值

T2H = 0xff//115200 bps(65536-18432000/4/115200)

AUXR = 0x14 //T2为1T模式, 并启动定时器2

AUXR |= 0x01 //选择定时器2为串口1的波特率发生器

#elif URMD == 1

AUXR = 0x40 //定时器1为1T模式

TMOD = 0x00 //定时器1为模式0(16位自动重载)

TL1 = 0xd8//设置波特率重装值

TH1 = 0xff//115200 bps(65536-18432000/4/115200)

TR1 = 1 //定时器1开始启动

#else

TMOD = 0x20 //设置定时器1为8位自动重装载模式

AUXR = 0x40 //定时器1为1T模式

TH1 = TL1 = 0xfb //115200 bps(256 - 18432000/32/115200)

TR1 = 1

#endif

}

/*----------------------------

初始化ADC

----------------------------*/

void InitADC()

{

P1ASF = 0xff //设置P1口为AD口

ADC_RES = 0 //清除结果寄存器

ADC_CONTR = ADC_POWER | ADC_SPEEDLL

Delay(2) //ADC上电并延时

}

/*----------------------------

发送串口数据

----------------------------*/

void SendData(BYTE dat)

{

while (!TI) //等待前一个数据发送完成

TI = 0//清除发送标志

SBUF = dat//发送当前数据

}

/*----------------------------

软件延时

----------------------------*/

void Delay(WORD n)

{

WORD x

while (n--)

{

x = 5000

while (x--)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12369678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存