?? 18b20test.c
字號(hào):
/************************************************************
*File Name: 數(shù)字溫度計(jì)
*Author: LiZhaosuo
*Date: 2007//8/31
*Modify: NO
*Description: 以ADuC812為主控芯片,MAX7219為顯示控制芯片,
DS18B20為溫度傳感器,精度可以達(dá)到0.1度
*************************************************************/
#include <aduc812.h>
#include "intrins.h"
#include "max7219.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
sbit dq=P3^3; //溫度輸入口 temperature input
/*溫度小數(shù)部分查表法用*/
uchar data distab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
/*溫度數(shù)據(jù)暫存*/
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
uchar data temp_data[2]={0x00,0x00};
void TempDelay (uint t);
void Init18b20 (void);
void WriteByte (uchar wr);
uchar ReadByte (void);
void read_temp (void);
void work_temp(void);
void Temp_Display (void);
/************************************************************
*Function:延時(shí)處理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (uint t)
{
for(;t>0;t--)
;
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
uchar flag;
while(flag)
{
while(flag)
{
dq=1;
_nop_();_nop_();
dq=0;
TempDelay(50); //delay 550 us
_nop_();
dq=1;
TempDelay(6); //delay 66 us
_nop_(); _nop_();
flag=dq;
}
TempDelay(45);//500us
flag=~dq;
}
dq=1;
}
/************************************************************
*Function:向18B20寫入一個(gè)字節(jié)
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //單字節(jié)寫入
{
uchar i;
for (i=8;i>0;i--)
{
dq=1;
_nop_();_nop_();
dq=0;
_nop_();_nop_();_nop_();_nop_();_nop_();//5us
dq=wr&0x01;//最低位移出
TempDelay(6); //delay 66us
wr>>= 1;//右移一位
}
dq=1;
TempDelay(1);
}
/************************************************************
*Function:讀18B20的一個(gè)字節(jié)
*parameter:
*Return:
*Modify: lzs
*************************************************************/
uchar ReadByte (void) //讀取單字節(jié)
{
uchar i,value=0;
for(i=8;i>0;i--)
{
dq=1;_nop_();_nop_();
value >>= 1;
dq=0;
_nop_();_nop_();_nop_();_nop_();//4us
dq=1;
_nop_();_nop_();_nop_();_nop_();//4us
if(dq)
value|=0x80;
TempDelay (6); //66us
_nop_();
}
dq=1;
return(value);
}
/************************************************************
*Function:讀出18B20 的溫度值
*parameter:
*Return:
*Modify:
*************************************************************/
void read_temp (void)
{
Init18b20 (); //總線復(fù)位
WriteByte (0xCC);//發(fā)SkipROM指令
WriteByte (0xBE);//發(fā)讀指令
temp_data[0]=ReadByte ();//溫度低8位值
temp_data[1]=ReadByte ();//溫度高8位值
Init18b20 (); //復(fù)位
WriteByte (0xCC);//發(fā)SkipROM指令
WriteByte (0x44);//發(fā)轉(zhuǎn)換指令
}
/************************************************************
*Function:溫度數(shù)據(jù)處理
*parameter:
*Return:
*Modify:
*************************************************************/
void work_temp(void)
{
uchar n;
if(temp_data[1]>127) //負(fù)溫度求補(bǔ)碼
{
temp_data[1]=(256-temp_data[1]);
temp_data[0]=(256-temp_data[0]);
n=1;
}
display[4]=temp_data[0]&0x0f;
display[0]=distab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
display[1]=display[1]+10; //個(gè)位的數(shù)字加點(diǎn)
if(!display[3])
{
display[3]=21;
if(!display[2])
{
display[2]=21;
}
}//最高位為零時(shí)不顯示
if(n){display[3]=20;}//負(fù)溫度時(shí)顯示-
}
/************************************************************
*Function:顯示函數(shù)
*parameter:
*Return:
*Modify:
*************************************************************/
void Temp_Display (void)
{
uchar i,k;
for(i=0;i<=8;i++)
{
Max7219Clear (i);//first clear the digit
}
for(k=0;k<=3;k++)
{
Max7219DisplayChar (k+1, display[k]);
}
}
/************************************************************
*Function:main函數(shù)
*parameter:
*Return:
*Modify:
*************************************************************/
void main(void)
{
char i;
// char j;
Max7219Init (); // 初始化MAX7219
Max7219SetBrightness (0x04); // 設(shè)置顯示亮度
for(i=0;i<=8;i++)
{
Max7219DisplayChar (i, 18);//開機(jī)顯示8.
}
Init18b20 (); //初始化18b20
WriteByte (0xCC);//發(fā)SkipROM指令
WriteByte (0x44);//發(fā)轉(zhuǎn)換指令
/* for(j=0;j<3;j++) //數(shù)碼管循環(huán)顯示跑8 三次,復(fù)位時(shí)顯示界面
{
for(i=0;i<=8;i++)
{
Max7219DisplayChar (i, 18);
Delay_nms(150);
Max7219Clear (i);
}
}
*/
Delay_nms(2000);//顯示2s
while(1)
{
read_temp();
work_temp();
Temp_Display();
Delay_nms(2000);//顯示2s
}
}
/*************************結(jié)束*************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -