单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20温度传感器PIC测温并用1602显示屏显示温度C程序

[复制链接]
跳转到指定楼层
楼主
xiaos 发表于 2015-4-2 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. //熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度
  2. //1、第一行显示:Temperature
  3. //2、第二行显示:实测温度值
  4. //**************************************************

  5. //**************************************************
  6. //硬件设置:
  7. //1、SW2,SW4开关全部断开
  8. //2、插上DS18B20温度传感器
  9. //**************************************************

  10. //**************************************************
  11. //*****************定义头文件**********************
  12. //**************************************************
  13. #include<PIC.h>
  14. #include "delay.h"

  15. //**************************************************
  16. //******************定义配置位*********************
  17. //**************************************************
  18. __CONFIG(0x3545);      
  19. //FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护
  20. //RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器

  21. //**************************************************
  22. //******************定义常量***********************
  23. //**************************************************
  24. #define uchar unsigned char
  25. #define uint  unsigned int

  26. //**************************************************
  27. //***************定义DS18B20引脚*******************
  28. //**************************************************
  29. #define DQ     RE0
  30. #define DQ_IO  TRISE0

  31. //**************************************************
  32. //******************定义LCD引脚*********************
  33. //**************************************************
  34. #define RS RA1
  35. #define RW RA2
  36. #define E  RA3

  37. //**************************************************
  38. //******************定义变量***********************
  39. //**************************************************
  40. uchar lowtemp,hightemp;  //低8位温度变量,高8位温度变量
  41. uchar zhengshu,xiaoshu;  //温度整数变量,温度小数变量
  42. uint temperature;        //转换后的温度值BCD码形式
  43. uchar temp[7];           //转换后温度存放变量

  44. //**************************************************
  45. //******************定义数据***********************
  46. //**************************************************
  47. //显示:  Temperature
  48. //显示:WWW.PICAVR.COM
  49. const uchar name[16]=
  50. //{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20};
  51. {0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x56,0x52,0x2E,0x43,0x4F,0x4D,0x20};

  52. //***********************************************
  53. //函 数 名:delayms(uchar time);
  54. //入口参数:time
  55. //出口参数:无
  56. //函数作用:毫秒延时
  57. //说    明:
  58. //***********************************************
  59. void delayms(uchar time)
  60. {
  61.   uint i;
  62.   while(time--)
  63.   {
  64.     for(i=93;i>0;i--){;}
  65.   }
  66. }

  67. //***********************************************
  68. //函 数 名:port_init();
  69. //入口参数:无
  70. //出口参数:无
  71. //函数作用:端口初始化
  72. //说    明:
  73. //***********************************************
  74. void port_init(void)
  75. {
  76.   ADCON1=0X07;   //设置RA,RE口为数字口
  77.   TRISA=0X00;    //设置RA口为输出口
  78.   TRISD=0X00;    //设置RD口为输出口
  79.   TRISE=0X00;    //设置RE口为输出口
  80.   OPTION=0X8F;   //分频给WDT,分频比为128
  81. }

  82. //***********************************************
  83. //函 数 名:lcd_enable();
  84. //入口参数:无
  85. //出口参数:无
  86. //函数作用:LCD写使能
  87. //说    明:
  88. //***********************************************
  89. void lcd_enable(void)
  90. {
  91.   RS=0;         //写命令
  92.   RW=0;         //写操作
  93.   E=0;          //低电平信号
  94.   delayms(10);  //低电平信号保持
  95.   E=1;          //拉高电平信号
  96. }

  97. //***********************************************
  98. //函 数 名:lcd_writebyte(uchar data);
  99. //入口参数:data
  100. //出口参数:无
  101. //函数作用:LCD写一个字节数据
  102. //说    明:
  103. //***********************************************
  104. void lcd_writebyte(uchar data)
  105. {
  106.   PORTD=data;   //向RD口写数据
  107.   RS=1;         //写数据
  108.   RW=0;         //写操作
  109.   E=0;          //低电平信号
  110.   delayms(10);  //低电平信号保持
  111.   E=1;          //拉高电平信号
  112. }

  113. //***********************************************
  114. //函 数 名:lcd_writedata(const uchar *ptt);
  115. //入口参数:*ptt
  116. //出口参数:无
  117. //函数作用:LCD写数据块函数
  118. //说    明:
  119. //***********************************************
  120. void lcd_writedata(const uchar *ptt)
  121. {
  122.   uchar i;
  123.   for(i=0;i<16;i++)         //写16个字节数据
  124.   {
  125.     lcd_writebyte(ptt[i]);  //查表写数据
  126.   }
  127. }

  128. //***********************************************
  129. //函 数 名:lcd_init();
  130. //入口参数:无
  131. //出口参数:无
  132. //函数作用:LCD初始化
  133. //说    明:
  134. //***********************************************
  135. void lcd_init(void)
  136. {
  137.   PORTD=0X01;    //清除显示
  138.   lcd_enable();
  139.   PORTD=0X38;    //8位2行5*7点阵
  140.   lcd_enable();
  141.   PORTD=0X0e;    //显示开,光标开,闪烁
  142.   lcd_enable();
  143.   PORTD=0X06;    //文字不动,光标右移
  144.   lcd_enable();
  145. }

  146. //***********************************************
  147. //函 数 名:ds18b20_reset();
  148. //入口参数:无
  149. //出口参数:无
  150. //函数作用:DS18B20复位
  151. //说    明:
  152. //***********************************************
  153. void ds18b20_reset(void)
  154. {
  155.   uchar x=1;
  156.   while(x)
  157.   {
  158.     DQ_IO=0;       //设置RE0为输出口
  159.     DQ=0;          //RE0输出低电平
  160.     DelayUs(201);  //延时503us(最短480us低电平信号)
  161.     DQ_IO=1;       //释放总线,进入接收(设置RE0为输入口)
  162.     DelayUs(29);   //延时70us(18b20检测到上升沿时,等待15-60us)
  163.     if(DQ){x=1;}   //有应答信号,跳出
  164.     else {x=0;}    //没有应答信号,继续复位(低电平持续在60-240us)
  165.     DelayUs(172);  //延时430us
  166.    }
  167. }

  168. //***********************************************
  169. //函 数 名:ds18b20_writebyte(uchar data);
  170. //入口参数:data
  171. //出口参数:无
  172. //函数作用:DS18B20写一个字节数据
  173. //说    明:
  174. //***********************************************
  175. void ds18b20_writebyte(uchar data)
  176. {
  177.   uchar i,temp;
  178.   for(i=8;i>0;i--)      //写8位数据
  179.   {
  180.     temp=data&0x01;     //先写低位数据
  181.     DQ_IO=0;            //设置RE0为输出口
  182.     DQ=0;               //RE0输出低电平
  183.     DelayUs(1);         //延时6us(15us之内把数据送到总线上)
  184.     if(temp){DQ_IO=1;}  //设置RE0为输入口(写1时序)
  185.     DelayUs(25);        //延时61us(总线采样时间15-60us)
  186.     DQ_IO=1;            //设置RE0为输入口(写0时序)
  187.     DelayUs(1);         //延时6us(写第二位时间间隙大于1us)
  188.     data=data>>1;       //右移一位
  189.   }
  190. }

  191. //***********************************************
  192. //函 数 名:ds18b20_readbyte();
  193. //入口参数:无
  194. //出口参数:无
  195. //函数作用:DS18B20读一个字节数据
  196. //说    明:
  197. //***********************************************
  198. unsigned char ds18b20_readbyte(void)
  199. {
  200.   uchar i,data=0;           //读出温度
  201.   for(i=8;i>0;i--)          //读8位数据
  202.   {
  203.     data=data>>1;           //数据先右移一位
  204.     DQ_IO=0;                //设置RE0为输出口
  205.     DQ=0;                   //RE0输出低电平
  206.     DelayUs(1);             //延时6us(低电平时间大于1us)
  207.     DQ_IO=1;                //拉高总线,产生读时间间隙(设置RE0为输入口)
  208.     DelayUs(1);             //延时6us(从拉低电平开始15us之内完成读位)
  209.     if(DQ){data=data|0x80;} //先读高位数据,高位为1
  210.     else  {data=data|0x00;} //高位为0
  211.     DelayUs(25);            //延时61us(从拉低电平开始60-120us之内释放总线)
  212.   }
  213.   return(data);
  214. }

  215. //***********************************************
  216. //函 数 名:read_ds18b20_data();
  217. //入口参数:无
  218. //出口参数:无
  219. //函数作用:读DS18B20测试的温度数据
  220. //说    明:
  221. //***********************************************
  222. void read_ds18b20_data(void)
  223. {
  224.   DQ_IO=1;                                   //设置RE0为输入口
  225.   ds18b20_reset();                           //调用复位函数
  226.   ds18b20_writebyte(0XCC);                   //跳过ROM匹配
  227.   ds18b20_writebyte(0X44);                   //发送温度变换命令
  228.   ds18b20_reset();                           //再次复位
  229.   ds18b20_writebyte(0XCC);                   //跳过ROM匹配
  230.   ds18b20_writebyte(0XBE);                   //发送读温度命令
  231.   lowtemp=ds18b20_readbyte();                //读出低8位温度值
  232.   hightemp=ds18b20_readbyte();               //读出高8位温度值
  233.   DQ_IO=1;                                   //释放总线
  234.   zhengshu=((lowtemp>>4)|(hightemp<<4))&0X3F;
  235.   xiaoshu=lowtemp<<4;
  236.   temp[0]=(zhengshu/100)%10;                 //整数百位
  237.   temp[1]=(zhengshu/10)%10;                  //整数十位
  238.   temp[2]=zhengshu%10;                       //整数个位
  239.   temperature=0;  
  240.   if(xiaoshu&0x80)                           //下面是把小数部分转换为BCD码形式
  241.   {
  242.     temperature+=5000;
  243.   }
  244.   if(xiaoshu&0x40)
  245.   {
  246.     temperature+=2500;
  247.   }
  248.   if(xiaoshu&0x20)
  249.   {
  250.     temperature+=1250;
  251.   }
  252.   if(xiaoshu&0x10)
  253.   {
  254.      temperature+=625;               
  255.   }            
  256.   temp[3]=(temperature/1000)%10;             //十分位                    
  257.   temp[4]=(temperature/100)%10;              //百分位
  258.   temp[5]=(temperature/10)%10;               //千分位
  259.   temp[6]=temperature%10;                    //万分位
  260.   DelayUs(1);                                //延时6us
  261. }

  262. //***********************************************
  263. //函 数 名:lcd_display_temp();
  264. //入口参数:无
  265. //出口参数:无
  266. //函数作用:LCD显示测试温度程序
  267. //说    明:
  268. //***********************************************
  269. void lcd_display_temp(void)
  270. {
  271.   PORTD=0X80;                    //设置第1行显示地址
  272.   lcd_enable();
  273.   lcd_writedata(name);           //调用显示函数
  274.   PORTD=0XC0;                    //设置第2行显示地址
  275.   lcd_enable();                  //调用写使能函数
  276.   lcd_writebyte(0x20);   
  277.   lcd_writebyte(0x20);
  278.   lcd_writebyte(0x20);
  279.   if(temp[0]==0)
  280.   {
  281.     lcd_writebyte(0x20);
  282.   }
  283.   else
  284.   {
  285.     lcd_writebyte(temp[0]+0x30);
  286.   }
  287.   lcd_writebyte(temp[1]+0x30);
  288.   lcd_writebyte(temp[2]+0x30);
  289.   lcd_writebyte(0x2e);
  290.   lcd_writebyte(temp[3]+0x30);
  291.   lcd_writebyte(temp[4]+0x30);
  292.   lcd_writebyte(temp[5]+0x30);
  293.   lcd_writebyte(temp[6]+0x30);
  294.   lcd_writebyte(0x20);
  295.   lcd_writebyte(0x43);
  296.   lcd_writebyte(0x20);
  297.   lcd_writebyte(0x20);
  298.   lcd_writebyte(0x20);
  299. }

  300. //***********************************************
  301. //函 数 名:main();
  302. //入口参数:无
  303. //出口参数:无
  304. //函数作用:MAIN函数
  305. //说    明:
  306. //***********************************************
  307. void main(void)
  308. {
  309.   port_init();           //调用端口初始化函数
  310.   lcd_init();            //调用LCD初始化函数
  311.   while(1)
  312.   {
  313.     read_ds18b20_data(); //调用温度转换函数
  314.     CLRWDT();            //清看门狗
  315.     lcd_display_temp();  //调用温度显示函数
  316.   }
  317. }
复制代码




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

使用道具 举报

沙发
Rnlblack 发表于 2019-6-10 11:01 来自手机 | 只看该作者
有图么
回复

使用道具 举报

板凳
djz_1688 发表于 2019-9-20 10:35 | 只看该作者
我现在就想做一个这个的东西,可以指导一下吗?
回复

使用道具 举报

地板
bbb168 发表于 2019-9-27 19:14 | 只看该作者
感谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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