亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
用單片機+LCD1602采集溫度數據(DS18B20傳感器)
[打印本頁]
作者:
李敏兒oc
時間:
2020-3-8 11:56
標題:
用單片機+LCD1602采集溫度數據(DS18B20傳感器)
51單片機視頻教程中,是用數碼管來顯示溫度的,這里用LCD1602來顯示數據,效果圖如下
_1UA(U81828XJM7U]~L~YQE.jpg
(159.58 KB, 下載次數: 42)
下載附件
2020-3-8 11:44 上傳
下面是代碼,采用模塊化編程,分成LCD1602和DS18B20兩個模塊,在LCD1602的程序中調用DS18B20的讀取溫度數據,主函數中調用LCD1602的顯示數據,從而顯示溫度
1.主函數代碼
#include "reg52.h"
#include "lcd1602.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
void main()
{
LcdDisp();
while(1);
}
復制代碼
2.LCD1602代碼
#include "lcd1602.h"
#include "ds18b20.h"
extern u8 Tempdata[9]; //聲明ds18b20中保存溫度數據的數組,擴展使用范圍
void Lcd1602_Delay1ms(u8 c) //誤差 0us
{
u8 a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Lcd1602WriteCom(u8 com) //寫命令函數
{
LCD_E=0;
LCD_RS=0; //寫命令,RS=0
LCD_RW=0;
LCD_DATAPIN=com;
Lcd1602_Delay1ms(1);
LCD_E=1;
Lcd1602_Delay1ms(5);
LCD_E=0;
}
void Lcd1602WriteDat(u8 dat) //寫數據函數
{
LCD_E=0;
LCD_RS=1; //寫數據,RS=1
LCD_RW=0;
LCD_DATAPIN=dat;
Lcd1602_Delay1ms(1);
LCD_E=1;
Lcd1602_Delay1ms(5);
LCD_E=0;
}
void LcdInit() //初始化函數
{
Lcd1602WriteCom(0x38); //功能設置指令,總線8位,顯示2行,5x7點陣每個字符
Lcd1602WriteCom(0x0c); //顯示開關控制指令,顯示功能開,無光標
Lcd1602WriteCom(0x06); //模式設置指令,寫入新數據后光標右移,顯示屏不移動
Lcd1602WriteCom(0x01); //清屏指令
Lcd1602WriteCom(0x47+0x80); //寫入第二行倒數第八個位置
}
void LcdDisp() //顯示函數
{
u8 i;
LcdInit(); //LCD初始化
tempdatapros(Tempdata); //讀取溫度數據,存入數組中
for(i=0;i<9;i++)
{
Lcd1602WriteDat(Tempdata[i]);
}
}
復制代碼
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include "reg52.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
#define LCD_DATAPIN P0 //定義數據口
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void LcdDisp();
復制代碼
3.DS18B20代碼
#include "ds18b20.h"
u16 temp;
u8 Tempdata[9];
void delay1ms(u8 y) //延時函數,延時y毫秒
{
u8 x;
for(;y>0;y--)
for(x=110;x>0;x--);
}
u8 ds18b20Init() //溫度傳感器初始化函數
{
u8 i;
DSPORT=0;
i=60;while(i--); //約延時600us
DSPORT=1;
while(DSPORT)
{
i++;
if(i>6)
return 0; //初始化失敗
}
return 1; //初始化成功
}
u8 Ds18b20Read() //從DS18B20中讀數據
{
u8 dat=0,bi;
u8 i,j=0;
for(i=0;i<8;i++)
{
DSPORT=0;
j++;
DSPORT=1;
j++;
dat>>=1;
bi=DSPORT;
dat|=(bi<<7);
j=5;while(j--);
}
return dat;
}
void Ds18b30Write(u8 dat) //將數據寫入DS18B20
{
u8 i,j=0;
for(i=0;i<8;i++)
{
DSPORT=0;
j++;
DSPORT=dat<<7;
j=6;while(j--);
DSPORT=1;
dat>>=1;
}
}
void Ds18b20TempConvert() //溫度轉換函數
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //發送跳過ROM指令
Ds18b30Write(0x44); //發送溫度轉換指令
}
void Ds18b20ReadTempCom() //發送讀暫存器指令
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //發送跳過ROM指令
Ds18b30Write(0xbe); //發送讀暫存器指令
}
void Ds18b20ReadTemp() //讀溫度存到temp中
{
u8 th,tl;
Ds18b20TempConvert();
Ds18b20ReadTempCom();
tl=Ds18b20Read();
th=Ds18b20Read();
temp=th<<8;
temp=temp|tl;
if(temp<0)
{
Tempdata[0]='-'; //若溫度為負值,前面加負號
temp=~(temp-1);
temp=temp*0.0625*100+0.5;
}
else
{
Tempdata[0]=' '; // 溫度為正值,前面無符號,顯示空格
temp=temp*0.0625*100+0.5;
}
}
void tempdatapros(u8 Tempdata[]) //將讀取的溫度temp處理,放入數組中
{
Ds18b20ReadTemp();
/*數據位加‘0’,使數字轉化為相應字符*/
Tempdata[1]=temp/10000+'0'; //百位
Tempdata[2]=temp/100%100/10+'0'; //十位
Tempdata[3]=temp/100%10+'0'; //個位
Tempdata[4]='.'; //小數點
Tempdata[5]=temp/10%10+'0'; //小數點后第一位
Tempdata[6]=temp%10+'0'; //小數點后第二位
Tempdata[7]=0xdf; //溫度單位,攝氏度的‘。’
Tempdata[8]='C';
if(Tempdata[1]=='0') //如果溫度百位為0,顯示空格
Tempdata[1]=' ';
}
復制代碼
#ifndef __ds18b20_H_
#define __ds18b20_H_
#include "reg52.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
sbit DSPORT=P3^7; //定義數據管腳
void tempdatapros(u8 Tempdata[]);
#endif
復制代碼
這個程序的缺點是不能實時更新溫度數值,可以加中斷函數或者其它函數來設定隔多長時間更新一次
歡迎大家在此基礎上創
全部資料51hei下載地址:
LCD1602 DS18B20.zip
(36.4 KB, 下載次數: 78)
2020-3-8 11:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
7778882
時間:
2021-7-1 09:50
嗚嗚嗚太有用了 感謝大神
作者:
hs1111
時間:
2021-7-2 20:08
有沒有實時溫度顯示
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1