STC51单片机26——串口发送DS18B20温度值
#include<reg51.h>
#define uchar unsigned char?????????????????????? ?
#define uint unsigned int
sbit DQ = P2^0;//定義ds18B20總線IO
?//發(fā)送數(shù)據(jù)
?void tmpDelay(int num)//延時(shí)函數(shù)
{
?? ?while(num--) ;
}
void Send(unsigned char dat)
{
?? SBUF=dat;
?? while(TI==0)?? ??? ? //等待發(fā)送完畢
????? ;
??? TI=0;
?? ?//tmpDelay(1000);
}
? void wendu_init()
? {
?? TMOD=0x20;? //定時(shí)器T1工作于方式2 ,八位自動(dòng)重裝
?? SCON=0x50;? //SCON=0101 0000B,串口工作方式1,允許接收(REN=1)
?? PCON=0x00;? //PCON=0000 0000B,波特率2400
?? TH1=0xF3 ;? //根據(jù)規(guī)定給定時(shí)器T1賦初值
?? TL1=0x00;? //根據(jù)規(guī)定給定時(shí)器T1賦初值???? ?
?? TR1=1;??? //啟動(dòng)定時(shí)器T1? ?
?? REN=1;??? //允許接收
? }
//溫度采集模塊?? ?
/******************************************************************************/
void Init_DS18B20()//初始化ds1820
{
?? ?unsigned char x=0;
?? ?DQ = 1;??? //DQ復(fù)位
?? ?tmpDelay(8);? //稍做延時(shí)
?? ?DQ = 0;??? //單片機(jī)將DQ拉低
?? ?tmpDelay(80); //精確延時(shí) 大于 480us
?? ?DQ = 1;??? //拉高總線
?? ?tmpDelay(14);
?? ?x=DQ;????? //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
?? ?tmpDelay(20);
}
?? unsigned char ReadOneChar()//讀一個(gè)字節(jié)
{
?? ?unsigned char i=0;
?? ?unsigned char dat = 0;
?? ?for (i=8;i>0;i--)
?? ?{
?? ??? ?DQ = 0; // 給脈沖信號(hào)
?? ??? ?dat>>=1;
?? ??? ?DQ = 1; // 給脈沖信號(hào)
?? ??? ?if(DQ)
?? ??? ?dat|=0x80;
?? ??? ?tmpDelay(4);
?? ?}
?? ?return(dat);
}
void WriteOneChar(unsigned char dat)//寫(xiě)一個(gè)字節(jié)
{
?? ?unsigned char i=0;
?? ?for (i=8; i>0; i--)
?? ?{
?? ??? ?DQ = 0;
?? ??? ?DQ = dat&0x01;
?? ??? ?tmpDelay(5);
?? ??? ?DQ = 1;
?? ??? ?dat>>=1;
?? ?}
}
?unsigned int Readtemp()//讀取溫度
{
?? ?unsigned char a=0;
?? ?unsigned char b=0;
?? ?unsigned int t=0;
?? ?float tt=0;?? ?
?? ?Init_DS18B20();
?? ?WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
?? ?WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
?? ?Init_DS18B20();
?? ?WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
?? ?WriteOneChar(0xBE); //讀取溫度寄存器
?? ?a=ReadOneChar();?? //連續(xù)讀兩個(gè)字節(jié)數(shù)據(jù)?? //讀低8位
?? ?b=ReadOneChar();????????????????????????? //讀高8位
?? ?t=b;
?? ?t<<=8;
?? ?t=t|a; //兩字節(jié)合成一個(gè)整型變量。
?? ?tt=t*0.0625;? //得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20可以精確到0.0625度,所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度
?? ?t= tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時(shí)進(jìn)行一個(gè)四舍五入操作。
?? ?return(t);
}
void display()
{
?? ?unsigned int num ;?????????????????? //定義的時(shí)候用uchar宏定義就會(huì)出錯(cuò)
?? ?unsigned char shi,ge,xiaoshu;?? ???? //這里的num,shi,ge,xiaoshu 必須用unsigned int無(wú)符號(hào)整數(shù)來(lái)表示,用unshigned char? 字符型則顯示錯(cuò)誤
?? ?num=Readtemp();
?? ?shi=num/100+48;
?? ?ge=num/10%10+48;
?? ?xiaoshu=num%10+48;
?? ?Send(shi);
?? ?Send(ge);
?? ?Send('.');
?? ?Send(xiaoshu);
}
void main()
{?? ?
?? wendu_init();
?? REN=0;?? ??? ?? //禁止接受數(shù)據(jù)
?? while(1)
?? ?{
?? ??? ?display();
?? ??? ?tmpDelay(65000);
?? ??? ?tmpDelay(65000);
?? ?}
}
完整資料打包(含仿真):
STC51單片機(jī)26-串口發(fā)送DS18B20溫度值資源-單片機(jī)文檔類(lèi)資源-CSDN下載
總結(jié)
以上是生活随笔為你收集整理的STC51单片机26——串口发送DS18B20温度值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue 响应拦截器不起作用
- 下一篇: 四种排序:选择,插入,冒泡,快速排序原理