单片机DS18B20数字温度计课程设计报告 下载本文

void delay(uint i);

sbit DQ =P0^0; //DS18B20端口 sbit RS=P2^0; //LCD端口 sbit RW=P2^1; sbit E=P2^2;

sbit buzzer=P2^7; //定义蜂鸣器端口

union{ uchar c[2]; uint x; }temp; //联合体

uchar flag; //定义温度正负值标志变量,正为'0',负为'1' int cc,xs;

/***************************************************************/ /*延时函数 */

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

void delay(uint i) { for(;i>0;i--); }

/***************************************************************/ /*复位函数 */

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

uchar ow_reset(void) { uchar reset; DQ=0; delay(50); DQ=1; delay(3); reset=DQ; delay(25); return(reset); }

/***************************************************************/ /*初始化DS18B20 */

17

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

void initds18b20(void) {

ow_reset(); // write_byte(0xCC); write_byte(0x4E); write_byte(0x00); write_byte(0x00); write_byte(0x7F); }

/***************************************************************/ /*从单总线读取一个字节 */ /***************************************************************/ uchar read_byte(void) { uchar i; uchar value=0; for (i=8;i>0;i--) { value>>=1; DQ=0; DQ=1; delay(1); if(DQ)value|=0x80; delay(6); } return(value); }

/***************************************************************/ /**向单总线上写一个字节 */

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

void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=0; DQ=val&0x01; delay(5); DQ=1; val=val/2;

18

} delay(5); }

/***************************************************************/ /**读取温度 */

/***************************************************************/ void Read_Temperature(void) { ow_reset(); write_byte(0xCC); write_byte(0x44); ow_reset(); write_byte(0xCC); write_byte(0xBE); temp.c[1]=read_byte(); temp.c[0]=read_byte(); }

/***************************************************************/ /**温度转换 */

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

void temperature_cov(void) {

if (temp.c[0]>0xF8) //判断温度是正数还是负数 { flag=1; //温度为负数flag置1 temp.x=~temp.x+1; } xs=temp.x&0x0F; xs=xs*10; cc=temp.c[0]*256.0+temp.c[1]; //将温度从两个八位数表示成一个十六位数 cc=cc*0.0625; xs=xs*0.0625; }

/***************************************************************/ /**显示 */

/***************************************************************/ void display()

19

{ int i; // SP=0x50; // lcd_init(); lcd_wcmd(0x80); //写入缓冲区起始地址为第一行第一列 lcd_wdat(0x54); //显示TEMPERATURE lcd_wdat(0x45); lcd_wdat(0x4d); lcd_wdat(0x50); lcd_wdat(0x45); lcd_wdat(0x52); lcd_wdat(0x41); lcd_wdat(0x54); lcd_wdat(0x55); lcd_wdat(0x52); lcd_wdat(0x45); lcd_wcmd(0xc0); lcd_wdat(0x44);lcd_wdat(0x51);lcd_wdat(0x59); lcd_wdat(0x20); buzzer=1; lcd_wcmd(0x8C); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wcmd(0xc4); if(flag == 1) { lcd_wdat(0x2d); //如果flag为1表示温度为负值,显示‘-’符号 if(cc>=4) { buzzer = 0; lcd_wcmd(0x8C); lcd_wdat(0x4C); lcd_wdat(0x4F); lcd_wdat(0x57); lcd_wdat(0x21); lcd_wcmd(0xc4); } } if(cc>=29) { buzzer=0;

20