找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3056|回复: 2
打印 上一主题 下一主题
收起左侧

DS18B20测试程序

[复制链接]
跳转到指定楼层
楼主
ID:93384 发表于 2015-11-8 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>//52单片机头文件,规定了52单片机的寄存器和IO口等
  2. #include<intrins.h>//_nop_空指令及左右循环移位子函数库
  3. #include "DS18B20.h"
  4. #include "lcd1602.h"
  5. #include "ds1302.h"
  6. unsigned char code digit[10]={"0123456789"};     //定义字符数组显示数字
  7. /************************************************************************
  8. 以下是DS18B20的操作程序
  9. ************************************************************************/
  10. sbit DQ=P3^5;
  11. unsigned char time;   //设置全局变量,专门用于严格延时
  12. /*****************************************************
  13. 函数功能:将DS18B20传感器初始化,读取应答信号
  14. 出口参数:flag
  15. ***************************************************/
  16. bit Init_DS18B20(void)     
  17. {
  18. bitflag;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
  19. DQ =1;           //先将数据线拉高
  20. for(time=0;time<2;time++) //略微延时约6微秒
  21.     ;
  22. DQ =0;           //再将数据线从高拉低,要求保持480~960us
  23. for(time=0;time<200;time++)  //略微延时约600微秒
  24.     ;         //以向DS18B20发出一持续480~960us的低电平复位脉冲
  25. DQ =1;           //释放数据线(将数据线拉高)
  26. for(time=0;time<10;time++)
  27.     ;  //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
  28. flag=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)      
  29. for(time=0;time<200;time++)  //延时足够长时间,等待存在脉冲输出完毕
  30.      ;
  31. return (flag);    //返回检测成功标志
  32. }
  33. /*****************************************************
  34. 函数功能:从DS18B20读取一个字节数据
  35. 出口参数:dat
  36. ***************************************************/
  37. unsigned char ReadOneChar(void)
  38. {
  39.                    unsignedchar i=0;   
  40.                    unsignedchar dat;  //储存读出的一个字节数据
  41.                    for(i=0;i<8;i++)
  42.                     {
  43.                      
  44.                       DQ =1;      // 先将数据线拉高
  45.                       _nop_();        //等待一个机器周期      
  46.                       DQ = 0;     //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
  47.                             dat>>=1;
  48.                       _nop_();    //等待一个机器周期                     
  49.                       DQ = 1;    //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
  50.                       for(time=0;time<2;time++)
  51.             ;      //延时约6us,使主机在15us内采样
  52.                       if(DQ==1)
  53.                          dat|=0x80;  //如果读到的数据是1,则将1存入dat
  54.                             else                                 
  55.                                      dat|=0x00;//如果读到的数据是0,则将0存入dat
  56.                         //将单片机检测到的电平信号DQ存入r[i]
  57.                       for(time=0;time<8;time++)
  58.                               ;              //延时3us,两个读时序之间必须有大于1us的恢复期
  59.              }                           
  60.           return(dat);   //返回读出的十进制数据
  61. }
  62. /*****************************************************
  63. 函数功能:向DS18B20写入一个字节数据
  64. 入口参数:dat
  65. ***************************************************/  
  66. WriteOneChar(unsigned char dat)
  67. {
  68.          unsignedchar i=0;
  69.          for(i=0; i<8; i++)
  70.                     {
  71.                      DQ =1;        // 先将数据线拉高
  72.                      _nop_();             //等待一个机器周期     
  73.                      DQ=0;         //将数据线从高拉低时即启动写时序      
  74.                      DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
  75.                        //并将其送到数据线上等待DS18B20采样   
  76.                     for(time=0;time<10;time++)
  77.                         ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
  78.                      DQ=1;          //释放数据线                     
  79.                      for(time=0;time<1;time++)
  80.                               ;//延时3us,两个写时序间至少需要1us的恢复期
  81.                      dat>>=1;       //将dat中的各二进制位数据右移1位
  82.                     }
  83.            for(time=0;time<4;time++)
  84.                        ; //稍作延时,给硬件一点反应时间
  85. }
  86. /******************************************************************************
  87. 以下是与温度有关的显示设置
  88. ******************************************************************************/
  89. /*****************************************************
  90. 函数功能:显示温度符号
  91. ***************************************************/   
  92. /*void display_symbol(void)
  93. {
  94.             unsigned char i;
  95.                       write_com(0x80);    //写显示地址,将在第1行第1列开始显示
  96.                                i = 0;                //从第一个字符开始显示
  97.                                      while(Temp!= '\0')  //只要没有写到结束标志,就继续写
  98.                                      {                                                      
  99.                                                write_data(Temp);   //将字符常量写入LCD
  100.                                                i++;                 //指向下一个字符
  101.                                                delay1ms();        //延时1ms给硬件一点反应时间
  102.                                      }        
  103. }
  104. */
  105. /*****************************************************
  106. 函数功能:显示温度的小数点
  107. ***************************************************/   
  108. void display_dot(void)
  109. {        
  110.          write_com(0x80+14);        //写显示地址,将在第1行第9列开始显示            
  111.           write_data('.');      //将小数点的字符常量写入LCD
  112.           delay1ms();         //延时1ms给硬件一点反应时间           
  113. }
  114. /*****************************************************
  115. 函数功能:显示温度的单位(C)
  116. ***************************************************/   
  117. /***void          display_cent(void)
  118. {
  119.           unsigned char i;   
  120.                      write_com(0x80+10);        //写显示地址,将在第1行第10列开始显示
  121.                                i = 0;                    //从第一个字符开始显示
  122.                                      while(Cent!= '\0')     //只要没有写到结束标志,就继续写
  123.                                       {                                             
  124.                                      write_data(Cent);     //将字符常量写入LCD
  125.                                                i++;                 //指向下一个字符
  126.                                                delay1ms();        //延时1ms给硬件一点反应时间
  127.                                      }        
  128. } */
  129. /*****************************************************
  130. 函数功能:显示温度的整数部分
  131. 入口参数:x
  132. ***************************************************/
  133. void display_temp1(unsigned char x)
  134. {
  135.    unsigned char k,l;       //j,k,l分别储存温度的百位、十位和个位
  136. /*j=x/100;                 //取百位   */
  137.          k=(x%100)/10;            //取十位
  138.          l=x%10;                  //取个位   */
  139.          write_com(0x80+12);      //写显示地址,将在第1行第6列开始显示
  140. /*write_data(digit[j]);    //将百位数字的字符常量写入LCD         */
  141.    write_data(digit[k]);    //将十位数字的字符常量写入LCD
  142.          write_data(digit[l]);    //将个位数字的字符常量写入LCD        */
  143. }
  144. /*****************************************************
  145. 函数功能:显示温度的小数数部分
  146. 入口参数:x
  147. ***************************************************/
  148. void display_temp2(unsigned char x)
  149. {
  150.         write_com(0x80+15);      //写显示地址,将在第2行第11列开始显示
  151.          write_data(digit[x]);     //将小数部分的第一位数字字符常量写入LCD
  152.          delay1ms();          //延时1ms给硬件一点反应时间
  153. }
  154. /*****************************************************
  155. 函数功能:做好读温度的准备
  156. ***************************************************/
  157. void ReadyReadTemp(void)
  158. {
  159.        Init_DS18B20();     //将DS18B20初始化
  160.                    WriteOneChar(0xCC);// 跳过读序号列号的操作
  161.                    WriteOneChar(0x44);// 启动温度转换           
  162.              for(time=0;time<100;time++)
  163.                      ;        //温度转换需要一点时间
  164.                    Init_DS18B20();     //将DS18B20初始化
  165.                    WriteOneChar(0xCC);//跳过读序号列号的操作
  166.                    WriteOneChar(0xBE);//读取温度寄存器,前两个分别是温度的低位和高位     
  167. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2015-11-8 22:38 | 只看该作者
#include "DS18B20.h"
#include "lcd1602.h"
#include "ds1302.h"

楼主可以上传压缩包分享一下 这个3个头文件吗
回复

使用道具 举报

板凳
ID:261088 发表于 2017-12-13 16:19 | 只看该作者
程序不完整吧?连主程序main()都找不到
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表