DS18B20温度传感器和1602液晶制作温度和时间同时显示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档