|
中颖单片机SHF79F1618,使用内部AD测量12V电压,请大神们看看,程序有什么问题,谢谢。
#include <sh79f1618.h>
#include <intrins.h>
#include <stdio.h>
#include "BINARY.H"
#define VCC 5 //单片机供电电压
unsigned int ADvalue;//存放A/D转换返回的结果
float Vin; //存放计算出来的外部输入电压
unsigned int AD_Dat=0; //10位A/D转换值
unsigned char Tmp=0; //临时变量用于将A/D转换出来的2个字节合成1个字节
void init_mcu (void)
{
CLKCON=0x0c; //内部RC12M
P1CR=B1111_1111; // 端口输入/输出控制寄存器 0:输入模式 1:输出模式
P1PCR=B0000_0000 ; // 输入端口内部上拉电阻控制 0:内部上拉电阻关闭 1:内部上拉电阻开启
P1=B0000_0000 ;
}
void delay_ms()
{
unsigned int i,j;
for(i=0;i<400;i++)
for(j=0;j<450;j++);
}
void init_adc()
{
unsigned int i; //用于软件延时程序
for(i=0;i<10000;i++);//适当延时等待A/D转换供电稳定
ADT=B1000_0000; //1.选择tAD=12*tSYS=1us@12MHz 2.选择采样时间为2*tAD
ADCON=B0000_1110; //1.选择VDD作为内部参考电压 2.选择模拟输入通道AN7(12v)
ADCH = B1000_0000; //设置P3.7为ADC口
IEN0 |= 0xC0; //开总中断,开ADC中断
ADCON |= 0x80; // 打开ADC模块
ADCON |= 0x01; // 启动AD转换
}
unsigned long AD_VALUE(void)
{
unsigned char data Temp; //判断转换完成
while(1)
{
Temp=ADCON&0x40;
if(Temp==0x40) break;
delay_ms();
}
AD_Dat=ADDH; //默认高字节高8位
AD_Dat<<=2; //左移2位给低位
Tmp=ADDL; //默认低字节低2位
Tmp&=0x03; //屏蔽无关位
AD_Dat|=Tmp; //高、低字节拼接成一个10位数
ADvalue=AD_Dat;
ADCON &= B1011_1111; //ADC转换完成中断,清ADCIF
return ADvalue;
}
void main()
{
init_mcu();
init_adc();
while(1)
{
ADvalue=AD_VALUE();
Vin=VCC*ADvalue/1024;
if((Vin>2.6)&&(Vin<3.2)) //外部分压电路,到达端口约为2.9V(外部12V电压)
{
P1_0=1;//串接LED显示
}
}
} |
|