全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等
资料下载:
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
项目功能:
51单片机液体水流量检测设计
本系统由51单片机电路+水流量传感器模块电路+LCD1602液晶显示电路+按键电路+蜂鸣器电路+电源电路组成。
1、水流量传感器采用椭圆齿轮传感器。
2、通过液晶LCD1602液晶实时显示瞬时流量和累计流量。
3、通过按键设置累计流量阈值,如果累计流量高于设置阈值,蜂鸣器开始报警
4、通过液晶LCD1602液晶实时显示设置流量设置值。
5、累积流量和设置的流量阈值掉电不丢失数据。
项目文件:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书
三、系统流程图
四、器件清单
元件标号 | 元件名称 | 数量 |
C1 | 470uF电解电容 | 1 |
C2 | 10uF电解电容 | 1 |
C3, C4 | 30pf瓷片电容 | 2 |
J1 | 电源接口 | 1 |
K1 | 轻触按键 | 1 |
L4 | 3mm红色LED灯 | 1 |
P1 | 4P排针 | 1 |
P2 | XH-2A白色底座+XH-2P双头线(注意正反) | 1 |
R2 | 10K电阻 | 1 |
R3 | 1K电阻 | 1 |
R10 | 103蓝白滑动变阻器 | 1 |
R57 | 4.7K电阻 | 1 |
SW1 | 自锁开关 | 1 |
U1 | STC89C52单片机+DIP40底座 | 1 |
U23 | DS18B20温度传感器 | 1 |
U53 | MAX485芯片+DIP8底座 | 1 |
Y1 | 11.0592M晶振 | 1 |
锡丝若干 | 1 | |
导线若干 | 1 | |
9*15万用板 | 1 | |
USB供电线一根或电池盒 | 1 |
五、Keil c语言程序源代码(部分)
#include <REGX52.H>
#include "LCD1602.h"
#include "eeprom52.h"
uchar ms=0;
uchar count=0; //流量计数
uint flow=0; //流量数据
uint flow_h=1; //流量数
uint flow_Value=0; //流量数
uint speed_count=0; //速度数据计数
uint speed=0; //速度数据计数
bit memory_flag=0;
bit beep1=0;
bit flow_flag=0;
bit memory_flag1=0;
uchar sec=0;
uchar sec1=0;
uchar time=0;
void memeory()
{
if(memory_flag)
{ memory_flag=0;
SectorErase(0x2000);
byte_write(0x2000,flow_h/256);
byte_write(0x2001,flow_h%256);
}
if(memory_flag1)
{ memory_flag1=0;
SectorErase(0x2200);
byte_write(0x2200,flow/256);
byte_write(0x2201,flow%256);
}
}
void read_memeory()
{
flow_h=byte_read(0x2000)*256+byte_read(0x2001);
flow=byte_read(0x2200)*256+byte_read(0x2201);
if(flow_h>999||flow_h<0)
{
flow_h=20;
}
if(flow>999||flow<0)
{
flow=0;
}
}
void key_dispose()
{
if(!key1)
{
if(key1_flag)
{
key1_flag=0;
if(flow_h<999) flow_h++;
}
if(sec==0)
{
if(flow_h<999) flow_h++;
}
}
else
{
if(key1_flag==0) memory_flag=1;
key1_flag=1;
sec=4;
}
if(!key2)
{
if(key2_flag)
{
key2_flag=0;
if(flow_h>0) flow_h--;
}
}
else
{
if(key2_flag==0) memory_flag=1;
key2_flag=1; sec1=4;
}
if(!key1&&!key2)
{
}
else
{
if(key3_flag==0) memory_flag1=1;
key3_flag=1;
}
}
void display()
{
LCD1602_write(0,0x80);
LCD1602_writebyte("Speed:");
LCD1602_write(0,0x8A);
LCD1602_writebyte("L/S ");
LCD1602_write(0,0xC0);
LCD1602_writebyte("F:");
if(flow>99) LCD1602_write(1,0x30+flow/100%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+flow/10%10);
LCD1602_write(1,'.');
LCD1602_write(1,0x30+flow%10);
LCD1602_write(1,'L');
LCD1602_writebyte(" H:");
LCD1602_write(1,0x30+flow_h/10%10);
LCD1602_write(1,'.');
LCD1602_write(1,0x30+flow_h%10);
LCD1602_write(1,'L');
}
void police()
{
if(flow>flow_h)
{
beep1=1;
}
else
{
beep1=0;
}
}
void main()
{ LCD1602_cls();
TMOD=0x01;
ET0=1;
TR0=1;
EA=1; //配置定时器0 工作在方式1 最大计数65535
EX0=1;
IT0=1;
read_memeory();
while(1)
{ police();
display();
memeory();
}
}
void time0() interrupt 1
{
ms++;
key_dispose() ;
if(ms%10==0)
{
if(beep1) beep=~beep;
else beep=1;
if(sec!=0) sec--;
if(sec1!=0) sec1--;
}
if(ms>=20)
{
ms=0;
EX0=0;
speed=speed_count*0.22222222222222; //一个脉冲数是0.0022222222222222L,我们要精确到小数点后两位
speed_count=0;
EX0=1;
LCD1602_write(0,0x86);
LCD1602_write(1,0x30+speed/100%10);
LCD1602_write(1,'.');
LCD1602_write(1,0x30+speed/10%10);
LCD1602_write(1,0x30+speed%10);
}
}
void int0() interrupt 0
{
count++;
speed_count++; //既然是450脉冲为1L,则1/450得到的就是一个脉冲是多少升 0.0022222222222222,也就是说1个脉冲等于0.0022222222222222升数据
if(count>=45) // 每450脉冲为1L,则,45脉冲就是0.1L
{
count=0;
flow=flow+1; // flow就是每次获得0.1L数据加一
memory_flag1=1;
}
}
六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复“资料”!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓