DS18B20温度传感器和1602液晶制作温度和时间同时显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用DS18B20温度传感器和1602液晶制作温度和时间同时显示【含原理图】2009年11月26日星期四22:43
C程序如下:
/*
功能:温度采集显示和可调时钟显示,时钟用中断法实现
s1:选择要调节的时、分、秒位
s2:时、分、秒加一
s3:时、分、秒减一
*/
#include
#define uchar unsigned char
#define uint unsigned int
uchar num,s1num,count;
ucharshi,fen,miao;
sbitrs=P2^0;
sbit e=P2^1;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2; //按键定义
sbit DQ =P2^2; //定义通信端口
bit flag;
uchar code table1[]="Time: 00:00:00";
uchar code table2[]="Temperature: 'C";//1602初始化字符
void delay(uint z)//延时子函数
{
uintx,y;
for(x=z; x>0; x--)
for(y=110;y>0;y--);
}
#include<1602.h>
#include<18b20.h>
#include
void main()
{
uchar temp;
init_1602();
while(1)
{ delay(500); //去除0秒和1秒之间显示间隔跟正常1秒间隔相差过大if(miao==0) //每分钟进行温度采集一次
{
TR0=0; //进入温度采集后,关闭定时器
flag=1; //flag=1,标志进入温度采集模式
write_com(0x80+0x40+13);
write_dat(0x30+1); //消除不显示数字1
temp=ReadTemperature(); //读取DS18B20的温度值
write_1602(12,temp); //向1602中写入温度值
TR0=1; //温度采集完成后,打开定时器
delay(100);//等待miao不等零,跳出循环
}
flag=0; //flag=0,标志在时钟显示模式下
keyscan(); //调用键盘扫描子程序,用以调整时间
}
}
void timer0() interrupt 1//定时器1的中断服务程序,并向1602中写时分秒显示时间{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if (count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
if(flag==0) //flag=0,标志在时钟显示模式下,然后才显示时间
write_1602(6,shi);
}
if(flag==0)
write_1602(9,fen);
}
if(flag==0)
write_1602(12,miao);
}
}
"1602.h"
void write_com(uchar com)//向1602液晶写命令函数{
rs=0;
e=0;
P0=com;
delay(5);
e=1;
delay(5);
e=0;
}
void write_dat(uchardat)//向1602液晶写入数据
{
rs=1;
e=0;
P0=dat;
delay(5);
e=1;
delay(5);
e=0;
}
void init_1602()//1602液晶的初始化
{
uchari;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
write_com(0x80); //第一行字符的初始化
for(i=0;i<16;i++)
{
write_dat(table2[i]);
delay(5);
}
write_com(0x80+0x40); //第二行字符的初始化
for(i=0;i<14;i++)
{
write_dat(table1[i]);
delay(5);
}
}
void write_1602(ucharaddress,uchartemp_dat)//向指定的地址中写入时、分、秒数据{
uchargewei,shiwei;
if(flag==0) //若在时钟显示模式下,向第二行写数据
{
write_com(0x80+0x40+address);
}
else
{
write_com(0x80+address); //若在温度采集显示模式下,向第一行写数据
}
shiwei=temp_dat/10;
gewei=temp_dat%10;
write_dat(0x30+shiwei); //根据1602字符库做相应转换
write_dat(0x30+gewei);
}
"18B20.h"
void delay_18b20(unsigned inti)//延时子函数
{
while(i--);
}
//初始化DS18B20子函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18b20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18b20(80); //精确延时大于480us