二、软件部分

#include <reg51.h>
#include <intrins.h>
// 此表为 LED 的字模(共阴极)      0 1     2     3     4     5     6     7    8     9  灭   a     b     c    d     e      f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char flag,xiao=0;
unsigned char wendu[2];
sbit DQ=P3^7;

/******************************************************

DS18B20初始化        温度计函数

***********************************************************/
unsigned char INI() //温度计复位
{unsigned char flag,time;      
DQ = 1;           //先将数据线拉高
for(time=0;time<2;time++); //延时6+2微秒   
DQ = 0;           //再将数据线从高拉低,要求保持480~960us
for(time=0;time<240;time++);  //延时720+2微秒                                              
DQ = 1;           //释放数据线
for(time=0;time<12;time++);  //延时36+2us
flag=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)      
for(time=0;time<200;time++) ; //延时足够长时间,必须大于480-(36+2) us  
return (flag);    //返回检测成功标志
}

/******************************************************

DS18B20写一个字节        温度计函数

***********************************************************/

void DS_WRITE_BYTE(unsigned char command)//写入一个字节
{unsigned char time;
 unsigned char i=0;
        for (i=0; i<8; i++)
                 {
                          DQ =1;         // 设置初始状态
                          _nop_();             //等待一个机器周期         
                          DQ=0;          //将数据线从高拉低时即启动写时序
 _nop_();//拉低DQ至少1us       
                          DQ=command&0x01;   //先送低位        
                         for(time=0;time<10;time++)        ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
                          DQ=1;          //释放数据线                    
                          for(time=0;time<10;time++);//延时30+2us,写一位至少60us
                          command=command>>1;       //将command中的各二进制位数据右移1位
                 }
         for(time=0;time<4;time++); //稍作延时
}

****************************************************************************************************************

详情请咨询:                                                 http://shop108408772.taobao.com/

**************************************************************************************************************

/******************************************************

DS18B20读一个字节        温度计函数

***********************************************************/

unsigned char DS_READ_BYTE()//读入一个字节
{unsigned char i,temp=0,time;
for(i=0;i<=7;i++)
{ DQ =1;       // 设置初始状态
   _nop_();            
    temp=temp>>1; 
    DQ=0;   //拉低DQ至少1us
_nop_();
_nop_();
DQ=1;   //释放总线
for(time=0;time<2;time++) ;//延时6+2us
if(DQ==1)temp=temp|0x80;   //从拉低DQ开始,在15us之内完成数据采样
for(time=0;time<17;time++); //延时51+2us,每读1位至少用60us
}
return temp;
}

/******************************************************

使用中断定时读取数据        温度计函数

***********************************************************/

void timer0() interrupt 1   //使用中断定时读取温度数据
{TL0=0;
TH0=0;
flag=flag+1;
if(flag==16)
{unsigned char time; //中断服务程序
INI();
DS_WRITE_BYTE(0xCC); //跳过读ROM指令
DS_WRITE_BYTE(0x44); //转换温度
for(time=0;time<100;time++);  //等待转换完毕
INI();
DS_WRITE_BYTE(0xCC); //跳过读ROM指令
DS_WRITE_BYTE(0xBE); //转换温度
wendu[0]=DS_READ_BYTE();   //低字节
wendu[1]=DS_READ_BYTE(); //高字节
INI();//终止接收数据
flag=0;
}
}

****************************************************************************************************************

详情请咨询:                                                 http://shop108408772.taobao.com/

**************************************************************************************************************

/******************************************************

LED动态显示      显示函数

***********************************************************/

void display(unsigned char number,unsigned char shuzi) //动态显示
{unsigned char temp,i;
temp=number<<2;
P2=temp&0x1c;
if(number==1)P1=(LED7Code[shuzi])|0x80;
else
P1=(LED7Code[shuzi])&0x7f;
for(i=0;i<=100;i++);
}

/******************************************************

主函数

***********************************************************/

void main() //使用动态显示将温度显示在LED上
{ unsigned char i;
unsigned char shijian[8]={8,8,0,10,10,10,10,10};
unsigned char temperature;
TMOD=1;                                      //定时器0模式为1,使用的是16位计数器
EA=1;                                       //总中断开启
ET0=1;                            //定时器中断打开
TR0=1;                          //定时器开始计数
do{
temperature=(wendu[0]>>4)|((wendu[1]<<4)&0x7f); //将温度整数部分组装好
if(wendu[0]&0x08)xiao=1;                                           //精确到0.5摄氏度
else xiao=0;
shijian[0]=temperature/10;                                        //获取十位

shijian[1]=temperature%10;                                        //获取个位
if(xiao==1)shijian[2]=5;                                              //小数部分
else shijian[2]=0; 
//shijian[0]=wendu[0]/100; //测试使用
//shijian[1]=(wendu[0]%100)/10;
//shijian[2]=(wendu[0]%100)%10;
//P0=~wendu[1];
for(i=0;i<=7;i++)                                  //将读到的数据送到LED显示
{display(i,shijian[i]);
}
}while(1);
}

****************************************************************************************************************

详情请咨询:                                                 http://shop108408772.taobao.com/

**************************************************************************************************************

三、调试中遇到的问题

1>延时函数使用如下方式:

unsigned char i;

for(i=0;i<n;i++);                //本句实现延时 3*n+2 us,我通过断点调试验证(晶振为12MHZ)

2>查看具体延时时间工具的使用

通过在keil中设置好晶振,在要测试处设置断点,在下一行设置断点,开启调试,使用快捷键F5进行查看时间。使用后断点处运行时间减去该断点处时间即为实际该句运行时间。

3>注意找写1与写0时序的共同部分时序,按此缩减程序

四、测试结果

****************************************************************************************************************

详情请咨询:                                                 http://shop108408772.taobao.com/

**************************************************************************************************************

单片机控制DS18B20自制简易电子温度计(测试通过)(二)相关推荐

  1. 单片机控制DS18B20自制简易电子温度计(测试通过)(一)

    花了一天多时间弄电子温度计,关键问题还是出现在延时不准确,导致不能正常工作.没有严格按照时序中要求的时序,也让我吃了不少苦头.在这里,简单向大家介绍下常用的温度芯片DS18B20. 一.硬件部分 1& ...

  2. 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序

    原标题:AVR单片机控制DS18B20的示例C程序 #include #include #include #include unsigned char data_H, data_L,wendu; un ...

  3. 使用STM8单片机+NTC热敏电阻自制简易温度巡检仪

      最近在测试设备的时候需要监测设备的温度,平常测试时都是通过红外热成像仪测试,然后手动记录数据.这样测试的话工作量比较大,需要几分钟就记录一次数据.于是想着能不能用单片机做一个测试温度的装置,用电脑 ...

  4. arduino uno r3单片机封装图_单片机控制的OLED简易电子表原型

    在多年以前,我刚开始学单片机的时候,就想着要用51单片机加上0.96英寸的OLED DIY一个电子表,但是可惜当时水平有限,没能实现.现在我早已玩转了STM32,准备向ARM9进发,突然想到了当年的想 ...

  5. 单片机控制雷达测距模块HC-SR04测量距离(通过测试)

    雷达测距模块在小车防撞中应用比较不错,在这篇文章中简单介绍下雷达测距模块HC-SR04的使用. 一.硬件介绍 引脚四个,分别为VCC.TRIG.ECHO.GND 单片机控制引脚TRIG:用于给出促发测 ...

  6. 51单片机温度传感器DS18B20

    51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...

  7. 【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)

    (代码在文末) 工程文件和代码下载链接如下(求求下载前点个赞支持一下吧QAQ,博主自己做出来这个也hin累的) 链接: https://pan.baidu.com/s/1-aRZjyRZodzLcw8 ...

  8. 51单片机控制SG90舵机、MG90S舵机

    舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...

  9. 基于51单片机的DS18B20温度控制加热降温系统设计

    基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...

最新文章

  1. (一)win7下cocos2d-x 21 + vs2010
  2. 2006关注IT技术
  3. 【Java集合系列四】HashSet和LinkedHashSet解析
  4. 专家:中国房地产泡沫崩溃时间就是今明二年
  5. how is SAP OData metadata read from CDS view via SADL
  6. 前端学习(3348):数组方法的运用和数值
  7. 【Codeforces - 864D】Make a Permutation!(贪心,字典序)
  8. Spring Jpa 返回自定义实体
  9. SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
  10. 生成下面的模块时,启用了优化或没有调试信息
  11. 软键盘遮挡住popupWindow问题
  12. C++引用(作为函数参数和返回值)
  13. java中的jQuery与Ajax的应用,菜鸟教程
  14. 零基础入门学习的UG模具设计技巧
  15. 执行throw后 后面代码还会执行吗?
  16. linux usb lpt,Linux安装Composer
  17. api系列聚美优品的知识点
  18. 3ds Max发生闪退怎么办?
  19. spring beancopier Cannot invoke “Object.getClass()“ because “cause“ is null异常处理
  20. RNN代码简单实现(周杰伦歌词示例)

热门文章

  1. 画论09 李嗣真《续画品录》
  2. 【统计DataFrame中每列非空值的个数】
  3. centos7安装数据库MariaDB
  4. 堆排序稳定性举例_几种排序算法的稳定性
  5. 微信小程序页面背景图片设置
  6. 2022 年值得关注的 9 个最新 Java 趋势
  7. Java各种相关软件下载地址
  8. 微信小程序之课程选择器
  9. 堂堂中华网china.com上竟然全是垃圾小广告
  10. 正规式到最小化DFA