DS18B20.png (30.75 KB, 下載次數: 100)
下載附件
2013-8-30 21:59 上傳
這是我開發板DS18B20的原理圖,可以接兩路DS18B20,我現在只插了一個,另一個空著
現在把這個DS12B20空著對寫程序有影響嗎?搞一個程序發現怎么搞都不對
程序如下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void Init_LCD1602(void);
void WriteCommandLCD(uchar Cmd);
void WriteDataLCD(uchar Data);
void delayms(uint x);
sbit DQ = P3^2;
sbit Buzz = P1^6;
bit status;
//聲明待顯示內容
uchar data Word1[] = {"DS18B20 IS OK!!!"};
uchar data Word2[] = {"TEMP: . "};
uchar data Word3[] = {"DS18B20 IS FAULT"};
uchar data Word4[] = {"PLEASE CHECK!!! "};
uchar Temp_Value[] = {0x00,0x00};
uchar Display_Digit[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//溫度字符數組
uchar code CGRAM_CODE[] = {0x08,0x14,0x08,0x00,0x00,0x00,0x00,0x00};
//延時函數_us級別
void Delay(uint x)
{
while(--x);
}
//LCD1602自定義符號函數
void WriteCGRAM(void)
{
uchar j;
WriteCommandLCD(0x40); //寫CGRAM
for(j = 0; j < 8; j ++)
{
WriteDataLCD(CGRAM_CODE[j]);
}
}
//初始化DS18B20函數
bit Init_DS18B20(void)
{
DQ = 1; Delay(1);
DQ = 0; Delay(60);
DQ = 1; Delay(5);
status = DQ;
while(!DQ); //等待DQ變為高電平
return status;
}
//寫字節函數
void WriteOneByte(uchar dat)
{
uchar i;
DQ = 1; Delay(1);
for(i = 0; i < 8; i ++)
{
DQ = 0; Delay(1); //1101 1101 & 0x01
DQ = dat & 0x01;
Delay(5); //DS18B20采樣DQ線
DQ = 1;
dat >>= 1;
}
}
//讀字節函數
uchar ReadOneByte(void)
{
uchar i, dat = 0x00;
DQ = 1; Delay(1);
for(i = 0; i < 8; i ++)
{
DQ = 0; _nop_();
dat >>= 1; //高位放入0
DQ = 1; _nop_();
if(DQ)
{
dat |= 0x80; //高位放入1
}
Delay(8);
DQ = 1;
}
return dat;
}
//讀取溫度值函數
void Read_Temperature(void)
{
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
Temp_Value[0] = ReadOneByte(); //溫度低8位
Temp_Value[1] = ReadOneByte(); //溫度高8位
}
//LCD1602顯示當前溫度值函數
void Display_Temperature(void)
{
uchar i,ng = 0;
uint Temp;
ulong Current;
if((Temp_Value[1] & 0xF8) == 0xF8)
{
if(Temp_Value[0] == 0) //有進制
{
Temp_Value[1] = ~Temp_Value[1] + 1;
}
else //沒有進制
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0] + 1;
}
ng = 1;
}
Temp = ((uint)Temp_Value[1]) << 8; //強制性轉換成16位,并且移至高8位
Current = (Temp + (uint)Temp_Value[0]) * 0.0625 * 10000; //1250000
Display_Digit[6] = Current / 1000000; //百位
Display_Digit[5] = Current % 1000000 / 100000; //十位
Display_Digit[4] = Current % 100000 / 10000; //個位
Display_Digit[3] = Current % 10000 / 1000; //1位小數點
Display_Digit[2] = Current % 1000 / 100; //2位小數點
Display_Digit[1] = Current % 100 / 10; //3位小數點
Display_Digit[0] = Current % 10; //4位小數點
//顯示在LCD上的位置
Word2[6] = Display_Digit[6] + '0'; //百位
Word2[7] = Display_Digit[5] + '0'; //十位
Word2[8] = Display_Digit[4] + '0'; //個位
Word2[10] = Display_Digit[3] + '0'; //1位小數點
Word2[11] = Display_Digit[2] + '0'; //2位小數點
Word2[12] = Display_Digit[1] + '0'; //3位小數點
Word2[13] = Display_Digit[0] + '0'; //4位小數點
if(Display_Digit[6] == 0) Word2[6] = ' '; //百位為0不顯示
if(Display_Digit[6] == 0 && Display_Digit[5] == 0) Word2[7] = ' ';//十位為0且百位為0,十位不顯示
if(ng) //讓“-”顯示在適當位置 -15 -8
{
if(Word2[7] == ' ')
Word2[7] = '-';
else
Word2[6] = '-';
}
//在第一行里顯示標題
WriteCommandLCD(0x80);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word1);
}
//在第二行顯示當前溫度值
WriteCommandLCD(0xC0);
for(i = 0; i < 14; i ++)
{
WriteDataLCD(Word2); // 125.0000℃
}
//顯示溫度符號
WriteCGRAM();
WriteCommandLCD(0xCE); WriteDataLCD(0x00); //顯示°符號
WriteCommandLCD(0xCF); WriteDataLCD('C'); //顯示C符號
}
//顯示故障信息函數
void Display_Fault(void)
{
uchar i;
WriteCommandLCD(0x80);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word3);
}
WriteCommandLCD(0xC0);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word4);
}
}
//蜂鳴器發音函數
void Pulse_Buzz(void)
{
uint i;
for(i = 0; i < 100; i ++)
{
Buzz = ~Buzz;
delayms(1);
}
Buzz = 1;
delayms(80);
}
//主函數
void main(void)
{
Init_LCD1602();
Init_DS18B20();
while(1)
{
if(status == 0)
{
Read_Temperature();
Display_Temperature();
}
else
{
Init_DS18B20();
Display_Fault();
Pulse_Buzz();
}
}
}
還有一個1602.c的文件就不發了吧,免得大家看著暈
這個程序的主要功能是 先開機檢測 DS18B20是否能初始化,如果能,則1602第一行 顯示DS18B20 IS OK!!!,第二行顯示溫度,檢測的一句是 bit Init_DS18B20(void) 函數的返回值是否為0,0表示正常
如果DS18B20不能初始化則顯示DS18B20 IS FAULT PLEASE CHECK!!!
這個程序應該沒問題別人用普通開發板只有一路DS18B20的好用,到我這里就不好用了,求大神告訴為什么
|