當前位置:編程學習大全網 - 編程語言 - 基於AT89C51單片機和DS18B20溫度傳感器、LCD1602液晶顯示的高精度數字溫度計程序,用C語言編程

基於AT89C51單片機和DS18B20溫度傳感器、LCD1602液晶顯示的高精度數字溫度計程序,用C語言編程

/***********ds18b20子程序*************************/

/***********ds18b20延遲子函數(晶振12MHz )*******/

#include<reg51.h>

sbit DQ=P1^2;

#define uchar unsigned char

void delay_18B20(unsigned int i)

{

while(i--);

}

/**********ds18b20初始化函數**********************/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ復位

delay_18B20(8); //稍做延時

DQ = 0; //單片機將DQ拉低

delay_18B20(80); //精確延時 大於 480us

DQ = 1; //拉高總線

delay_18B20(4);

x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗

delay_18B20(20);

}

/***********ds18b20讀壹個字節**************/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 給脈沖信號

dat>>=1;

DQ = 1; // 給脈沖信號

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/*************ds18b20寫壹個字節****************/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/**************讀取ds18b20當前溫度************/

ReadTemp(void)

{ float val;

uchar temp_value,value;

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳過讀序號列號的操作

WriteOneChar(0x44); // 啟動溫度轉換

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳過讀序號列號的操作

WriteOneChar(0xBE); //讀取溫度寄存器等(***可讀9個寄存器) 前兩個就是溫度

delay_18B20(100);

a=ReadOneChar(); //讀取溫度值低位

b=ReadOneChar(); //讀取溫度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

value=a&0x0f;

val=temp_value+value;

return(val);

}

以上是DS18B20的驅動程序。然後在主程序中直接調用函數就可以了。

以上是在主程序中的調用,妳看關於溫度的那個就可以。

#include "reg51.h"

#include "18b20.h"

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="Welcome To" ;//初始化日期和星期

uchar code table1[]="Our System!";//初始化時間

uchar code table2[]="Temperature is:";//初始化時間

//以下三個是定義LCD的引腳

sbit lcden=P2^2;

sbit lcdwrite=P2^1;

sbit lcdrs=P2^0;

char wendu;

//延時程序

void delay(uint z)

{ uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//lcd的寫指令

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//lcd的寫數據

void write_data(uchar da)

{ lcdrs=1;

lcden=0;

P0=da;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//初始化

void init()

{

uchar num;

lcdwrite=0;

lcden=0;

write_com(0x38); //16*2顯示,5*7點陣,8位數據

write_com(0x0c);//顯示開,關光標

write_com(0x06); //移動光標

write_com(0x01);//清除LCD的顯示內容

write_com(0x80);

for (num=0;num<10;num++)

{

write_data(table[num]);

delay(5);

}

write_com(0x80+0x40);

for (num=0;num<11;num++)

{

write_data(table1[num]);

delay(5);

}

}

void write_wendu(uchar add, char da)

{

uchar shi,ge;

shi=da/10;

ge=da%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

//主函數

void main ()

{

uchar num;

init();

delay(2000);

delay(2000);

delay(2000);

write_com(0x01);//清除LCD的顯示內容

while(1)

{

write_com(0x80);

for (num=0;num<15;num++)

{

write_data(table2[num]);

delay(5);

}

wendu = ReadTemp( );

write_wendu(2,wendu);

}

}

  • 上一篇:對講機出現故障後的簡單處理方法
  • 下一篇:誰有各大高校的課堂視頻教程的網址的?j2me視頻教程那裏有?
  • copyright 2024編程學習大全網