萌芽MENGYA
发表于 2024-9-6 09:59:09
神农鼎 发表于 2023-8-13 14:34
内部参考信号源电压为BGV,从CHIP中读取,或STC-ISP烧录时指定将重要参数烧录入程序Flash
+
{:victory:}
tzz1983
发表于 2024-10-10 16:02:31
您好,请教一个问题,Ai8051U, ADC_DMA
本以为配合DMA_ADC_ITV启动无限循环模式DMA, 是完美的模式,
万万没想到啊,DMA写入地址也无限累加,那不是把RAM给写爆了?
循环模式为何不重置 DMA_ADC_RXA ?
我的想法是如果不能自动重置DMA_ADC_RXA,那么无限循环没法用!
hande5
发表于 2024-11-14 14:18:48
学习了
耀子
发表于 2024-11-17 08:16:53
学习了
522810886
发表于 2024-12-20 08:05:15
{:baoquan:}
小涵子爸爸
发表于 2025-3-15 08:43:20
用来反推锂电池电压,挺方便的
xxkj2010
发表于 2025-4-7 13:47:27
我读出来的怎么是00 00,芯片用STC8H8K64U-SOP16,究竟是哪里错了
//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536-(FOSC / 115200+2) / 4)
//加2操作是为了让Keil编译器
//自动实现四舍五入运算
int *BGV; //内部参考信号源值存放在idata中
//idata的EFH地址存放高字节
//idata的F0H地址存放低字节
//电压单位为毫伏(mV)
bit busy;
void UartIsr() interrupt 4
{
if(TI)
{
TI = 0;
busy = 0;
}
if(RI)
{
RI = 0;
}
}
void UartInit()
{
SCON= 0x50;
TMOD= 0x00;
TL1= BRT;
TH1= BRT >> 8;
TR1= 1;
AUXR= 0x40;
busy= 0;
}
void UartSend(char dat)
{
while(busy);
busy= 1;
SBUF= dat;
}
void ADCInit()
{
ADCTIM= 0x3f; //设置ADC内部时序
ADCCFG= 0x2f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR= 0x8f; //使能ADC模块,并选择第15通道
}
int ADCRead()
{
int res;
ADC_CONTR|= 0x40; //启动AD转换
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR&= ~0x20; //清完成标志
res= (ADC_RES << 8) | ADC_RESL; //读取ADC结果
return res;
}
void Delay2000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 113;
j = 53;
k = 228;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int res;
int vcc;
int i;
P_SW2|= 0x80; //使能访问XFR
P0M0= 0x00;
P0M1= 0x00;
P1M0= 0x00;
P1M1= 0x00;
P2M0= 0x00;
P2M1= 0x00;
P3M0= 0x00;
P3M1= 0x00;
P4M0= 0x00;
P4M1= 0x00;
P5M0= 0x00;
P5M1= 0x00;
BGV= (int idata *)0xef;
ADCInit(); //ADC初始化
UartInit(); //串口初始化
ES= 1;
EA= 1;
// ADCRead();
// ADCRead(); //前两个数据建议丢弃
while(1)
{
res= 0;
for(i=0; i<8; i++)
{
res += ADCRead(); //读取8次数据
}
res>>= 3; //取平均值
vcc= (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压
// vcc= (int)(1024L * *BGV / res); //(10位ADC算法)计算VREF管脚电压,即电池电压
//注意,此电压的单位为毫伏(mV)
UartSend(vcc>> 8); //输出电压值到串口
UartSend(vcc);
Delay2000ms();
}
}