温度,液位作为智能饮水机中非常重要的参数,需要准确的采样。该系统完成对于上述参数的精确采用,并通过数码管或者液晶屏显示当前的水温及液位。“
仿真功能
(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