340 基于单片机控制的恒压供水系统(完善)【毕设课设】

设计通过控制变频器的输出频率从而自动调节水泵电机的转速,实现管网水压的闭环调节, 使供水系统自动恒压值稳于设定的压力值。用户可以自行设定水管中的水压,低功耗低噪音高性能高寿命的特点使得本设计在同类产品中脱颖而出。使用 Keil C 和 Proteus 等先进 EDA软件进行了高效率地设计实现和仿真验证。

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1fxrELBlJjEe3ku6ulY2BJw?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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值