欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
18B20采集溫度仿真電路原理圖與單片機(jī)代碼
[打印本頁]
作者:
2006sunmoon
時(shí)間:
2017-5-4 13:08
標(biāo)題:
18B20采集溫度仿真電路原理圖與單片機(jī)代碼
18B20采集溫度+仿真電路,自己學(xué)習(xí),歡迎參考下載,包含完整的單片機(jī)代碼與proteus仿真
0.png
(19.18 KB, 下載次數(shù): 83)
下載附件
2017-5-4 17:21 上傳
0.png
(58.23 KB, 下載次數(shù): 66)
下載附件
2017-5-4 17:21 上傳
#include<reg52.h>
#include <intrins.h>
#include "led--display.h"
sbit DQ=P2^2;
uchar time; //供延時(shí)用全局變量
/**************************************
18b20初始化
***************************************/
bit lnit18B20()
{
bit DS18B20;//儲(chǔ)存DS18B20是否存在的標(biāo)志,DS18B20=0,表示存在;DS18B20=1,表示不存在
DQ=1;
_nop_(); //延時(shí)一個(gè)機(jī)器周期
DQ=0;
for(time=0;time<170;time++);//延時(shí)510us左右,以向DS18B20發(fā)出一持續(xù)480~960us的低電平復(fù)位脈沖
DQ=1;
for(time=0;time<10;time++);//延時(shí)約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
DS18B20=DQ; //讓單片機(jī)檢測是否輸出了存在脈沖(DQ=0表示存在)
for(time=0;time<40;time++);
return (DS18B20); //返回檢測成功標(biāo)志
}
/**************************************
函數(shù)功能:向DS18B20寫入一個(gè)字節(jié)數(shù)據(jù)
入口參數(shù):dat
***************************************/
void write18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_(); //延時(shí)一個(gè)機(jī)器周期
DQ=0; //將數(shù)據(jù)線從高拉低時(shí)即啟動(dòng)寫時(shí)序
for(time=0;time<1;time++);
DQ=dat&0x01; //利用與運(yùn)算取出要寫的某位二進(jìn)制數(shù)據(jù),
//并將其送到數(shù)據(jù)線上等待DS18B20采樣
for(time=0;time<10;time++);//延時(shí)約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣
DQ=1; //釋放數(shù)據(jù)線
for(time=0;time<1;time++);//延時(shí)3us,兩個(gè)寫時(shí)序間至少需要1us的恢復(fù)期
dat=dat>>1;
}
for(time=0;time<2;time++); //稍作延時(shí),給硬件一點(diǎn)反應(yīng)時(shí)間
}
/*****************************************************
函數(shù)功能:從DS18B20讀取一個(gè)字節(jié)數(shù)據(jù)
出口參數(shù):dat
***************************************************/
uchar read18b20()
{
uchar i;
uchar dat;
for(i=0;i<8;i++)
{
DQ=1;
_nop_(); //延時(shí)一個(gè)機(jī)器周期
DQ=0; //將數(shù)據(jù)線從高拉低時(shí)即啟動(dòng)讀時(shí)序
_nop_();
dat=dat>>1;
DQ=1;
for(time=0;time<1;time++);////延時(shí)約3us,使主機(jī)在15us內(nèi)采樣
if(DQ==1)
dat|=0x80; ////如果讀到的數(shù)據(jù)是1,則將1存入dat
else
dat|=0x00; //如果讀到的數(shù)據(jù)是0,則將0存入dat
for(time=0;time<15;time++);////延時(shí)60us以上,讀時(shí)序必須有大于60us
DQ=1;
for(time=0;time<1;time++);//延時(shí)3us,兩個(gè)讀時(shí)序之間必須有大于1us的恢復(fù)期
}
for(time=0;time<1;time++);////稍作延時(shí),給硬件一點(diǎn)反應(yīng)時(shí)間
return dat;
}
/*****************************************************
函數(shù)功能:做好讀溫度的準(zhǔn)備
***************************************************/
void ready18B20()
{
lnit18B20(); //復(fù)位18b20
write18b20(0XCC); //跳過序列號(hào)搜索
write18b20(0X44); //啟動(dòng)溫度轉(zhuǎn)換
for(time=0;time<100;time++);//延時(shí)時(shí)間等待轉(zhuǎn)換完成
lnit18B20(); ////復(fù)位18b20
write18b20(0XCC); //跳過序列號(hào)搜索
write18b20(0XBE); //寫入讀取溫度命令
}
/*****************************************************
函數(shù)功能:讀溫度數(shù)據(jù)
***************************************************/
uint dutemp()
{
uint temp;//定義返回值變量
uchar lsb;//在變量lsb存儲(chǔ)低8位數(shù)據(jù)
uchar msb;//在變量msb存儲(chǔ)高8位數(shù)據(jù)
uchar fu;
ready18B20();//18b20讀溫度準(zhǔn)備
lsb=read18b20();//第一次讀取低八位數(shù)據(jù)
msb=read18b20();//第二次讀取高八位數(shù)據(jù)
if((msb&0xf8)==0xf8)//高8位與0xf8按位與判斷是否為負(fù)溫度,真值為負(fù)
{
temp=(~(msb*256+lsb)+1)*6.25;//如果為負(fù)則將16位數(shù)據(jù)按位取反加1然后再乘以0.0625*100保留兩位小數(shù)
if((994<temp)&&(temp<5500)) //判斷16位數(shù)據(jù)是否大于10度小于55度
fu=1; //成立則賦值數(shù)碼管顯示列
else //否則
{
if(temp<=994) //顯示另外列
fu=2; //
else fu=8; //
}
led3_display(fu); //負(fù)號(hào)列顯示函數(shù)
}
else
{
temp=(msb*256+lsb)*6.25;//將16位數(shù)據(jù)乘以0.0625*100保留兩位小數(shù)
}
return temp; //返回要顯示數(shù)據(jù)
}
void main()
{
du=0;
we=0;
while(1)
{
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
下載:
18b20數(shù)碼管顯示.rar
(128.73 KB, 下載次數(shù): 34)
2017-5-4 13:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
zhoulin02
時(shí)間:
2017-5-30 15:31
謝謝分享
作者:
酷酷的陽少
時(shí)間:
2019-5-29 19:51
樓主,為什么我運(yùn)行仿真的時(shí)候會(huì)報(bào)錯(cuò)呢?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1