📄 111.c
字号:
//-------------------------------------
//---------智能抽水系统软件设计--------
//---------date: 2007-3-18 --------
//---------author: Adeola ----------
#include "89s51.h"
#include "LCD.H"
#define uint unsigned int
#define K1 P0_4 // 水位上限加
#define K2 P0_3 // 水位上限减
#define K3 P0_2 // 水位下限加
#define K4 P0_1 // 水位下限减
#define K5 P0_0 //应急键 按下则强制停止抽水
long int juli;
unsigned char second;
unsigned char shang=100,xia=1 ; //初始化 最高水位限制 为100 最低水位1
static long int Recieve_Time;
void Caculate_juli(void); //计算距离
/////////////////////////////////////////////////////////////////////
void delay(char m) //超声波发送延时
{
unsigned char i,j;
for(i=0;i<m;i++)
for(j=0;j<80;j++);
}
///////////////////////////////////////////////////////////////////
void Delay1ms(int n) //LCD显示延时
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
///////////////////////////////////////////////////////////
void intet0(void) interrupt 1 using 1 //T0益出中断,得到超声波返回时间
{
TH0=0X00; //重新赋值
TL0=0X00;
second++; // T0益出中断次数++
}
/////////////////////////////////////////////////////////////
void intex1(void) interrupt 2 using 1// 外部中断1服务程序
{
union {unsigned int time;unsigned char t[2];}count;//定义一个共用体,用来存放T0的值,将TH0 TL0的值整合在一起
IE=0;
TR0=0;
count.t[0]=TH0;
count.t[1]=TL0; //读取时间,计数多少则为多少US
Recieve_Time=count.time;
TH0=0; //T0重新赋初值
TL0=0;
IE=0x8e; //开启中断
Caculate_juli();//计算距离
}
////////////////////////////////////////////////////////////
void Caculate_juli(void) //计算距离
{
unsigned char i; //secondT0溢出次数
int Speed=170; // 340/2=170
juli=Recieve_Time*Speed;//Recieve_Time(us)*340(m/s)*10-6
//juli/=2000000; //若是 Speed=340; 则如此
for(i=0;i<second;i++)
{
juli+=11140000; //11.14为T0溢出一次对应距离 补齐八位是为了方便拆开显示
//juli/=1000000;
}
second=0; //中断记数器清零
}
//////////////////////////////////////////////////////////////
void Initial_display() //显示初始化
{
WriteInstruct(0x80);
WriteString("shuiwei:");
}
////////////////////////////////////////////////////////////
void display()//显示程序
{
long int temp;
unsigned char i;
unsigned char value[8]; //存放JULI
for(i=0;i<8;i++) //逐一拆字 方便LCD显示
{
value[i]=temp%10;
temp/=10;
}
WriteInstruct(0x89); //在 shuiwei 后显示距离
WriteData(value[7]+0x30);//从高位向地位逐一显示 只显示四位 精度为CM
WriteData(value[6]+0x30);
WriteString("."); //小数点显示
WriteData(value[5]+0x30);
WriteData(value[4]+0x30); //显示两位小数,精度到CM
//Write_Data(value[3]+0x30); //后四位丢弃
//Write_Data(value[2]+0x30);
//Write_Data(value[1]+0x30);
//Write_Data(value[0]+0x30);
/* WriteInstruct(0xc0); // 显示格式控制
WriteData(juli/10+'0');
WriteData(juli%10+'0');
WriteString(":");*/
WriteInstruct(0xc0);
WriteData(shang/10+'0');
WriteData(shang%10+'0');
WriteString(":");
WriteData(xia/10+'0');
WriteData(xia%10+'0');
WriteString(":"); // 空格有影响 " : "
}
////////////////////////水位设定////////////////////////////
void keyboard() //键盘程序
{
if(K1==0) //最高水位限制为: 60---100
{
Delay1ms(10); //键消抖
while(!K1) //P3.0连续低电平时shang连续加1
{
if(shang!=100) //最高水位限制为100
{
shang++;
display();
Delay1ms(200);
}
else
{
shang=60; //shang等于100时,shang=60
display();
Delay1ms(200);
}
}
}
if(K2==0)
{
Delay1ms(10);
while(!K2) //P3.0连续低电平时shang连续减一
{
if(shang!=60)
{
shang--;
display();
Delay1ms(200);
}
else
{
shang=100; //shang等于60时,shang=100
display();
Delay1ms(200);
}
}
}
if(K3==0) /// 最低水位限制为 1-20
{
Delay1ms(10);
while(!K3) //P3.0连续低电平时xia连续加1
{
if(xia!=20)
{
xia++;
display();
Delay1ms(200);
}
else
{
xia=0; //xia等于20时,day=1
display();
Delay1ms(200);
}
}
}
if(K4==0)
{
Delay1ms(10);
while(!K4) //P3.0连续低电平时xia连续-1
{
if(xia!=1)
{
xia--;
display();
Delay1ms(200);
}
else
{
xia=200; //xia等于1时,xia=60
display();
Delay1ms(200);
}
}
}
if(K5==0)
{
Delay1ms(10);
while(!K5)
{
P2_1=1; //强制关机。
}
}
}
//////////////////////////////////////////////////////////////////
//////////////////////系统主程序/////////////////////////////////
void mian(void)
{
IE=0x86; // EA=1 允许外中断1 T0 中断
TMOD=0x01; //T0模式一
TH0=0x00; //定时初值
TL0=0x00; //大于65536以后又需要重新开始记数了 中断一次则标志位加一(65536US)再算时间时候标志位乘以65536
IP=0x04;
Initial_LCD(); // 初始化函数调用
Initial_display();//
display();
while(1)
{
keyboard(); //调用键盘
display(); //
P0_6=1; //发送超声波
TR0=1; //启动定时器0 测量超声波发射到接收的时间
delay(5); // 延时,抗干扰 必须小于超声波回波时间
P0_6=0; //停止发送
if(juli<xia) //现在测量的距离小于设定距离 则启动电机抽水
{
P2_0=1; // 启动电机抽水
}
if(juli>shang) //现在距离大于设定抽水上限 则停止抽水
{
P2_1=1; //停止 电机停止抽水
}
}
}
////////////////////////////////////END/////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -