#include<STC12C5A60S2.H>
#include <intrins.h>
#include <string.h> //字符串处理
#define uchar unsigned char
#define uint unsigned int
uchar table[]={" temp:"};
uchar table1[]={" name:xinshou "};
/********IO引脚定义**********/
sbit rs = P3^2; //rs控制线
sbit rw = P3^3; //rw控制线
sbit en = P3^4; //使能控制
sbit dq = P2^5; //18B20数据线
sbit beep = P2^7; //报警控制线
sbit busy =P1^7; //测忙线
uchar num;
uint tempwarn,d=0,h=0;
void delay(int num){//延时函数
while(num--) ;
}
void busytest(void)
{
P1=0xff; //设备读状态
rs=0;
rw=1;
en=1;
while(busy); //等待1602不忙
en=0;
}
void write_com(uchar com) //液晶写命令程序
{ busytest();
P1=com; //把com参数,液晶的命令值送到P1口
rs=0; //等0输入命令
rw=0;
en=1; //使能信号,0到1表示上升沿打开可以写命令数据到液晶里
en=0; //使能信号回复
}
void write_data(uchar date) //液晶写数据程序
{
busytest();
P1=date; //把date参数,液晶的数据送到P1口
rs=1; //等1表示输入数据
rw=0;
en=1;
en=0;
}
void init() //液晶初始化程序
{
en=0;
write_com(0x38); //设置16X2显示,5X7点阵,8位数据口
write_com(0x01); //显示清0,数据指针清0
write_com(0x02); //数据指针指向第一行,第一个字符位置
write_com(0x06); //写一个字符后地址指针加1
write_com(0x0c); //设置开显示,不显示光标
}
void Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
{
uchar j=0;
for(j=8;j>0;j--)
{
dq=0;
dq=dat&0x01;
delay(5);
dq=1;
dat>>=1;
}
}
uchar Readbyte(void) //DS18B20温度芯片读字节程序
{ uchar i,dat=0;
for(i=8;i>0;i--)
{
dq=0;
dat>>=1;
dq=1;
if(dq==1)
{ dat |= 0x80;}
delay(4);
}
return dat;
}
void initds18b20(void) //温度芯片初始化程序
{ uchar x=0;
dq=1; //DQ复位
delay(8);//稍做延时
dq=0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
dq=1; //拉高总线
delay(14);
x=dq; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
unsigned int Readtemp(void) //读温度程序
{ unsigned char d=0;
unsigned char h=0;
unsigned int temp=0;
float tt=0;
initds18b20();
Writebyte(0xcc);// 跳过读序号列号的操作
Writebyte(0x44);// 启动温度转换
initds18b20();
Writebyte(0xcc);//跳过读序号列号的操作
Writebyte(0xbe);//读取温度寄存器
d=Readbyte(); //温度信号的低8位数据函数
h=Readbyte(); //温度信号的高8位数据函数
temp=h; //高8位数据给temp
temp<<=8; //高8位左移8位
temp|=d; //高低8位数据或起来再赋给temp
tt=temp*0.0625; //小数部分数据转换
temp=tt*10+0.5;
return (temp); //温度值返回
}
void warn(uint tempwarn) //温度报警程序
{
if(tempwarn<=2) //返回的值是温度的值,如果温度小于20度就报警并且启动风冷设备?
{
beep = 0;
delay(5000);//蜂鸣器的声音响的时间
beep = 1;
delay(50000);//蜂鸣器的声音不响的时间
}
else if(tempwarn>=30) //如果温度大于25度并且启动报警
{
beep =0;
delay(5000);
beep =1;
delay(50000);
}
}
void main()
{
rw = 0; //rw直接置0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!!
init(); //液晶初始化函数
Readtemp();
write_com(0x80+0x40); //0x80+0x40表示液晶的第二行开始显示
for(num=0;num<15;num++) //num<16,16表示显示16位
{
write_data(table1[num]);//液晶显示需要的内容,调用写液晶数据函数
}
while(1) //大循环,不断检测和更新温度
{
Readtemp();
warn(tempwarn);
write_com(0x80); //液晶的第一行开始地址
for(num=0;num<15;num++) //显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码?
{
write_data(table[num]);//液晶需要显示的内容
}
}
}
此帖出自
小平头技术问答
一周热门 更多>