|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*=============================程序说明===============================
项目名称:
作 者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include <reg52.h>
//===========================端口声明================================
sbit DS18b20_DQ=P2^7;//声明DS18B20的数据引脚接在单片机的P2.7端口。
//=========================全局常量声明==============================
//=========================全局变量声明==============================
unsigned char Data[]={17,17,17,17,17,17,0,0};
//数码管显示数组。
//===========================函数声明================================
void delay(unsigned char Time);
#define delay_520us() delay(80)
#define delay_60us() delay(8)
#define delay_15us() delay(1)
unsigned char DS18B20_reset(void);
void DS18B20_write_byte(unsigned charData);
unsigned char DS18B20_read_byte();
void display(unsigned char Data[]);
//============================主函数=================================
void main()//主函数
{
unsigned char tempL,tempH;
unsignedint tempDot;
//---------------------------系统初始化--------------------------
while(1)//死循环
{
while(DS18B20_reset());
DS18B20_write_byte(0xcc);
DS18B20_write_byte(0x44);
while(DS18B20_reset());
DS18B20_write_byte(0xcc);
DS18B20_write_byte(0xBE);
tempL=DS18B20_read_byte();
tempH=DS18B20_read_byte();
tempH=(tempH<<4)|(tempL>>4);//整数部分
tempDot=(tempL&0x0f)*625;//小数部分,整数化
Data[1]=tempH/100;
Data[2]=(tempH/10)%10;
Data[3]=tempH%10;
Data[4]=tempDot/1000;
Data[5]=(tempDot/100)%10;
Data[6]=(tempDot/10)%10;
Data[7]=tempDot%10;
display(Data);
}
}
//==========================功能子函数===============================
void delay(unsigned char Time)
{
while(Time--);
}
unsigned char DS18B20_reset(void)
{
unsignedchar Error=1;//默认复位不成功。
//---------主机发送复位信号------
DS18b20_DQ=1;
DS18b20_DQ=0;
delay_520us();
DS18b20_DQ=1;
delay_60us();
//---------接收DS18B20的应答信号-----
while(DS18b20_DQ==0)
Error=0;
while(DS18b20_DQ==0)
Error=0;
DS18b20_DQ=1;
returnError;
}
void DS18B20_write_byte(unsigned char Data)
{
unsignedchar i=0;
for(i=0;i<8;i++)
{
DS18b20_DQ=1;
DS18b20_DQ=0;
DS18b20_DQ=Data&0x01;
Data=Data>>1;
delay_60us();
DS18b20_DQ=1;
}
}
unsigned char DS18B20_read_byte()
{
unsignedchar i,Data;
for(i=0;i<8;i++)
{
Data=Data>>1;
DS18b20_DQ=1;
DS18b20_DQ=0;
DS18b20_DQ=1;
delay_15us();
if(DS18b20_DQ==1)Data=Data|0x80;
delay_60us();
DS18b20_DQ=1;
}
returnData;
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功 能:在数码管上显示8位数据(0~F)。
输 入:Data[]//8位数码管要显示的数据。
输 出:无
说 明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsignedchar code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0xbf,0xff};
unsignedchar code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsignedchar i=0;//记录显在哪位上。
unsignedchar Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data];//送段选码。
if(i==3)P0=P0&0x7f;
WR=0;//开
WR=1;//关
//---------位选------------
P2=0xf8;
P0=Bit;
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
} |
|