欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
用單片機(jī)+LCD1602采集溫度數(shù)據(jù)(DS18B20傳感器)
[打印本頁(yè)]
作者:
李敏兒oc
時(shí)間:
2020-3-8 11:56
標(biāo)題:
用單片機(jī)+LCD1602采集溫度數(shù)據(jù)(DS18B20傳感器)
51單片機(jī)視頻教程中,是用數(shù)碼管來(lái)顯示溫度的,這里用LCD1602來(lái)顯示數(shù)據(jù),效果圖如下
_1UA(U81828XJM7U]~L~YQE.jpg
(159.58 KB, 下載次數(shù): 42)
下載附件
2020-3-8 11:44 上傳
下面是代碼,采用模塊化編程,分成LCD1602和DS18B20兩個(gè)模塊,在LCD1602的程序中調(diào)用DS18B20的讀取溫度數(shù)據(jù),主函數(shù)中調(diào)用LCD1602的顯示數(shù)據(jù),從而顯示溫度
1.主函數(shù)代碼
#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);
}
復(fù)制代碼
2.LCD1602代碼
#include "lcd1602.h"
#include "ds18b20.h"
extern u8 Tempdata[9]; //聲明ds18b20中保存溫度數(shù)據(jù)的數(shù)組,擴(kuò)展使用范圍
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) //寫命令函數(shù)
{
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) //寫數(shù)據(jù)函數(shù)
{
LCD_E=0;
LCD_RS=1; //寫數(shù)據(jù),RS=1
LCD_RW=0;
LCD_DATAPIN=dat;
Lcd1602_Delay1ms(1);
LCD_E=1;
Lcd1602_Delay1ms(5);
LCD_E=0;
}
void LcdInit() //初始化函數(shù)
{
Lcd1602WriteCom(0x38); //功能設(shè)置指令,總線8位,顯示2行,5x7點(diǎn)陣每個(gè)字符
Lcd1602WriteCom(0x0c); //顯示開關(guān)控制指令,顯示功能開,無(wú)光標(biāo)
Lcd1602WriteCom(0x06); //模式設(shè)置指令,寫入新數(shù)據(jù)后光標(biāo)右移,顯示屏不移動(dòng)
Lcd1602WriteCom(0x01); //清屏指令
Lcd1602WriteCom(0x47+0x80); //寫入第二行倒數(shù)第八個(gè)位置
}
void LcdDisp() //顯示函數(shù)
{
u8 i;
LcdInit(); //LCD初始化
tempdatapros(Tempdata); //讀取溫度數(shù)據(jù),存入數(shù)組中
for(i=0;i<9;i++)
{
Lcd1602WriteDat(Tempdata[i]);
}
}
復(fù)制代碼
#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 //定義數(shù)據(jù)口
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void LcdDisp();
復(fù)制代碼
3.DS18B20代碼
#include "ds18b20.h"
u16 temp;
u8 Tempdata[9];
void delay1ms(u8 y) //延時(shí)函數(shù),延時(shí)y毫秒
{
u8 x;
for(;y>0;y--)
for(x=110;x>0;x--);
}
u8 ds18b20Init() //溫度傳感器初始化函數(shù)
{
u8 i;
DSPORT=0;
i=60;while(i--); //約延時(shí)600us
DSPORT=1;
while(DSPORT)
{
i++;
if(i>6)
return 0; //初始化失敗
}
return 1; //初始化成功
}
u8 Ds18b20Read() //從DS18B20中讀數(shù)據(jù)
{
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) //將數(shù)據(jù)寫入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() //溫度轉(zhuǎn)換函數(shù)
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //發(fā)送跳過(guò)ROM指令
Ds18b30Write(0x44); //發(fā)送溫度轉(zhuǎn)換指令
}
void Ds18b20ReadTempCom() //發(fā)送讀暫存器指令
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //發(fā)送跳過(guò)ROM指令
Ds18b30Write(0xbe); //發(fā)送讀暫存器指令
}
void Ds18b20ReadTemp() //讀溫度存到temp中
{
u8 th,tl;
Ds18b20TempConvert();
Ds18b20ReadTempCom();
tl=Ds18b20Read();
th=Ds18b20Read();
temp=th<<8;
temp=temp|tl;
if(temp<0)
{
Tempdata[0]='-'; //若溫度為負(fù)值,前面加負(fù)號(hào)
temp=~(temp-1);
temp=temp*0.0625*100+0.5;
}
else
{
Tempdata[0]=' '; // 溫度為正值,前面無(wú)符號(hào),顯示空格
temp=temp*0.0625*100+0.5;
}
}
void tempdatapros(u8 Tempdata[]) //將讀取的溫度temp處理,放入數(shù)組中
{
Ds18b20ReadTemp();
/*數(shù)據(jù)位加‘0’,使數(shù)字轉(zhuǎn)化為相應(yīng)字符*/
Tempdata[1]=temp/10000+'0'; //百位
Tempdata[2]=temp/100%100/10+'0'; //十位
Tempdata[3]=temp/100%10+'0'; //個(gè)位
Tempdata[4]='.'; //小數(shù)點(diǎn)
Tempdata[5]=temp/10%10+'0'; //小數(shù)點(diǎn)后第一位
Tempdata[6]=temp%10+'0'; //小數(shù)點(diǎn)后第二位
Tempdata[7]=0xdf; //溫度單位,攝氏度的‘。’
Tempdata[8]='C';
if(Tempdata[1]=='0') //如果溫度百位為0,顯示空格
Tempdata[1]=' ';
}
復(fù)制代碼
#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; //定義數(shù)據(jù)管腳
void tempdatapros(u8 Tempdata[]);
#endif
復(fù)制代碼
這個(gè)程序的缺點(diǎn)是不能實(shí)時(shí)更新溫度數(shù)值,可以加中斷函數(shù)或者其它函數(shù)來(lái)設(shè)定隔多長(zhǎng)時(shí)間更新一次
歡迎大家在此基礎(chǔ)上創(chuàng)
全部資料51hei下載地址:
LCD1602 DS18B20.zip
(36.4 KB, 下載次數(shù): 78)
2020-3-8 11:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
7778882
時(shí)間:
2021-7-1 09:50
嗚嗚嗚太有用了 感謝大神
作者:
hs1111
時(shí)間:
2021-7-2 20:08
有沒有實(shí)時(shí)溫度顯示
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1