1.设计任务
利用AT89C52单片机为核心控制元件,设计一个单片机水位控制系统,设计的系统实用性强、操作简单,实现了智能化、数字化。
(1)利用单片机及蜂鸣器、抽水电机、水位传感器等器件设计;
(2)将探测到的水位变化信号转换为电压信号,经调理电路整形处理为TTL电平送入单片机;
(3)单片机对送入的信号进行数据处理,在LCD上进行水位显示,超出水位警戒线时发出报警提示;
(4)当液位到达设定的最高值时,自动停止水泵,当液位到达设定的最低值时,自动打开水泵,水位到达设定的最高值时,水泵停止工作;
(5)通过不同颜色的灯光进行水位预警;
(6)当液位到达最低警戒线时,通过声光报警。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优劣,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
2.3软件设计
根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求加以注释。
2.4 软硬件系统仿真
将编译后的程序软件加载到Proteus软件仿真的单片机ROM中,运行系统,实现软件程序对单片机系统的硬件电路的控制,并调试仿真结果,直至与设计任务相符。
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define u8 unsigned char
#define u16 unsigned int
sbit speak=P2^0; // 蜂鸣器
sbit led3=P2^7; //3/4水位指示灯
sbit led2=P2^4; //1/2水位指示灯
sbit led1=P2^1; //1/4水位指示灯
sbit SW041=P1^0; //1/4水位
sbit SW021=P1^1; //1/2水位
sbit SW043=P1^2; //3/4水位
sbit SW01=P1^3; //满水位
void delay_ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***按键检测相关函数****/
//按键
sbit Key1=P1^4; //设置键
sbit Key2=P1^5; //加按键
#define KEY_SET 1 //设置
#define KEY_ADD 2 //加
u8 Key_Scan()
{
static u8 key_up=1;//按键按松开标志
if(key_up&&(Key1==0||Key2==0))
{
delay_ms(10);//去抖动
key_up=0;
if(Key1==0) return 1;
else if(Key2==0)return 2;
}
else if(Key1==1&&Key2==1)
key_up=1;
return 0;// 无按键按下
}
uchar Mode=0;
/**LCD1602相关函数**/
sbit LCDRS = P2^5;
sbit LCDEN = P2^6;
//LCD延时
void LCDdelay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
LCDRS=0;
P0=com;
// DAT=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//写数据
void write_data(uchar date)
{
LCDRS=1;
P0=date;
// DAT=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
/*选择写入位置*/
void SelectPosition(unsigned char x,unsigned char y)
{
if (x == 0)
{
write_com(0x80 + y); //第一行
}
else
{
write_com(0xC0 + y); //第二行
}
}
/*写入字符串函数*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
SelectPosition(x,y) ;
while (*s)
{
write_data( *s);
s ++;
}
}
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{
SelectPosition(x,y) ;
if(l>=5)
write_data(0x30+s/10000%10); //万位
if(l>=4)
write_data(0x30+s/1000%10); //千位
if(l>=3)
write_data(0x30+s/100%10); //百位
if(l>=2)
write_data(0x30+s/10%10); //十位
if(l>=1)
write_data(0x30+s%10); //个位
}
//1602初始化
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
}
/**********主函数******************/
void main()
Init1602(); //调用初始化
LCD_Write_String(0,0," Shuiwei Kz "); //开机界面
LCD_Write_String(1,0," Dj: ");
while(1)
{
if(!JK2)
LCD_Write_String(1,6," Start ");
else
LCD_Write_String(1,6," Stop ");
key=Key_Scan();
if(key==KEY_SET)
{
sd=1;
}
if(key==KEY_ADD)
{
sd=0;
}
if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1)) //0水位 加水
{
led1=0;
led2=1;
led3=1;
JK2=0;
j++;
if(j<10)
{
speak=1;
}
else if(j<20)
{
speak=0;
}
else j=0;
Mode=0;
LCD_Write_Char(1,5,0,1) ;
sd=2;
delay_ms(3);
}
if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==0)) //1/4水位指示
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;
LCD_Write_Char(1,5,1,1) ;
}
if((SW01==1)&&(SW043==1)&&(SW021==0)&&(SW041==0)) //1/2水位
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;
LCD_Write_Char(1,5,2,1) ;
}
if((SW01==1)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //3/4水位
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;
LCD_Write_Char(1,5,3,1) ;
}
if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //水满停止加水
{
led1=1;
speak=1;
led2=1;
led3=0;
Mode=0;
JK2=1;
LCD_Write_Char(1,5,4,1) ;
sd=2;
}
}
}
完整代码点开链接私信 免费 获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa