|
给51黑电子论坛的朋友们奉献一个51单片机做的pid电压控制的仿真,上面是仿真图。
源程序:
- #include<reg52.h>
- #include "ADC.h"
- #include "LCD1602.h"
- #include "PID.h"
- uchar str[]="Set the voltage!";
-
- float INPUT=2.5;
- float out;
- uchar DA,AD;//AD,DA为0-255
- void key_process()
- {
- uchar key;
- if(P3==0xff)
- {
- delay(100);
-
- key=P3;
- switch (key)
- {
- case 0xFE: INPUT=INPUT+1; break;
- case 0xFD: INPUT=INPUT-1; break;
- case 0xFB: INPUT=INPUT+0.1; break;
- case 0xF7: INPUT=INPUT-0.1; break;
- case 0xEF: INPUT=INPUT+0.01; break;
- case 0xDF: INPUT=INPUT-0.01; break;
- default: break;
- }
- if(INPUT>5.0)
- {
- INPUT=5.0;
- }
- else if(INPUT<0.0)
- {
- INPUT=0.0;
- }
- }
- }
- void LCD_voltage()
- {
- uint voltage;
- uchar i;
- uchar tab[5];
- voltage=(uint)(INPUT*100);
- tab[0]=voltage/100+'0';
- tab[1]='.';
- tab[2]=voltage%100/10+'0';
- tab[3]=voltage%10+'0';
- tab[4]='V';
- write_com(0xc0);
- for(i=0;i<5;i++)
- {
- write_data(tab[i]);
- }
- }
- void main()
- {
- uchar i;
- pid_init();
- LCD_init();
- write_com(0x80);
- for(i=0;i<16;i++)
- write_data(str[i]);
- while(1)
- {
- key_process();
- LCD_voltage();
- out=pid_process();//读取PID运算结果
- DA=(uchar)(out*255/5);//转换成DA数据
- P0=DA; //转换成对应的电压值
- AD=ADC0832(0); //AD采集DA所输出的电压值
- y_cur=(float)AD*5/255;//反馈给PID
- }
- }
复制代码
|
|