uchar ADC_Val;
uchar Vout = 50; //初始电压为5V,设定电压值的十倍(3.7~12V对应取值范围37~120)
bit Time_Flag; //时间标志位
void main(void)
{
uchar i = 0; //输出电压与设定电压差值
LcdInit(); //LCD1602初始化
LcdWriteCom(0x80); //LCD1602第一行
Lcd_send_string("SET =");
LcdWriteCom(0xc0); //LCD1602第二行
Lcd_send_string("VOUT=");
Int_Configuration(); //中断初始化
while(1)
{
keyboard(); //按键扫描与处理
ISendByte(PCF8591,0x40); //选择ADC通道0
ADC_Val = IRcvByte(PCF8591) / 25.5 * 15; //ADC读数
if(Time_Flag == 1) //如果时间标志位=1,说明200ms定时到了
{
Time_Flag = 0;
if(ADC_Val < Vout) //如果输出电压小于设定电压
{
if(PWM_Time < 150)
{
i = Vout - ADC_Val;
if(i < 10)
{
PWM_Time++; PWM高电平计数值++,增加输出电压
}
else
{
PWM_Time = Vout; //快速减小输出电压
}
}
}
else if(ADC_Val > Vout) //如果输出电压小于设定电压
{
if(PWM_Time > 0)
{
i = ADC_Val - Vout;
if(i < 10)
{
PWM_Time--; //PWM高电平计数值--,减小输出电压
}
else
{
PWM_Time = Vout; //快速减小输出电压
}
}
}
}
LcdWriteCom(0x80 + 5); //LCD1602第一行
LcdWriteData('0' + Vout%1000/100); //设定电压值的十位
LcdWriteData('0' + Vout%100/10); » //设定电压值的个位
LcdWriteData('.');
LcdWriteData('0' + Vout%10); //设定电压值的小数点后一位
LcdWriteData('V');
LcdWriteCom(0xC0 + 5); //LCD1602第二行
LcdWriteData('0' + ADC_Val%1000/100); //实际电压值的十位
LcdWriteData('0' + ADC_Val%100/10); //实际电压值的个位
LcdWriteData('.');
LcdWriteData('0' + ADC_Val%10); //实际电压值的小数点后一位
LcdWriteData('V');
}
}