⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20test.c

📁 温度测量显示程序
💻 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 + -