?? 18b20.txt
字號:
#include<reg51.h>
#include<absacc.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]
sbit dq= P1^7; //定義DS18B20數據輸入輸出端
bit flag;
uint b1,x,z;
unsigned int table1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //0~9的段碼
//延時函數
void delay(uchar i) //延時函數
{
while(i--);
}
//初始化DS18B20
void init1820()
{
dq = 1; //dq復位
delay(8); //稍做延時
dq=0; //單片機將dq拉低
delay(80); //精確延時 大于 480us
dq = 1; //拉高總線
delay(14);
if(dq==0) //稍做延時后 如果dq=0則初始化成功 dq=1則初始化失敗
flag=1;
else
flag=0;
delay(20);
}
//讀一個字節
uchar read1820()
{
uchar i,u=0;
for (i=1;i<=8;i++)
{
dq=0; // 給脈沖信號
u>>=1;
dq=1; // 給脈沖信號
if(dq)
u|=0x80;
delay(4);
}
return(u);
}
//寫一個字節
uchar wr1820(uchar wr)
{
uchar j;
for(j=1;j<=8;j++)
{
dq=0;
dq= wr&0x01;
delay(5); //17us
dq=1;
wr>>=1; // ????(??????)
}
return 0;
}
//DS18B20 開始轉換
void tmpchange(void)
{
init1820();
wr1820(0xcc); //跳過讀序號列號的操作
wr1820(0x44); // 啟動溫度轉換
}
//讀取溫度
uint tmp()
{
uint a,b,t;
init1820();
wr1820(0xcc); //跳過讀序號列號的操作
wr1820(0xbe); // 讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a= read1820(); // 讀取溫度值低位
b= read1820(); //讀取溫度值高位
a=a>>4; //低位右移4位,舍棄小數部分
t=b<<4; //高位左移4位,舍棄符號位
t=t|a; //將高低位合并成一個整型量
return t;
}
//顯示函數,將溫度顯示在數碼管上
void disp(uint i1,uint i2,uint i3,uint i4) //數碼管顯示程序
{
COM8155=0x03; //啟動8155控制口
for(z=0;z<10;z++)
{
PA8155=0x10; //選中個位數碼管
b1=table1[i1]; //取段碼
PB8155=b1; //送數碼管顯示
delay(500);
PA8155=0x20; //十位
b1=table1[i2];
PB8155=b1;
delay(500);
PA8155=0x40; //百位
b1=table1[i3];
PB8155=b1;
delay(500);
PA8155=0x80; //千位
b1=table1[i4];
PB8155=b1;
delay(500);
}
}
//主函數
void main()
{
uint temp;
while(1) //不斷循環采集溫度
{
tmpchange(); //啟動轉換
temp=tmp(); //讀取溫度
disp(temp%10,temp%100/10,temp%1000/100,temp/1000); //顯示溫度
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -