📄 18b20test.c
字号:
/************************************************************
*File Name: 数字温度计
*Author: LiZhaosuo
*Date: 2007//8/31
*Modify: NO
*Description: 以ADuC812为主控芯片,MAX7219为显示控制芯片,
DS18B20为温度传感器,精度可以达到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
/*温度小数部分查表法用*/
uchar data distab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
/*温度数据暂存*/
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:延时处理
*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写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
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的一个字节
*parameter:
*Return:
*Modify: lzs
*************************************************************/
uchar ReadByte (void) //读取单字节
{
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 (); //总线复位
WriteByte (0xCC);//发SkipROM指令
WriteByte (0xBE);//发读指令
temp_data[0]=ReadByte ();//温度低8位值
temp_data[1]=ReadByte ();//温度高8位值
Init18b20 (); //复位
WriteByte (0xCC);//发SkipROM指令
WriteByte (0x44);//发转换指令
}
/************************************************************
*Function:温度数据处理
*parameter:
*Return:
*Modify:
*************************************************************/
void work_temp(void)
{
uchar n;
if(temp_data[1]>127) //负温度求补码
{
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; //个位的数字加点
if(!display[3])
{
display[3]=21;
if(!display[2])
{
display[2]=21;
}
}//最高位为零时不显示
if(n){display[3]=20;}//负温度时显示-
}
/************************************************************
*Function:显示函数
*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函数
*parameter:
*Return:
*Modify:
*************************************************************/
void main(void)
{
char i;
// char j;
Max7219Init (); // 初始化MAX7219
Max7219SetBrightness (0x04); // 设置显示亮度
for(i=0;i<=8;i++)
{
Max7219DisplayChar (i, 18);//开机显示8.
}
Init18b20 (); //初始化18b20
WriteByte (0xCC);//发SkipROM指令
WriteByte (0x44);//发转换指令
/* for(j=0;j<3;j++) //数码管循环显示跑8 三次,复位时显示界面
{
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
}
}
/*************************结束*************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -