本設(shè)計基于51單片機的多路溫度檢測調(diào)節(jié)串口傳輸系統(tǒng)(仿真+源碼+視頻講解)
仿真:proteus8.9
程序編譯器:keil 4
編程語言:C語言
編號C0009
【騰訊文檔】C0009 網(wǎng)盤鏈接
資料下載鏈接
功能說明:
1、采用四個DS18B20溫度傳感器測溫并用LCD1602顯示四路溫度值;
2、按鍵為設(shè)置按鍵、加鍵和減鍵,可設(shè)置上下限溫度控制范圍;
3、當(dāng)每路溫度值超過設(shè)定的上或下限時,相應(yīng)的指示燈亮;
4、當(dāng)平均溫度值超過設(shè)定的上限時,繼電器吸合,風(fēng)扇轉(zhuǎn)動表示降溫;
5、當(dāng)平均溫度值低于設(shè)定的下限時,繼電器吸合,加熱膜工作表示升溫;
6、利用串口傳輸模塊實時將平均溫度值發(fā)送到串口調(diào)試助手。
仿真圖(提供源文件):
源程序(提供源文件):
unsigned char ReadOneChar1(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ1 = 0; // 給脈沖信號
dat>>=1;
DQ1 = 1; // 給脈沖信號
if(DQ1)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
void WriteOneChar1(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ1 = 0;
DQ1 = dat&0x01;
Delay_DS18B20(5);
DQ1 = 1;
dat>>=1;
}
}
/*****讀取溫度*****/
unsigned int ReadTemperature1(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init1_DS18B20();
WriteOneChar1(0xCC); //跳過讀序號列號的操作
WriteOneChar1(0x44); //啟動溫度轉(zhuǎn)換
Init1_DS18B20();
WriteOneChar1(0xCC); //跳過讀序號列號的操作
WriteOneChar1(0xBE); //讀取溫度寄存器
a=ReadOneChar1(); //讀低8位
b=ReadOneChar1(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
// t= tt*10+0.5; //放大10倍輸出并四舍五入
t= tt*10+0.5;
return(t);
}
/*****初始化DS18B20 溫度傳感器3*****/
void Init2_DS18B20(void)
{
unsigned char x=0;
DQ2 = 1; //DQ復(fù)位
Delay_DS18B20(8); //稍做延時
DQ2 = 0; //單片機將DQ拉低
Delay_DS18B20(80); //精確延時,大于480us
DQ2 = 1; //拉高總線
Delay_DS18B20(14);
x = DQ2; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
Delay_DS18B20(20);
}
unsigned char ReadOneChar2(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ2 = 0; // 給脈沖信號
dat>>=1;
DQ2 = 1; // 給脈沖信號
if(DQ2)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
void WriteOneChar2(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ2 = 0;
DQ2 = dat&0x01;
Delay_DS18B20(5);
DQ2 = 1;
dat>>=1;
}
}
/*****讀取溫度*****/
unsigned int ReadTemperature2(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init2_DS18B20();
WriteOneChar2(0xCC); //跳過讀序號列號的操作
WriteOneChar2(0x44); //啟動溫度轉(zhuǎn)換
Init2_DS18B20();
WriteOneChar2(0xCC); //跳過讀序號列號的操作
WriteOneChar2(0xBE); //讀取溫度寄存器
a=ReadOneChar2(); //讀低8位
b=ReadOneChar2(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
// t= tt*10+0.5; //放大10倍輸出并四舍五入
t= tt*10+0.5;
return(t);
}
資料清單如下: