藍橋杯微控制器實訓版學習周總結1-溫度感測器DS18B20
阿新 • • 發佈:2021-01-22
#include<reg51.h>
#include<stdio.h>
#include<math.h>
//#include"onewire.c"
//#include"onewire.h"
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe
//IC引腳定義
sbit DQ = P1^4;
//函式宣告
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};//0~9 滅 橫槓
unsigned char dspbuft[]={10,10,10,10,10,10,10,12};
//unsigned char dspcom=0;
//單匯流排延時函式
void Delay_OneWire(unsigned int t)
{
char z;
while (t--)
for(z=0;z<6;z++);
}
//DS18B20晶片初始化
bit Init_DS18B20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
//通過單匯流排向DS18B20寫一個位元組
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//從DS18B20讀取一個位元組
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
int read()
{
unsigned char low,high;
int temp;
Init_DS18B20(); //初始化
Write_DS18B20(OW_SKIP_ROM); //跳過ROM 0XCC
Write_DS18B20(DS18B20_CONVERT); //傳送溫度轉換命令 0X44
Delay_OneWire(200); //適當延時
Init_DS18B20(); //初始化
Write_DS18B20(OW_SKIP_ROM); //跳過ROM 0XCC
Write_DS18B20(DS18B20_READ); //傳送讀暫存器命令 0XBE
low=Read_DS18B20(); //分別讀高位和低位
high=Read_DS18B20();
temp=((high<<4)|(low>>4)); //temp取二進位制
temp=temp*0.0625*10; //二進位制轉化為十進位制數
return temp;
}
void Delay5ms() //@12.000MHz
{
unsigned char a,b;
for(a=19;a>0;a--)
for(b=130;b>0;b--);
}
void NO_buzzrelay()
{
P2&=0x1f;
P2|=0xa0;
P0&=0xaf;
P2&=0x1f;
}
void main()
{
NO_buzzrelay();
while(1)
{
display(read());
}
}
PS:注意底層驅動的更改。