#include<reg15.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
char read_data();
void delay(uchar z);
uchar flag;
uchar shiZ,shiX,wenZ,wenX,check;
uchar tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;
uchar time1;
uchar buf;
unsigned int time=0;
unsigned long S=0;
bit fl =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
/**************************************************/
/**************************************************/
/*12864端口定义*/
sbit o1=P4^7;
sbit o2=P1^2;
sbit o3=P1^3;
sbit rs = P4^2; //寄存器选择输入
sbit rw = P4^3; //液晶读/写控制
sbit en = P4^4; //液晶使能控制
sbit LCD_PSB = P4^5; //串/并方式的选择
sbit s1=P3^6;
sbit s2=P3^7;
sbit DHT=P3^2; //温湿度使能
sbit a1=P0^6;
sbit a2=P0^7;
sbit RX= P3^4;
sbit TX = P3^5;
//uchar str[4];//uchartostr函数转换的字符串
//写字符到12864
uchar xdata num[]=" 抽水系统 ";
uchar xdata num1[]="温度: ℃ ";
uchar xdata num2[]="湿度: % ";
uchar xdata num3[]="水位: ";
//延时
void delayms(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//10毫秒延时
void delay_10us()
{
uchar i=9;
do
{
_nop_();
_nop_();
_nop_();
i--;
}while(i);
}
void Delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 52;
while (--i);
}
/*检查LCD忙状态 */
/*lcd_status为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
bit lcd_status()
{
bit status;
rs = 0;
rw = 1;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
en = 1;
status = P2&0x80;
en = 0;
return(status);
}
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
void lcd_wcmd(uchar cmd)
{
while(lcd_status());
rs = 0;
rw = 0;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
en = 1;
P2 = cmd;
en = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_status());
rs = 1;
rw = 0;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
en = 1;
P2 = dat;
en = 0;
}
void lcd_dis(uchar X,uchar Y,uchar *dis)
{
uchar pos;
switch(X)
{
case 0:X=0x80;
break;
case 1:X=0x90;
break;
case 2:X=0x88;
break;
case 3:X=0x98;
break;
default:break;
}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
while(*dis!='\0')
{
lcd_wdat(*dis++);
}
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
P2=0x00;
LCD_PSB = 1; //并口方式
lcd_wcmd(0x30); //基本指令操作
delayms(30);
lcd_wcmd(0x0C); //显示开,关光标
delayms(30);
lcd_wcmd(0x01); //清除LCD的显示内容
delayms(30);
}
//读温湿度初始化
void read_init()
{
DHT=0; //主机使DHT11低电平并延时至少18ms
delayms(30);
DHT=1; //主机置DHT11高电平20~40us,并等待从机相应
delay_10us();
delay_10us();
delay_10us();
delay_10us();
DHT=1;
if(!DHT) //从机发出响应信号
{
flag=2;
while((!DHT)&&flag++);//等待从机发高电平结束
flag=2;
while(DHT&&flag++); //开始采集数据
tr_shiZ=read_data();//采集湿度整数部分
tr_shiX=read_data();//采集湿度小数部分
tr_wenZ=read_data();//采集温度整数部分
tr_wenX=read_data();//采集温度小数部分
check=read_data(); //采集校验位
}
DHT=0;
delay(30);//采集完数据后
}
char read_data()
{
uchar i,num,temp;
num=0;
for(i=0;i<8;i++)
{
flag=2;
while((!DHT)&&flag++);//等待50毫秒低电平
delay_10us();//延时判断0还是1
delay_10us();
delay_10us();
delay_10us();
if(DHT==1)
{
temp=1;
flag=2;
while(DHT&&flag++);
}
else
temp=0;
num<<=1;
num|=temp;
}
return(num);
}
void com(uchar com)
{
rs=0;
rw=0;
P2=com;
delayms(20);
en=1;
delayms(20);
en=0;
}
void dat(uchar dat)
{
rs=1;
rw=0;
P2=dat;
delayms(20);
en=1;
delayms(20);
en=0;
}
//写温湿度到LCD
void writed(uchar *m,uchar n,uchar date) //在固定位置写数字
{
uchar shi,ge;
shi=date/10;
ge=date%10;
*(m+n)=48+shi;
*(m+n+1)=48+ge;
}
//写超声波距离到LCD
void writed1(uchar *m,uchar n,uchar date) //在固定位置写数字
{
uchar ge;
ge=date;
*(m+n+1)=ge;
}
void disp()
{
uchar i;
com(0x80);
for(i=0;i<16;i++)
{
dat(num[i]);
delayms(20);
}
}
void disp1()
{
uchar i;
com(0x90);
for(i=0;i<16;i++)
{
dat(num1[i]);
delayms(20);
}
}
void disp2()
{
uchar i;
com(0x88);
for(i=0;i<16;i++)
{
dat(num2[i]);
delayms(20);
}
}
void disp3()
{
uchar i;
com(0x98);
for(i=0;i<16;i++)
{
dat(num3[i]);
delayms(20);
}
}
void StartModule() //启动模块
{
TX=1; //启动一次模块
Delay20us(); //10us 以上
Delay20us();
TX=0;
}
void Conut(void)
{
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=(float)(time*1.085)*0.017; //算出来是CM
if((S>=700)||fl==1) //超出测量范围显示“-”
{
fl=0;
writed1(num3, 5, ASCII[11]);
writed1(num3, 6, ASCII[10]); //显示点
writed1(num3, 7, ASCII[11]);
writed1(num3, 8, ASCII[11]);
writed1(num3, 11, ASCII[12]); //显示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
writed1(num3, 5, ASCII[disbuff[0]]);
writed1(num3, 6, ASCII[10]); //显示点
writed1(num3, 7, ASCII[disbuff[1]]);
writed1(num3, 8, ASCII[disbuff[2]]);
writed1(num3, 11, ASCII[12]); //显示M
}
}
//串口初始化 波特率为2400
void UartInit(void) //2400bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //
daima.rar_LCD12864菜单_lcd12864三级菜单_三路继电器_温湿度检测_超声波 测距
版权申诉
165 浏览量
2022-07-14
03:51:04
上传
评论
收藏 50KB RAR 举报
APei
- 粉丝: 63
- 资源: 1万+
最新资源
- 基于python部署fastsam的tensorrt模型源码.zip
- 【JavaScript】基于JSP的酒店客房管理系统源【源码+lw+部署文档+讲解】
- 综合电路设计-8赛道多功能运动秒表(vivado实现代码)
- java学习心得4000字.doc
- CarControl.pcf
- opencv-基于c++实现的opencv图像处理算法之gamma校正.zip
- java实习周记25篇.doc
- MI4450-VB一款SOP8封装N-Channel场效应MOS管
- opencv-基于c++实现的opencv图像处理算法之灰度变换算法.zip
- 实现用于Landmark检测+Robot跟踪的SLAM定位导航算法源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈