欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
注釋詳細的51單片機讀取DS18B20溫度C語言源代碼
[打印本頁]
作者:
青年
時間:
2020-9-16 15:18
標題:
注釋詳細的51單片機讀取DS18B20溫度C語言源代碼
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit DQ=P3^7;
bdata uchar dat;
sbit dat0=dat^0;
sbit dat7=dat^7;
uchar dp[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xbf,0xff};
uchar dbuf[4]={0,0,0,0x12};
void disp(void)
{
uchar i,n,bsel;
bsel=0x01;
for(n=0;n<4;n++)
{
P2=0xf0|bsel;
P0=segtab[dbuf[n]];
if(n==1)P0=P0&0x7f;
bsel=_crol_(bsel,1);
for(i=1;i<200;i++);
P0=0xff;
}
}
void delay15(uchar n) //15us????
{ do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
bit reset(void) //初始化DS18B20
{
bit err;
DQ=0; //在數據線上產生600US低電平
delay15(40);
DQ=1; //數據線電平拉高
delay15(4); //延時60us
err=DQ; //將讀數據線狀態,如果為低則復位成功
delay15(18); // 如果數據線為高則復位不成功
return(err);
}
void wrbyte(uchar d) //單片機向DS18B20發送一個字節的命令
{
uchar i;
dat=d;
for(i=8;i>0;i--) //循環寫入8位
{
DQ=0; //數據低電平產生15us
delay15(1);
DQ=dat0; //將當前數據為送至數據總線
dat=dat>>1; //將下一位要寫入的數據移到最低位
delay15(1); //延時15us
DQ=1; //數據線拉高為寫入下一位做準備
}
}
uchar rdbyte(void) //從DS18B20讀取一個字節數據
{
uchar i;
dat=0; //讀取數據初始值要為0
for(i=8;i>0;i--) //循環讀取8位(先低后高)
{
dat=dat>>1; //讀出數據線右移一位
DQ=0; //產生1us負脈沖
_nop_();
DQ=1; // 產生15us高電平
delay15(1);
dat7=DQ; // 讀取到數據放入暫存·
delay15(4); // 延時,為讀取下一位做準備
}
return(dat); //將讀取到的溫度值返回給單片機
}
void convert(void) //啟動DS18B20開始溫度轉換
{
bit err;
err=reset(); //先復位溫度傳感器
wrbyte(0xcc); //由于我們本次只用了一個溫度傳感器,則這里跳過傳感器的識別
wrbyte(0x44); //啟動溫度傳感器
}
int readt(void)//讀取DS18B20暫存器中的值
{
uchar h,l;
bit err;
err=reset(); //復位溫度傳感器
wrbyte(0xcc);//跳過多傳感器識別
wrbyte(0xbe);//讀暫存指令
l=rdbyte(); //讀取溫度低位
h=rdbyte(); //讀取溫度高位
return(h*256+l); //返回讀取到的溫度
}
void format(int t)//將讀取到的溫度值轉換為帶一位小數的BCD碼格式送至緩存區,并滅掉高位0
{
bit zf; // 正負標記,0正數;1負數
zf=0;
if(t<0) //如果溫度在0度以下
{
zf=1; //置為負數標志
t=-t; //求補碼
}
dbuf[0]=dp[t&0x0f]; //求出溫度的小數
t=t>>4; //移掉小數部分
if(t==0xff)t=99; //字節擴展
dbuf[3]=t/100; //求出百位
t=t%100;
dbuf[2]=t/10; //求出十位
dbuf[1]=t%10; // 求出個位
if(zf==1) //如果是負數
{
if(dbuf[2]==0) // 如果十位為零
{
dbuf[3]=0x13; //顯示格式為“-x.x"
dbuf[2]=0x12;
}
else // 如果十位不為零
dbuf[3]=0x12; //顯示格式為“-xx.x"
}
else //如果是正數
{
if(dbuf[3]==0) //如果百位,十位都為零
{
if(dbuf[2]==0) //顯示格式為x.x
dbuf[2]=0x13; //如果只有百位為零
dbuf[3]=0x13; //顯示格式為xx.x
}
}
}
main()
{
int temp; //保存測量的溫度值
while(1)
{
temp=0;
convert(); //啟動溫度轉換
temp=readt(); // 讀取溫度值
format(temp); //將溫度值轉換為BCD碼送至顯緩區
disp();
}
}
復制代碼
DS18B20.7z
2020-9-21 15:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
19.7 KB, 下載次數: 29, 下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1