📄 test015.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 + -