外部ADC通道,我们现在用的是A0脚,也就是P00通道
把它设置成输出的一个模式。在程序中设置,代码如下:
#include
#define HAL_ADC_REF_125V 0x00
#define HAL_ADC_DEC064 0X00
#define HAL_ADC_CHN_VDD3 0x0f
unsigned char cmd;
unsigned int Read_Vddvalue(void)
{
unsigned int value;
unsigned char tmpADCCON3 = ADCCON3;
ADCIF=0;
ADCCON3=(HAL_ADC_REF_125V|HAL_ADC_DEC064|HAL_ADC_CHN_VDD3); //选择一个进程为125v的基准电压,设置抽取率,选择ADC的引脚
while(!ADCIF);
value=ADCL>>2;
value|=((unsigned int)ADCH)<<6;
ADCCON3=tmpADCCON3;
return (value);
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
cmd = U0DBUF;
}
void UartSendString(char *Data, int len)
{
unsigned int i;
for(i=0; i
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void InitUart(unsigned int baudrate)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //外设控制寄存器USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0xC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
switch(baudrate)
{
case 115200:
U0GCR = 11;
U0BAUD = 216; //波特率设为115200
break;
case 9600:
U0GCR = 8;
U0BAUD = 59; //波特率设为9600
break;
default:
U0GCR = 8;
U0BAUD = 59; //波特率设为9600
break;
}
UTX0IF = 0; //UART0 TX中断标志初始置位0
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断
}
/****************************************************************************
*程序入口函数
****************************************************************************/
void main(void)
{
unsigned int vddvalue;
unsigned char buf[5]="0.0V";
InitUart(115200);
while(1)
{
if(cmd=='A')
{
cmd = 0;
vddvalue=Read_Vddvalue();
vddvalue=(vddvalue*25)>>8;//(vddvalue*1.25/2^7)放大10倍(vddvalue*12.5/2^7)
//(vddvalue*25/2^8)->(vddvalue*25)>>8
vddvalue=vddvalue*3;//VDD/3作为一个ADC输入通道,因此对该通道的检测,得到VDD/3的值,那么VDD高行是这个值乘以3
buf[0]=vddvalue/10+'0';
buf[1]='.';
buf[2]=vddvalue%10+'0';
UartSendString(buf,strlen(buf));
}
}
}
寄存器图表:
运行结果,发送一个A产生一个数据
如果采用其他的通道,转换过后也是和这个一样的,这里寄存器有选择的地方,就是用正电压作为参考,使用内部的温度传感器来采,对应的地方把它旋转过来,最后可以传播或者获取这个相应的温度信息。
原文链接:http://www.maiziedu.com/wiki/bluetooth/vdd/