单片机/MCUwilliam hill官网
直播中

尹岚

8年用户 19经验值
擅长:单片机
私信 关注
[问答]

求问,这个程序的算法是什么?是怎么处理电压的?我画的流程图是否正确?明天就要答辩了希望有懂的帮助一下

uchar ADC_Val;       
uchar Vout = 50;        //初始电压为5V,设定电压值的十倍(3.7~12V对应取值范围37~120
uint PWM_time = 0;       
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');
               
        }
}

  • 程序流程图.jpg
已退回20积分

更多回帖

发帖
×
20
完善资料,
赚取积分