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');
}
}
1