请教15W404AS P1.7读外部电压,移植到15W408AS读不准
本帖最后由 ZRH 于 2024-5-13 16:32 编辑WORD code Vbg_ROM _at_ 0x0ff7;
//WORD idata Vbg_RAM_at_0xef;
#define ADC_POWER 0x80;
#define ADC_FLAG 0x10;
#define ADC_START 0x08;
#define ADC_SPEEDLL 0x00;
#define ADC_SPEEDL 0x20;
#define ADC_SPEEDH 0x40;
#define ADC_SPEEDHH 0x60;
uInt8 tim_t;
/*内部BandGap 参考电压约为1.25V*/
void ADC_Vx(){
uInt16 ADCbg;
uInt16 ADCx;
uInt16 Vx;
uInt8 tmp_ADC;
ADCbg=0;
ADCx=0;
/*t通过ADC的第0通道测试外部输入电压的ADC测量值*/
ADC_RES=0;//清除结果寄存器
P1ASF=0x00; /*不设P1ASF,从的第9通道读取内部Bandgap电压的ADC测量值*/
ADC_CONTR=0x80; // ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay1ms(); //ADC上电后延时
ADC_CONTR=0x88;//ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;
;//_NOP_();//等待4个NOP
;//_NOP_();
;//_NOP_();
;//_NOP_();
while(!(ADC_CONTR & 0x10));//while(~(ADC_CONTR&ADC_FLAG)){;}//等待ADCZ转换完成
ADC_CONTR&=~ADC_FLAG; //清除ADC标志
ADCbg=ADC_RES;//ADCx=ADC_RES;
//ADCbg = (((uInt16)ADC_RES << 2)|((uInt16)ADC_RESL&3)); //ADCbg=ADC_RES;
/*t通过ADC的第0通道测试外部输入电压的ADC测量值*/
ADC_RES=0;//清除结果寄存器
P1ASF=0x80; /*设P1ASF,从的第7通道读取外部输入电压的ADC测量值*/
ADC_CONTR=0x87;
//Delay1ms(); //ADC上电后延时
ADC_CONTR=0x8f;// ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;
;//_NOP_();//等待4个NOP
;//_NOP_();
;//_NOP_();
;//_NOP_();
while(!(ADC_CONTR & 0x10));// while(~(ADC_CONTR & ADC_FLAG));//等待ADCZ转换完成
ADC_CONTR&=~ADC_FLAG; //清除ADC标志
ADCx=ADC_RES;//ADCx= (((uInt16)ADC_RES << 2)|((uInt16)ADC_RESL&3));//ADCx=ADC_RES;
/*t通过公式计算外部输入的实际电压值*/
//Vx=Vbg_RAM*ADCx/ADCbg; // 使用RAM中的Bandgap的电压参数进行计算
// Vx=Vbg_ROM*ADCx/ADCbg; // 使用ROM中的Bandgap的电压参数进行计算
tmp_ADC=Vbg_ROM/ADCbg;
Vx=tmp_ADC*ADCx;
/*处理计算结果
*/
/*-5°~+17°附常温增益值 */
if((Vx>450)&&(Vx<670)){
da_c1=0;
da_c2=1;
}
/*低于-10°附低温增益值 */
if((Vx<400)&&(Vx>100)){
da_c1=1;
da_c2=1;
}
/*高于22°附高温增益值 */
if(Vx>720){
da_c1=0;
da_c2=0;
}
}
本帖最后由 ZRH 于 2024-5-13 16:33 编辑
1 本帖最后由 STCAI-32位8051 于 2024-5-13 16:51 编辑
可以先用范例程序测试;另外STC15W404AS核STC15W408AS 存储地址是不同的,需要注意
谢谢,地址改了,解决了 ZRH 发表于 2024-5-13 17:20
谢谢,地址改了,解决了
{:handshake:}{:handshake:}
页:
[1]