标题:
51单片机实验程序:LCD1602显示温度报警
[打印本页]
作者:
凯旋小飞
时间:
2017-6-4 13:15
标题:
51单片机实验程序:LCD1602显示温度报警
实验6:LCD1602显示温度报警
单片机源程序如下:
/**************************************************************************************
* ** *
实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/
//DS18B20温度采集,LCD1602显示
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={" T: "};
uchar table1[]={" Tmax 32 "};
/********IO引脚定义**********/
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit dq=P3^7;
sbit beep=P1^5;
uchar num;
uint tempwarn,d=0,h=0;
void delay(uint n) //延时程序
{
while(n--);
}
//液晶写命令程序
void write_com(uchar com)
{
rs=0; //等0输入命令
en=0; //液晶使能信号初始化
P0=com; //把com参数,液晶的命令值送到P0口
delay(100); //延时,按照液晶的时序图的要求
en=1; //使能信号,0到1表示上升沿打开可以写命令数据到液晶里
delay(100);
en=0; //使能信号回复
}
void write_data(uchar date) //液晶写数据程序
{
rs=1; //等1表示输入数据
en=0;
P0=date; //把date参数,液晶的数据送到P0口
delay(100);
en=1;
delay(100);
en=0;
} //液晶初始化程序
void init()
{
en=0;
write_com(0x38); //设置16X2显示,5X7点阵,8位数据口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
}
void Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
{
uchar j;
for(j=0;j<8;j++)
{
dq=0;
dq=dat&0x01;
delay(5);
dq=1;
dat>>=1;
}
}
uchar Readbyte(void)//DS18B20温度芯片读字节程序
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dq=0;
dat>>=1;
dq=1;
if(dq==1)
dat|=0x80;
delay(4);
}
return dat;
}
void initds18b20(void)//温度芯片初始化程序
{
uchar x=0;
dq=1;
delay(8);
dq=0;
delay(80);
dq=1;
delay(14);
x=dq;
delay(20);
}
void Readtemp(void)//读温度程序
{
initds18b20();
Writebyte(0xcc);
Writebyte(0x44);
initds18b20();
Writebyte(0xcc);
Writebyte(0xbe);
d=Readbyte(); //温度信号的低8位数据函数
h=Readbyte(); //温度信号的高8位数据函数
}
get() //温度信号处理程序,把温度信号数据值转换为液晶显示
{
uint temp,tmp;
float tt;
tmp=d; //低8位数据给tmp
temp=h; //高8位数据给temp
temp<<=8; //高8位左移8位
temp|=d; //高低8位数据或起来再赋给temp
if((h&0x80)!=0) //高8位h&10000000是否等0,不等0表示负多少度
{
table[7]='-'; //把-赋给液晶数组的第8个元素,表示-号在第8位,1602一行有16个字符
temp=temp-1;
temp=~temp;
}
else
table[7]='+';
temp>>=4;
table[8]=(temp/100)+'0'; //液晶第9位字符为温度的百位数,例如120度的1
table[9]=(temp/10)%10+'0'; //液晶第10位字符为温度的十位数,例如120度的2
table[10]=(temp%10)+'0'; //液晶第9位字符为温度的个位数,例如120度的0
tmp=tmp&0x0f; //低位温度提取小数数据
tt=tmp*0.0625; //小数部分数据转换
table[11]='.'; //显示小数点
table[12]=((uchar)(tt*10))%10+'0';//小数点后面的小数数字
tempwarn=temp;
return tempwarn;//温度值返回
}
void warn(uint tempwarn)//温度报警程序
{
if(tempwarn>=32)//如果温度大于25度并且启动报警
{
beep=0;
delay(5000);
beep=1;
delay(50000);
}
}
void main()
{
rw=0; //rw直接置0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!!
init(); //液晶初始化函数
write_com(0x80+0x40); //0x80+0x40表示液晶的第二行开始显示
for(num=0;num<16;num++) //num<16,16表示显示16位
{
write_data(table1[num]); //液晶显示需要的内容,调用写液晶数据函数,这行显示拼音dengtianming
}
while(1) //大循环,不断检测和更新温度
{
Readtemp();
get();
warn(tempwarn);
write_com(0x80); //液晶的第一行开始地址
for(num=0;num<15;num++)//显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码
{
write_data(table[num]);//液晶需要显示的内容
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
实验6:LCD1602显示温度报警.rar
(32.49 KB, 下载次数: 297)
2017-6-4 13:14 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
wpzj
时间:
2018-4-10 10:10
绝世好文 啊
作者:
嘤叶知秋
时间:
2018-4-25 08:17
最近正在做相关设计,非常感谢分享
作者:
铭乐
时间:
2018-5-25 16:27
很好,值得学习
作者:
Jaciky
时间:
2018-12-31 20:25
很好,对我正在做的课设很有帮助
作者:
yaoyao886
时间:
2019-1-11 11:02
大佬 请问为什么用了这程序 无论怎么调 声音都是滴 滴 滴,不是尖锐的报警声呢》?
作者:
tiwen
时间:
2019-1-11 15:06
很好 值得学习
作者:
920842613
时间:
2019-3-22 16:07
程序编译有问题,没“lcd1602.h" "adc0832.h"
作者:
1114935347
时间:
2019-10-30 10:01
谢谢楼主,正需要
作者:
1114935347
时间:
2019-10-30 10:01
感谢楼住,正需要这个
作者:
whb040400
时间:
2019-12-28 16:11
很好,对我正在做的课设很有帮助
作者:
15852832597
时间:
2019-12-28 17:11
有没有好的
作者:
zyszyszys
时间:
2019-12-28 23:17
为什么显示的温度一直是-0.09
作者:
谭露95
时间:
2020-1-2 02:10
很好 被自己误删了
作者:
15877120502
时间:
2020-1-4 00:29
谢谢楼主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1