我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1164|回复: 0

温度传感器测温度

[复制链接]

该用户从未签到

135

主题

2418

回帖

6591

积分

二级逆天

积分
6591

社区居民社区劳模原创达人最爱沙发忠实会员终身成就奖优秀斑竹奖

QQ
发表于 2015-3-19 16:04:37 | 显示全部楼层 |阅读模式
/*=============================程序说明===============================
项目名称:
    :
创建日期:
修改说明:
程序说明:
(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位数据(0F)。
    入: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;
         }        
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表