此项目是本人的毕业论文,包括了完整的论文一共40多页和开题报告,还有完整的程序带注释,还有proteus仿真,拿来就能使用。
设计通过控制变频器的输出频率从而自动调节水泵电机的转速,实现管网水压的闭环调节, 使供水系统自动恒压值稳于设定的压力值。用户可以自行设定水管中的水压,低功耗低噪音高性能高寿命的特点使得本设计在同类产品中脱颖而出。使用 Keil C 和 Proteus 等先进 EDA软件进行了高效率地设计实现和仿真验证。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/18N6e5KLYK8klRrXSxKy5uA?pwd=8888
部分代码展示
#include <reg52.h>
/*---------------宏定义-----------------*/
#define uint unsigned int
#define uchar unsigned char
#define PWM_CYC 50 //PWM周期
#define AUTO_SPEED 2000 //数字越大越慢
#define delay(x) {uint i,j;for(i = x;i>0;i--)for(j=50;j>0;j--);}
#define THC0 ((65536 - 10000)/256) //10ms定时器定时值
#define TLC0 ((65536 - 10000)%256)
/*--------------引脚定义-----------------*/
/* AD0809引脚 */
sbit OE = P3^7;
sbit EOC = P3^6;
sbit ST = P3^5;
sbit CLK = P3^4;
sbit ALE = P3^3;
#define ADCV P1
/* lcd016 引脚 */
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCDData P0
/* 按键 */
sbit BTN_UP = P2^3;
sbit BTN_DN = P2^4;
sbit BTN_AUTO = P2^5;
/* 电机PWM脚 */
sbit PWM = P2^7;
/* LED */
sbit LED = P2^6;
/*---------------全局变量----------------*/
const uchar display1[] = "set pressure ";
const uchar display2[] = "cur pressure ";
uchar water_vol=0; //水压
uchar set_vol = 150; //设置压力
uchar motor_speed = 6; //电机速度
uchar auto_flag = 0;
/*---------------全局函数----------------*/
void LCD_init(); //LCD初使化
void Display(uchar setv,uchar waterv); //显示程序
uchar Get_WaterV(void); //水压获取
void Moter_Drive(void); //电机驱动
void SetVol_UP(void); //设定压力加
void SetVol_DN(void); //设定压力减
void SetMotorSpeed(void); //电机速度设置
void Key_Scan(void); //按键扫描
void AutoSpeed(void); //自动模式
void SetVol_AUTO(void); //手动 自动 切换
/*---------------------------------
* 函数:SysTemInit 初使化
*----------------------------------*/
void SysTemInit(void)
{
TMOD = 0x02; //定时器0 采用16位定时器
TH0 = THC0; //设定定时值
TL0 = TLC0;
ET0 = 1; //定时器T0 溢出中断允许
TR0 = 1; //启动定时器0
EA = 1; //中断总开关开
LED = 0;
}
/*---------------------------------
* 函数:main 程序主入口
*----------------------------------*/
void main(void)
{
static char showcount=0;
PWM = 0;
SysTemInit();
LCD_init();
for(;;)
{
Moter_Drive(); //PWM驱动电机
if(auto_flag==0)water_vol = Get_WaterV(); //手动模式时获取水压
else AutoSpeed();
showcount++;
Key_Scan(); //扫描按键、
if(showcount == 100)
{
Display(set_vol,water_vol); //显示
SetMotorSpeed(); //调整速度
showcount = 0;
}
}
}
/*---------------------------------
* 函数:time0 10ms定时器0中断入口 用于ADC时钟
*----------------------------------*/
void time0() interrupt 1
{
CLK = ~CLK;
}
/*---------------------------------
* 函数:SetMotorSpeed 设置电机速度
*----------------------------------*/
void SetMotorSpeed(void)
{
if(water_vol > set_vol) //如果测到的水压大于设置压力
{
if(motor_speed > 4)motor_speed--; //控制占空比增大 电机减速
}
else if(water_vol < set_vol)
{
if(motor_speed < 40) motor_speed ++; //控制占空比减小 电机增速
}
}