基于AT89C52的溫度控制系統
- 一、DS18B20傳感器相關介紹
- DS18B20特性
- 封裝形式與引腳說明
- 供電方式(外部電源供電、寄生電源供電、寄生電源強上拉)
- DS18B20指令(ROM指令操作)
- DS18B20程式代碼
- 二、LCD1602顯示溫度
- 介面信號說明
- 基本操作步驟與時序
- 初始化程序
- LCD1602程式代碼
- 三、溫控系統PID
- 四、專案展示
一、DS18B20傳感器相關介紹
DS18B20特性
- 獨特的單總線介面,就需一條線則可實作雙向通信(測溫)
- 測溫范圍:-55℃~+125℃,可通過編程設定9—12位解析度,對應分辨溫度分別為0.5、0.25、0.125、0.0625℃,
- 支持多點組網(可連接多個DS18B20溫度傳感器),多個DS18B20可以并聯(3或2線)實作多個組網測溫,但注意超過8個要解決好供電問題,否則電壓過低會導致傳輸不穩定,從而資料不準確,
- 作業電壓:3.0~5.5V (寄生電源方式下可由資料線供電)
- 在使用程序中不需要外圍電路,全部傳感元件及轉換電路都在芯片內了,(上拉電阻)
- 測溫結果直接是數字量輸出,單總線串行傳送方式,同時可傳送CRC校驗碼(校驗資料采集是否正確),具有極強的抗干擾和糾錯能力,
- 在9位解析度時最多在93.75ms內把溫度轉換為數字,12位解析度時最多在750ms內把溫度值轉換為數字,
- 負壓特性:電源極性接反時,芯片不會因發熱而啥訓, 但不能正常作業,
封裝形式與引腳說明

供電方式(外部電源供電、寄生電源供電、寄生電源強上拉)



DS18B20指令(ROM指令操作)
| 序號 | 指令 | 代碼 | 說明 |
|---|---|---|---|
| 1 | 讀取ROM | 33H | 讀DS18B20的64位序列號(只能適用于總線上只有一個DS18B20) |
| 2 | 寫暫存器 | 4EH | 在該寫暫存器指令后向DS18B20的暫存器TH.TL以及配置暫存器中寫入資料, |
| 3 | 讀暫存器 | BEH | 發送該指令后DS18B20將從一個位元組開始,依次送出9個位元組的內容,如果不想讀完所有位元組,控制器可以在任何時間發出復位指令中止讀取或直接不讀取, |
| 4 | 復制暫存器 | 48H | 將TH.TL和配置暫存器的內容拷貝到EEPROM中,如果使用寄生電源,總線控制器必須在這條指令發出后10us內啟動強上拉并保持至少10ms時間, |
| 5 | 啟動溫度轉換指令 | 44H | 溫度轉換完成后存放在第1個和第2個位元組中,如果是寄生電源,總線必須在發出這條指令后的10us內啟動強上拉, |
| 6 | 復制EEPROM指令 | B8H | 把TH.TL和配置暫存器的值拷貝回暫存器,這種拷貝操作在DS18B20上電時自動執行,上電后,暫存器里就存了有效資料, |
| 7 | 讀供電方式指令 | B4H | 發給DS18B20后,再發出讀時間間隙,后回傳電源模式:0為寄生電源、1為外部電源, |
DS18B20程式代碼
/********************************************
******************DS18B20********************
*********************************************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
void ds1820rst(void) //DS18B20復位
{
unsigned char x=0;
DS = 1; //DQ復位
delay_18B20(4); //延時
DS = 0; //DQ拉低
TR0=0;
delay_18B20(100); //精確延時大于
TR0=1;
DS = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd(void)//讀資料
{
unsigned char i=0;
unsigned char dat = 0;
TR0=0;
for (i=8;i>0;i--)
{
DS = 0; //給脈沖信號
dat>>=1;
DS = 1; //給脈沖信號
if(DS)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)//寫資料
{
unsigned char i=0;
TR0=0;
for (i=8; i>0; i--)
{
DS = 0;
DS = wdata&0x01;
delay_18B20(10);
DS = 1;
wdata>>=1;
}
}
uint get_temper()//獲取溫度
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//跳過讀序列號
ds1820wr(0x44);//啟動溫度轉換
ds1820rst();
ds1820wr(0xcc);//跳過讀序列號
ds1820wr(0xbe);//讀取溫度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
TR0=1;
if(tvalue<0x0fff) tflag=0;
else {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
temp=tvalue;
return temp;
}
void dis_temp(int t)//顯示溫度
{
uchar d0,d1,d2,d3;
if(tflag==0)
{
d0=t/1000+0x30;//百位
d1=t%1000/100+0x30;//十位
d2=t%100/10+0x30;//個位
d3=t%10+0x30;//小數位
if(d0==0x30)
{
wr_com(0x80+10);
wr_data(d1);
wr_com(0x80+11);
wr_data(d2);
wr_com(0x80+12);
wr_data(0x2e);
wr_com(0x80+13);
wr_data(d3);
}
else
{
wr_com(0x80+10);
wr_data(d0);
wr_com(0x80+11);
wr_data(d1);
wr_com(0x80+12);
wr_data(d2);
wr_com(0x80+13);
wr_data(' ');
}
}
else
{
wr_com(0x80+10);
wr_data('-');
wr_com(0x80+11);
wr_data(d1);
wr_com(0x80+12);
wr_data(d2);
wr_com(0x80+13);
wr_data(' ');
}
wr_com(0x80+14); //攝氏度符號
wr_data(0xdf);
temper=t/10;
}
二、LCD1602顯示溫度
介面信號說明

基本操作步驟與時序


初始化程序
延時15ms
寫指令38H(不檢測忙信號)
延時5ms
寫指令38H(不檢測忙信號)
延時5ms
寫指令38H(不檢測忙信號)
(以后每次寫指令,讀/寫資料操作之前均需檢測忙信號) 寫指令38H:顯示模式設定
寫指令08H:顯示關閉
寫指令01H:顯示清屏
寫指令06H:顯示游標移動設定
寫指令0CH:顯示開及游標設定
LCD1602程式代碼
/********************************************
******************LCD1602********************
*********************************************/
void delay(i)//延時函式
{
uint j;
for(i;i>0;i--)
for(j=110;j>0;j--);
}
void wr_com(uchar ml)//LCD液晶寫命令
{
lcdrs=0; //暫存器低電平選擇指令暫存器
P0=ml;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void wr_data(uchar shuju)//LCD液晶寫資料
{
lcdrs=1;
P0=shuju;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //按照時序操作的初始化
{
lcdrw=0; //低電平為寫操作
wr_com(0x38);//顯示模式設定,設定為16*2顯示,5*7點陣,八位資料口
wr_com(0x0c);//開顯示,但不開游標,游標不閃
wr_com(0x06);//顯示游標移動設定
wr_com(0x01);// 清屏
wr_com(0x80);// 資料指標初始化
for(num=0;num<16;num++)
{
wr_data(str1[num]);//實際溫度
}
wr_com(0x80+0x40); //地址初始化
for(num=0;num<16;num++)
{
wr_data(str2[num]);//設定溫度
}
}
三、溫控系統PID
void PIDInit (struct PID *p)
{
memset ( p,0,sizeof(struct PID)); //用引數0初始化p
}
unsigned int PIDCalc( struct PID *p, unsigned int NextPoint ) //PID計算
{
unsigned int dError,Error;
Error = p->SetPoint - NextPoint; // 偏差
p->SumError += Error; // 積分
dError = p->LastError - p->PrevError; // 當前微分
p->PrevError = p->LastError;
p->LastError = Error;
return (p->Proportion * Error//比例
+ p->Integral * p->SumError //積分項
+ p->Derivative * dError); // 微分項
}
四、專案展示

基于單片機AT89C52的溫控系統代碼
以上就是系統的代碼,也可以留言找我發郵箱哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264564.html
標籤:其他
下一篇:抖音為什么這么火
