204、51单片机智能饮水机仿真\温度水位显示

        温度,液位作为智能饮水机中非常重要的参数,需要准确的采样。该系统完成对于上述参数的精确采用,并通过数码管或者液晶屏显示当前的水温及液位。“
        仿真功能
(1)温度测量范围为0-100度,精度为士0.5V。4
(2)用数码管或LCD显示实际温度,液位值。“
(3)实现对温度,液位的实时采集,并将相关值显示在LCD屏幕上

源码

#include "stdio.h"
#include "reg52.h"
#include "delay.h"
#include "PCF8591.h"
#define uchar unsigned char 
#define uint unsigned int
#include "ds18b20.h"
	/* LCD屏幕端口定义 */
#define D P0	
sbit E=P2^6;   
sbit RW=P2^5;
sbit RS=P2^7;






uchar disp_mode = 0;   //当前显示模式
uchar disp_ch = 1;   //当前显示通道

uchar t200ms_flag = 0;
uchar uart_flag = 0;

//ADC通道值
uchar val_ch1 = 0;  


//水位值
float water_val = 0;

float water_temp = 0;                          //温度值

void LcdWriteCom(uchar com);					/* LCD1602写入8位命令子函数 */
void LcdWriteData(uchar dat)	;				/* LCD1602写入8位数据子函数 */
void LcdInit();									/* LCD1602初始化子程序 */	
void setAddr(unsigned char line ,unsigned char addr);
void setBuling(unsigned char YorN);
void Show_string1(uchar a[]); 					/* 第一行从头开始显示 字符   "" 双信号内直接加显示内容即可 */
void Show_string2(uchar a[]);					/* 第二行     "" 双信号内直接加显示内容即可 */
void show_string(uchar add,uchar a[]);			/* 指定位置显示字符串 注意 算好位置  0~27   40~67   地址值,"显示字符串" */
void show_number(uchar add,uint a);				/* show_number(0x加 要显示的地址,变量或数字 */
void show_float(uchar add,float a);				/* 显示浮点数 */

void timer_init();                        /*定时器*/

void main()
{
	unsigned char i=0;
	unsigned char val_bt = 0;
	
	char string[16] = {0};
	timer_init();
	LcdInit();							/* LCD1602初始化函数 */
	//REN=1;  	//REN=1,允许串行口接收数据
	SM1=1;		//串行口工作方式1
	EA=1;	//总中断控制
	//ES=1;	//串口中断
	initDs18b20();          /* DS18B20初始化 */
	Init_pcf8591();
	Show_string1("   ");       /*初始1602显示内容*/
	
	disp_ch = 1;

	while(1)   //程序主逻辑
	{
		EA=0;//关中断
		water_temp = readTemperatureFloat();  //获取温度值
		EA=1;//开中断
		//获取ADC
		val_ch1 = Read_value_ch(2);
		//温度值转换
		water_val = 100.0*val_ch1/256;
		if(disp_mode == 0)   //显示温度模式
		{
					
					//显示水位
					sprintf(string,"water:%.1f% ",water_val);
					Show_string1(string);
			
						//显示通道温度
					sprintf(string,"temp:%0.1f",water_temp);
					Show_string2(string);
				
				
		}
	}

}


void timer_init()
{
  	TMOD|=0x01;//0000 0001,最后2位-工作方式的选择,这里选择16位定时器‘01’
TH0 = (65536-20000)/256;  //定时10ms  //高八位赋初值
	TL0 = (65536-20000)%256;  //低八位赋初值
	EA=1;//开中断
	ET0=1;//定时器0的中断运行
	TR0=1;//运行控制位,置1位为工作
}

int period = 0;
int period_ms = 0;
void ab(void)interrupt 1  //中断的时间在大约65ms ,中断程序
{
	period++;
	period_ms++;
	TH0 = (65536-20000)/256;  //定时20ms  //高八位赋初值
	TL0 = (65536-20000)%256;  //低八位赋初值
  
	if(period_ms>10)
	{
		period_ms = 0;
		t200ms_flag = 1;
	}

}

	

	
	


/* 向1602写命令函数
 * 参数:com 命令
 * 返回值 : 无
 */
void LcdWriteCom(uchar com)
{
	E=0;
	RW=0;
	RS=0;
	D=com;
	delay_us(8);
	E=1;
	delay_us(8);
	E=0;
}
/* 向1602写数据命令
 * 参数: dat 数据
 * 返回值: 无
 */
void LcdWriteData(uchar dat)
{
	E=0;
	RW=0;
	RS=1;
	D=dat;
	delay_us(8);
	E=1;
	delay_us(8);
	E=0;
}

/* LCD1602初始化函数
 */
void LcdInit()
{
	LcdWriteCom(0x38);
	LcdWriteCom(0x0c);//0x0C光标不闪
//	LcdWriteCom(0x0d);//0x0D光标闪烁
	LcdWriteCom(0x06);
	LcdWriteCom(0x01);
	LcdWriteCom(0x80);
}
/*设置光标位置 第一行0x00-0xF 第二行0x40-0x4f */
void setAddr(unsigned char line ,unsigned char addr)
{
	if(line == 1)
	LcdWriteCom(0x80+addr);
	if(line == 2)
		LcdWriteCom(0x80+0x40+addr);

}
/*设置光标闪烁*/
void setBuling(unsigned char YorN)
{
	if(YorN)
	LcdWriteCom(0x0d);//0x0D光标闪烁
	else
	{
		LcdWriteCom(0x0c);//0x0C光标不闪
	}
}

/* 指定位置显示字符串
 * 参数 add 地址 第一行 0~27
 *               第二行 40~67
 *      a[] 字符串 "abc" 
 */
void show_string(uchar add,uchar a[])
{
	uchar i;
	LcdWriteCom(0x80+add);
	for(i=0;a[i]!='\0';i++)
	{
		LcdWriteData(a[i]);
	}
}

/* 第一行显示字符串
 */
void Show_string1(uchar a[])
{
	uchar i;
	LcdWriteCom(0x80);
	for(i=0;a[i]!='\0';i++)
	{
		LcdWriteData(a[i]);
	}
}

/* 第二行显示字符串
 */
void Show_string2(uchar a[])
{
	uchar i;
	LcdWriteCom(0x80+0X40);
	for(i=0;a[i]!='\0';i++)
	{
		LcdWriteData(a[i]);
	}
}

/* 任意位置显示数字 
*/
void show_number(uchar add,uint a)
{
	char s[10];
	sprintf(s,"%d",a);				
	show_string(add,(uchar *)s);		/* 格式转换 */
}

/* 任意位置显示浮点数
*/
void show_float(uchar add,float a)
{
	char s[10];
	sprintf(s,"% .1f",a);/* 格式转换 */
	show_string(add,(uchar *)s);
}


关注下方公众号,在公众号回复“204”获取完整工程文件

或者点击链接下载https://download.csdn.net/download/zd845101500/87853162

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值