基于STC89C52和DS18B20的温度检测装置设计 下载本文

unsigned char x=0; DS = 1; //DQ复位

/头文件 ds18b20_delay(8); //稍做延时 #include DS = 0; //单片机将DQ拉低 #include ds18b20_delay(80); //精确延时 大#include 于 480us #define uchar unsigned char DS = 1; //拉高总线 #define uint unsigned int ds18b20_delay(14); sbit beep=P2^4; x=DS; //稍做延时后 如果uchar keep=0; x=0则初始化成功 x=1则初始化失败 uint disdata[18]; ds18b20_delay(20); uint t_value,tflag; } uchar code str1[]={\//***************************************#define NONE_KEY_CODE 0X0f **************************************** #define MODE_KEY_CODE 0X0e unsigned char Readchar(void) //读一个字节 #define INC_KEY_CODE 0X0d { #define DEC_KEY_CODE 0X0b unsigned char i=0; #define SET_KEY_CODE 0X07 unsigned char dat = 0; uint keyvalue[2]; for (i=8;i>0;i--) uchar basetime,mode,flag,SET_mode,SET_flag; { char timebuf[5]; DS = 0; // 给脉冲信号,读uint funcode,key_timing,time; 起始 uchar TH=30,TL=20; dat>>=1; //低位开始接收 //*************************************** DS = 1; // 给脉冲信号 ************************************** if(DS) //若读出1

dat|=0x80; #define lcd1602_Bus P0 //lcd1602定

ds18b20_delay(4); 义

sbit lcd1602_en=P2^5; } sbit lcd1602_rs=P2^6; return(dat); //***************************************} ************************************* //***************************************

*************************************** sbitDS= P2 ^0; //ds18B20定义

//***************************ds18b20*****void Writechar(unsigned char dat) //写一个字************************************** 节 void ds18b20_delay(unsigned int nus) { { unsigned char i=0; while(nus--); for (i=8; i>0; i--)

{ //延时微秒

} DS = 0; //*************************************** DS = dat&0x01; ************************************* ds18b20_delay(5);

DS = 1; void DS18B20_initial(void) //初始化

ds1820 dat>>=1; { }

附录:

1

}

//******************************************************************************* unsigned int readtemp(void) //读取温度 {

unsigned char a=0; unsigned char b=0; unsigned int t_value=0; float tt_value=0; DS18B20_initial(); Writechar(0xCC); // 跳过读序号列号的操作 Writechar(0x44); // 启动温度转换 DS18B20_initial(); Writechar(0xCC); //跳过读序号列号的操作 Writechar(0xBE); //读取温度寄存器 a=Readchar(); //读低8位 b=Readchar(); //读高8位 t_value=b; t_value<<=8; t_value=t_value|a; tt_value=t_value*0.0625; //读取真实值 t_value= tt_value*10+0.5; //放大10倍输出并四舍五入 return(t_value); }

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

//*************************lcd1602**************************************************

void delayms(uint xms) {

uint i,j;

for(i=xms;i>0;i--) for(j=110;j>0;j--); }

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

void write_lcd1602_com(uchar com) //写地址 {

lcd1602_Bus=com; delayms(5); lcd1602_rs=0; lcd1602_en=1; delayms(5); lcd1602_en=0; }

void write_lcd1602_dat(uchar dat) //写数据 {

lcd1602_Bus=dat; delayms(5); lcd1602_rs=1; lcd1602_en=1; delayms(5); lcd1602_en=0; }

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

void lcd1602_initial(void) //液晶初始化 {

//lcd1602_wr=0; lcd1602_en=0;

write_lcd1602_com(0x01);//清屏

write_lcd1602_com(0x06);//指针加减与移动 write_lcd1602_com(0x0c);//光标

write_lcd1602_com(0x38);//液晶初始化命令 write_lcd1602_com(0x01);//清屏 }

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

/********************************************************* 名称:lcd_string(uchar row,uchar cloum,uchar *p) 功能:从第row行 ,第cloum列,把一串字符写入lcd

输入:row cloum p

****************************************

2

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

void lcd1602_string(uchar row,uchar cloum, uchar *p) {

uchar row_flag;

if(row==1) row_flag=0x80; if(row==2) row_flag=0xc0; row_flag=row_flag+cloum; write_lcd1602_com(row_flag); while(1) {

if(*p=='\\0') break;

write_lcd1602_dat(*p); p++; } }

/*********************************************** 名称:lcd_char(uchar row ,uchar cloum,uchar dat) *功能:在lcd的第row行,第cloum列,写入数据dat

*输入:row cloum dat

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

void lcd1602_char(uchar row ,uchar cloum,uchar dat) {

uchar row_flag; if(row==1) {

row_flag=0x80;

write_lcd1602_com(row_flag+cloum); write_lcd1602_dat(dat); }

if(row==2) { row_flag=0xc0;

write_lcd1602_com(row_flag+cloum); write_lcd1602_dat(dat); } }

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

3

void display(void) {

uchar flagdat;

disdata[0]=t_value/1000+0x30;//百位数 disdata[1]=t_value00/100+0x30;//十位数

disdata[2]=t_value0/10+0x30;//个位数 disdata[3]=t_value+0x30;//小数位

if(tflag==0)

flagdat=0x20;//正温度不显示符号 else

flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

disdata[1]=0x20;//如果百位为0,十位为0也不显示 } write_lcd1602_com(0x80); if((mode==1)&&(keep%2==1)) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[5]); write_lcd1602_dat(disdata[4]); }

write_lcd1602_dat('/'); if((mode==2)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[7]); write_lcd1602_dat(disdata[6]); } write_lcd1602_com(0x80+6);

if((mode==3)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[9]); write_lcd1602_dat(disdata[8]); } write_lcd1602_dat(':'); if((mode==4)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[11]); write_lcd1602_dat(disdata[10]); } write_lcd1602_dat(':'); if((mode==5)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[13]); write_lcd1602_dat(disdata[12]); }

lcd1602_char(2,0,flagdat);//显示符号位 lcd1602_char(2,1,disdata[0]);//显示百位 lcd1602_char(2,2,disdata[1]);//显示十位 lcd1602_char(2,3,disdata[2]);//显示个位 lcd1602_char(2,4,0x2e);//显示小数点 lcd1602_char(2,5,disdata[3]);//显示小数位 lcd1602_char(2,6,0xdf); lcd1602_char(2,7,'C'); }

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

void IO_initial(void) //引脚初始化 {

P0 = 0XFF; P1 = 0XFF; P2 = 0XFF; P3 = 0XFF; }

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

void Time_initial(void) //定时计数器初始化 {

ET0 = 1;

TMOD = 0X01; //0000 0001B TL0 = -50000;

TH0 = (-50000)>>8; TR0 = 1; }

//************************************************************** void tiaozheng(void) //时间加减调整 {

if(timebuf[4]==60) timebuf[4]=0; if(timebuf[4]==-1) timebuf[4]=59; if(timebuf[3]==60) timebuf[3]=0; if(timebuf[3]==-1) timebuf[3]=59; if(timebuf[2]==24) timebuf[2]=0; if(timebuf[2]==-1) timebuf[2]=23; if(timebuf[1]==31) timebuf[1]=1; if(timebuf[1]==0) timebuf[1]=30; if(timebuf[0]==13) timebuf[0]=1; if(timebuf[0]==0) timebuf[0]=12; }

4