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

📄 test015.c

📁 51单片机全套学习资料 提供电路原理图 各种C语言实验程序 包括LED流水灯,数码管显示,中断,定时器,串口通信,DS18B20温度显示,液晶1602,12864显示,看门狗,按键检测,音乐播放等程序
💻 C
字号:
/********************************************************************************************
* 文 件 名:test015.c
* 功    能:DS18B20温度检测。 
* 硬件条件:1.CPU型号:AT89S52
*           2.晶振:12.000MHz
*           3.用跳线帽短接JP4跳线,即P0口全部接上拉电阻。
*           4.用跳线帽短接P0.0__SMG1
*             用跳线帽短接P0.1__SMG2
*             用跳线帽短接P0.2__SMG3
*             用跳线帽短接P0.3__SMG4
*             用跳线帽短接P2.7__SI1
*             用跳线帽短接P2.6__RCK1
*             用跳线帽短接P2.5__SCK1
*           5.用跳线帽短接DS18B20__P1.4                                                                                      
* 作    者:POWER
* 日    期:2006年12月12号
* 斯凯科技主页:www.armsky.net
* 斯凯科技论坛:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h"                               // 包含头文件    

/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned int       uint32;               // 无符号32位整型变量
typedef signed   int       int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)
/********************************************************************************************/

/* 定义位变量 */
sbit P0_0 = P0 ^ 0;                                                       
sbit P0_1 = P0 ^ 1;                                                       
sbit P0_2 = P0 ^ 2;                                                       
sbit P0_3 = P0 ^ 3;
                                                       
sbit P2_7 = P2 ^ 7;                                                       
sbit P2_6 = P2 ^ 6;                                                       
sbit P2_5 = P2 ^ 5;

sbit DQ = P1 ^ 4;                                // 定义DS18B20的单总线                                              

#define SMG1_ON()        (P0_0=0)                // 定义"SMG1_ON()"为P0.0输出低电平,选中数码管1
#define SMG2_ON()        (P0_1=0)                // 定义"SMG2_ON()"为P0.1输出低电平,选中数码管2
#define SMG3_ON()        (P0_2=0)                // 定义"SMG3_ON()"为P0.2输出低电平,选中数码管3
#define SMG4_ON()        (P0_3=0)                // 定义"SMG4_ON()"为P0.3输出低电平,选中数码管4
#define SMG_ALL_OFF()    (P0=0xFF)               // 定义"SMG_ALL_OFF()"为P0口输出高电平,全部数码管都不选中


#define SI1_H()          (P2_7=1)                // 定义"SI1_H()"为P2.7输出高电平,作为74HC595_1的数据输入信号
#define SI1_L()          (P2_7=0)                // 定义"SI1_L()"为P2.7输出低电平,作为74HC595_1的数据输入信号  
#define RCK1_H()         (P2_6=1)                // 定义"RCK1_H()"为P2.6输出高电平,作为74HC595_1的片选输入信号
#define RCK1_L()         (P2_6=0)                // 定义"RCK1_L()"为P2.6输出低电平,作为74HC595_1的片选输入信号
#define SCK1_H()         (P2_5=1)                // 定义"SCK1_H()"为P2.5输出高电平,作为74HC595_1的时钟输入信号
#define SCK1_L()         (P2_5=0)                // 定义"SCK1_L()"为P2.5输出低电平,作为74HC595_1的时钟输入信号

uint8 code SMGData1[ ]= {0xc0, 0xf9, 0xa4,0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // '0'~'9'数码管显示字符
uint8 code SMGData2[ ]= {0x40, 0x79, 0x24,0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; // '0.'~'9.'数码管显示字符

/********************************************************************************************
* 函数名称:SendDataTo74HC595_1()
* 功    能:向74HC595_1发送一字节数据
* 入口参数:data    要发送的数据
* 出口参数:无
* 注    意:发送数据时,高位先发送
*********************************************************************************************/
void SendDataTo74HC595_1(uint8 dat)
{
  uint8 i;
  
  RCK1_L();                                      // RCK1为低电平
  for(i=0;i<8;i++)                               // 发送8位数据(1个字节)
    {
      SCK1_L();                                  // SCK1为低电平
       
	  /* 设置SI2的输出值 */
      if((dat & 0x80)!=0)
        {SI1_H();}                               // SI1输出高电平
      else
        {SI1_L();}                               // SI1输出低电平
       
	  dat<<=1;                                   // 将要发送的1字节数据左移一位
      SCK1_H();                                  // SCK1为高电平
    }
  RCK1_H();                                      // RCK1为高电平     
}

/********************************************************************************************
* 函数名称:DS18B20_Delay()
* 功    能:DS18B20软件延时专用
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void DS18B20_Delay(uint16 count)//延时函数
{
  while(count--);
}

/********************************************************************************************
* 函数名称:DS18B20_Init()
* 功    能:DS18B20初始化
* 入口参数:无
* 出口参数:返回值为1则初始化成功
*           返回值为0则初始化失败
*********************************************************************************************/
uint8 DS18B20_Init(void)
{
	uint8 x = 0;

	DQ = 1;                                      // DQ复位
	DS18B20_Delay(8);                            // 稍做延时

	DQ = 0;                                      // 单片机将DQ拉低
	DS18B20_Delay(80);                           // 精确延时,大于480us

	DQ = 1;                                      // 拉高总线
	DS18B20_Delay(14);                           // 稍做延时后

	x = DQ;                                      // 若x=0则初始化成功,若x=1则初始化失败
    DS18B20_Delay(20);

	return (~x);
}

/********************************************************************************************
* 函数名称:DS18B20_Read1Byte()
* 功    能:从DS18B20读一个字节
* 入口参数:无
* 出口参数:从DS18B20读出的一个字节
*********************************************************************************************/
uint8 DS18B20_Read1Byte(void)
{
  uint8 i = 0;
  uint8 dat = 0;

  for(i=8;i>0;i--)
	{
  	  DQ = 0; // 给脉冲信号
  	  dat >>= 1;
  	  DQ = 1; // 给脉冲信号

	  if(DQ) dat |= 0x80;
  	  DS18B20_Delay(4);
	}

	return (dat);
}

/********************************************************************************************
* 函数名称:DS18B20_Write1Byte()
* 功    能:向DS18B20写一个字节
* 入口参数:dat  要写入DS18B20的一字节数据
* 出口参数:无
*********************************************************************************************/
void DS18B20_Write1Byte(uint8 dat)
{
  uint8 i = 0;

  for(i=8;i>0;i--)
	{
  	  DQ = 0;
  	  DQ = dat&0x01;
  	  DS18B20_Delay(5);

  	  DQ = 1;
  	  dat>>=1;
	}
}

/********************************************************************************************
* 函数名称:Read_Disp_Temperature()
* 功    能:读取并显示温度
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Read_Disp_Temperature(void)
{
  uint32 a = 0, b = 0, c = 0, t = 0;
  fp32 tt = 0;

  DS18B20_Init();
  DS18B20_Write1Byte(0xCC);                      // 跳过读序号列号的操作
  DS18B20_Write1Byte(0x44);                      // 启动温度转换

  DS18B20_Init();
  DS18B20_Write1Byte(0xCC);                      // 跳过读序号列号的操作
  DS18B20_Write1Byte(0xBE);                      // 读取温度寄存器

  a = DS18B20_Read1Byte();
  b = DS18B20_Read1Byte();

  t = b;
  t <<= 8;
  t = t | a;

  tt = t * 0.0625;
  t = tt * 10 + 0.5;                             // 放大10倍输出并四舍五入

  a = t / 100;                                   // 十位
  b = t / 10 - a * 10;                           // 个位 
  c = t - a * 100 - b * 10;                      // 小数位

  SendDataTo74HC595_1(0xc6);                     // 显示"C"字符
  SMG1_ON();
  DS18B20_Delay(400);
  SMG_ALL_OFF();

  SendDataTo74HC595_1(SMGData1[c]);              // 显示小数位
  SMG2_ON();
  DS18B20_Delay(400);
  SMG_ALL_OFF();

  SendDataTo74HC595_1(SMGData2[b]);              // 显示个位
  SMG3_ON();
  DS18B20_Delay(400);
  SMG_ALL_OFF();

  SendDataTo74HC595_1(SMGData1[a]);              // 显示十位
  SMG4_ON();
  DS18B20_Delay(400);
  SMG_ALL_OFF();
}


/********************************************************************************************
* 函数名称:main()
* 功    能:数码管动态显示由DS18B20检测到的温度。
*********************************************************************************************/   	
void main (void)                
{
  SMG_ALL_OFF();
  while(1)
	  {
  	    Read_Disp_Temperature();
	  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -