资讯详情

C51--DS18B20数字温度计--C语言

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int #define uchar unsigned char

sbit DQ=P2^6;

sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit lcden=P1^2;

void disp(uint a); void init(void);

void delay(uint i);

uchar ds18b20_init(void);

void write_byte(uchar byte);

uchar read_byte(void);

uint read_ds18b20(void);

void delay50us(void);

void delayms(uint a);

void lcd1602_wr_com(uchar com);

void lcd1602_wr_data(uchar dat);

void lcd_init(void);

uchar code str[]="temperature";

void main(void) { init(); while(1) { disp(read_ds18b20()); delayms(50); } }

void init(void) { uchar i; lcd_init(); lcd1602_wr_com(0x80+0x02); //显示的地址 for(i=0;i<11;i++) { lcd1602_wr_data(str[i]); delayms(2); } }

void disp(uint a) { uchar bai,ge,shi,dp,symbol; uint b; b=a&0x8000; if(b==0x8000) //负温度 { a&=0x7fff; //将最高位置0 symbol=0x2d; //符号为“-” } else symbol=0x2b; //符号为“+” bai=a/1000+0x30; shi=a00/100+0x30; ge=a0/10+0x30; dp=a+0x30; if(bai==0x30) { bai=0x20; //如果百位为0,不显示 if(shi==0x30)shi=0x20; //如果百位为零,十位也为0,不显示 } lcd1602_wr_com(0x80+0x43); lcd1602_wr_data(symbol); delayms(2); lcd1602_wr_data(bai); delayms(2); lcd1602_wr_data(shi); delayms(2); lcd1602_wr_data(ge); delayms(2); lcd1602_wr_data(0x2e); delayms(2); lcd1602_wr_data(dp); delayms(2); lcd1602_wr_data(0xdf); delayms(2); lcd1602_wr_data(0x43); delayms(2); }

void delay(uint i) { while(i--); } uchar ds18b20_init(void) { uchar n; DQ=1; //初始化时序从高到低,因此先置高 delay(4); //延时等待稳定 DQ=0; //拉低 delay(60); //延时大约500us DQ=1; //主机放开 delay(6); //延时15~60us n=DQ; //读信号线状态,如为低,则说明线上有设备,否则说明没有或坏了 delay(6); return n; } void write_byte(uchar byte) { uchar i; for(i=0;i<8;i++) { DQ=0; //复位信号线 DQ=byte&0x01; //低位开始写入,0继续拉低信号线,1则被拉高 delay(5); //延时大约45us左右,等待设备采样数据 byte>>=1; //右移一位 DQ=1; } delay(4); } uchar read_byte(void) { uchar i,temp; for(i=0;i<8;i++) { DQ=0; temp>>=1; //右移一位 DQ=1; //主机释放信号线 _nop_(); if(DQ)temp|=0x80; //将读出数据放在最高位,如果是0,信号线会设备继续拉低,1则为高 delay(4);

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台