- 打卡等级:初来乍到
- 打卡总天数:9
- 最近打卡:2025-07-29 19:51:44
已绑定手机
注册会员
- 积分
- 87
|
芯片AI8H1K08通过内部1.19V测量芯片电池电压正确,
但是测量P32引脚ADC10电压一直不正常,
数据通过串口1发送进行查看
P32电路:
串口收到的数据:[19:13:53.234]接收←04 A1 10 92 FF E1
其中: 04 A1 转换后是内部电压1185 --1.185V
10 92 转换后芯片电池电压4242 --4.21V 万用表实际测量电压为4.21V 精度感觉非常高
FF E1 转换后P32电压65505 明显不对,不知道哪里有问题,请高手指点,谢谢
改了ADC很多次,得到的P32电压还是不正确
以下是完整程序:
/*
2025-07-13: 1.获取内部1.19电压OK
2.通过1.19计算芯片供电VVC功能OK
*/
#include<AI8H.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
int *BGV;
int VCC,res;
int VDD;
int P32_V;
int adcValue=0;
int P32ADC=0;
int res_ADC10=0,Volate_ADC10=0;
bit B_TX_Busy = 0; //发送忙标志
static char time_cous=0;
bit Time_flag=0;
bit Send_flag=0;
sbit led1=P3^6;
sbit led2=P3^5;
//*********************************************
void Delay10ms(void) //@24.000MHz
{
unsigned char data i, j, k;
i = 2;
j = 56;
k = 172;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//*********************************************
void Delay1ms(void) //@24.000MHz
{
unsigned char data i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
//*********************************************
void port_init()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x0E;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
}
//*********************************************
void Timer0_Init(void) //10毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xE0; //设置定时初始值
TH0 = 0xB1; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
//*********************************************
void Uart1_Init(void) //9600bps@24.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
ES = 1; //使能串口1中断
}
//*********************************************
void Uart1SendData(uchar ch)
{
while(B_TX_Busy); //不忙后发送数据
SBUF = ch; //写数据到UART数据寄存器
B_TX_Busy = 1;
}
//*********************************************
void Uart1_Isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
B_TX_Busy = 0;
}
if (RI) //检测串口1接收中断
{
RI = 0; //清除串口1接收中断请求位
}
}
//*********************************************
void Timer0_Isr(void) interrupt 1
{//10ms
time_cous++;
if(time_cous>99)//100*10=1000ms=1s
{
time_cous=0;
Time_flag=!Time_flag;
Send_flag=1;
led2=!led2;
}
}
//*********************************************
void adc_int()// 初始化ADC
{
P1M0 = 0x0E; //设置P1.0为ADC口
P1M1 = 0x01;
//设置P3.2为ADC输入 (ADC10通道)
P3M1 |= (1 << 2); //设为高阻输入(模拟输入)
P3M0 &= ~(1 << 2);
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG=0x2f;
// ADC_CONTR = 0x80; //使能ADC模块
ADC_CONTR=0x8f; //使能ADC模块
Delay1ms(); //@24.000MHz
}
//*********************************************
int ADCRead()
{
int resX;
ADC_CONTR|=0x40; //启动转换
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&0x20)); //查询ADC完成标志
ADC_CONTR&=~0x20; //清完成标志
resX=(ADC_RES<<8)|ADC_RESL;
return resX;
}
int ADCReadP32()
{
int resY;
ADC_CONTR|=0x4A; //启动转换
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&0x20)); //查询ADC完成标志
ADC_CONTR&=~0x20; //清完成标志
resY=(ADC_RES<<8)|ADC_RESL;
return resY;
}
//*********************************************
void Read_VCC() //读取芯片供电VCC
{
char i=0;
res=0;
for(i=0;i<8;i++)
{
res+=ADCRead();
}
res>>=3; //8次
VCC=(int)(1024L* *BGV/res); //获取电池电压--测量是4.24,万用表测量是4.21 OK
P32ADC=ADCReadP32(); //读取P32ADC10通道 --有问题
Volate_ADC10=(P32ADC * VCC) / 1023.0f; //读取P32ADC10通道 --有问题
}
//*********************************************
void main()
{
Delay10ms();
port_init();
Timer0_Init(); //10毫秒@24.000MHz
Uart1_Init(); //9600bps@24.000MHz
EA=1;
adc_int(); // 初始化ADC
BGV=(int idata*)0xef; //读取内部1.19V电压
ADCRead(); //前两次丢弃
ADCRead(); //前两次丢弃
while(1)
{
if(Send_flag==1)
{
Send_flag=0;
led1=!led1;
Uart1SendData(*BGV >> 8); //串口1发送内部1.19V参考信号源的高字节 ok
Uart1SendData(*BGV); //串口1发送内部1.19V参考信号源的低字节 ok
Read_VCC(); //读取芯片供电VCC
Uart1SendData(VCC >> 8); //串口1发送芯片供电VCC的高字节 ok
Uart1SendData(VCC); //串口1发送芯片供电VCC的低字节 ok
Uart1SendData(Volate_ADC10 >> 8); //串口1发送P32数据不正确
Uart1SendData(Volate_ADC10); //串口1发送P32数据不正确
}
}
}
|
|