标题:
基于51单片机的水位测量仪仿真与源码
[打印本页]
作者:
880312
时间:
2018-4-15 01:19
标题:
基于51单片机的水位测量仪仿真与源码
不是特别完美,大家可以参考下。具体见附件
单片机的水位测量仪仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(19.02 KB, 下载次数: 73)
下载附件
2018-4-15 05:07 上传
0.jpg
(41.23 KB, 下载次数: 62)
下载附件
2018-4-15 05:06 上传
单片机的水位测量仪源程序如下:
#include<reg52.h>
#include<intrins.h>
#include<math.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit beep=P1^4;
sbit Relay=P2^0;
sbit LED_H=P1^6;
sbit LED_L=P1^7;
sbit LED_IN=P1^5;
sbit LED_OK=P1^6;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
uchar H_lim=11,L_lim=7;
uchar ad_dat1=0; //读取滤波后的AD值
uchar Water_dat=0;
uchar set_flag=0;
/***************************************************
函数名称:延时子函数
函数功能:按键消抖
***************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//******************adc0832****************************//
sbit Clk= P1^1;
sbit DATI=P1^0;
sbit DATO= P1^0;
sbit CS= P1^2;
uint dat = 0x00; //AD值
//AD转换子程序
uint adc0832(unsigned char CH)
{
uchar i,test,adval;
adval = 0x00;
test = 0x00;
//初始化
Clk = 0;
DATI = 1;
_nop_(); _nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_(); _nop_();
//通道选择
if(CH == 0x00)
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_(); _nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_(); _nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_(); _nop_();
Clk = 1;
_nop_(); _nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0; _nop_();
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_(); _nop_();
Clk = 0; _nop_();
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_(); _nop_();
Clk = 0; _nop_();
}
//比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
if (adval == test)
dat = test;
_nop_(); _nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
/*液晶显示程序*/
sbit EN=P2^7;
sbit RS=P2^5;
sbit RW=P2^6;
unsigned char LCD1602_Table[]="0123456789:-";
// 0123456789abcdef
unsigned char DIS1_TAB[]={"Water level: cm"};
unsigned char DIS2_TAB[]={" H: cm L: cm "};
void write_date(uchar date)
{
EN=0;
RS=1;
P0=date;
EN=0;
delayms(5);
EN=1;
}
void write_com(uchar date)
{
EN=0;
RS=0;
P0=date;
EN=0;
delayms(5);
EN=1;
}
void init_1602()
{
unsigned char i;
RW=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(i=0;i<16;i++)
write_date(DIS1_TAB[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_date(DIS2_TAB[i]);
}
void display()
{
static uchar i=0;
if(set_flag>0)
{
if(i<20)
i++;
else
i=0;
}
write_com(0x80+12);
write_date(LCD1602_Table[Water_dat%100/10]);
write_date(LCD1602_Table[Water_dat%10]);
write_com(0x80+0x40+4);
if((set_flag==1)&&(i<10))
{
write_date(' ');
write_date(' ');
}
else
{
write_date(LCD1602_Table[H_lim/10]);
write_date(LCD1602_Table[H_lim%10]);
}
write_com(0x80+0x40+11);
if((set_flag==2)&&(i<10))
{
write_date(' ');
write_date(' ');
}
else
{
write_date(LCD1602_Table[L_lim/10]);
write_date(LCD1602_Table[L_lim%10]);
}
}
//水位计算
void Water_Calculate()
{
if(ad_dat1<33)
{
Water_dat=10-((33-ad_dat1)/3);
}
else
{
Water_dat=10+((ad_dat1-33)/3);
}
}
void key()
{
if(K1==0)
{
delayms(10);
if(K1==0)
{
set_flag++;
if(set_flag>2)
set_flag=0;
while(!K1);
}
}
switch(set_flag)
{
case 1:
if(K2==0)
{
delayms(10);
if(K2==0)
{
if(H_lim<99)
H_lim++;
while(!K2);
}
}
else if(K3==0)
{
delayms(10);
if(K3==0)
{
if(H_lim>0)
H_lim--;
while(!K3);
}
}
break;
case 2:
if(K2==0)
{
delayms(10);
if(K2==0)
{
if(L_lim<99)
L_lim++;
while(!K2);
}
}
else if(K3==0)
{
delayms(10);
if(K3==0)
{
if(L_lim>0)
L_lim--;
while(!K3);
}
}
break;
default: break;
}
}
/*主函数*/
void main()
{
uint AD_DAT=0;
float ad_buf=0;
uchar i=0;
LED_OK=0;
init_1602();
while(1)
{
if(i<10) // 滤
{
i++;
AD_DAT+=adc0832(0); // 波
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
水位检测.zip
(72.08 KB, 下载次数: 110)
2018-4-15 01:18 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
十字路812
时间:
2018-5-21 13:54
很实用,给力
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1