1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 高温报警c语言程序 51单片机实验程序:LCD1602显示温度报警

高温报警c语言程序 51单片机实验程序:LCD1602显示温度报警

时间:2021-02-09 08:12:00

相关推荐

高温报警c语言程序 51单片机实验程序:LCD1602显示温度报警

/**************************************************************************************

* ** *

实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。

***************************************************************************************/

//DS18B20温度采集,LCD1602显示

#include

#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

}

voidWritebyte(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黑下载附件…………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。