找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LCD1602显示DS18B20采集的温度程序(带负温度显示)

[复制链接]
跳转到指定楼层
楼主
LCD1602显示DS18B20采集的温度,附件包含完整程序及仿真设计


单片机源程序如下:
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. #define uchar unsigned char           //宏定义
  6. sbit DQ = P3^7;                             //定义DS18B20总线I/O
  7. #define LCD_DB P1                                //定义LCD数据口
  8. sbit LCD_RS=P2^0;
  9. sbit LCD_RW=P2^1;
  10. sbit LCD_E=P2^2;       
  11. void delay_n40us(uint n);          //函数申明
  12. uint ReadTemperature(void);   //函数申明
  13. void Delay_DS18B20(int num);   //函数申明                                  



  14. //**********写入LCD指令**********写入命令****************
  15. void LCD_write_command(uchar dat)
  16. {
  17. LCD_DB=dat;
  18. LCD_RS=0;//指令
  19. LCD_RW=0;//写入
  20. LCD_E=1;//允许
  21. LCD_E=0;//产生下降沿
  22. delay_n40us(1);//实践证明,我的LCD1602 上,用for 循环1 次就能完成普通写指令。
  23. }


  24. //*******************************
  25. //********再写数据函数*****向1602中写入数据********
  26. void LCD_write_data(uchar dat)
  27. {
  28. LCD_DB=dat;
  29. LCD_RS=1;//数据
  30. LCD_RW=0;//写入
  31. LCD_E=1;//允许
  32. LCD_E=0;//产生下降沿
  33. delay_n40us(1);
  34. }


  35. //************8LCD初始化**************
  36. void LCD_init(void)
  37. {
  38. LCD_write_command(0x38);//设置8位格式,2行,5x7
  39. LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  40. LCD_write_command(0x06);//设定输入方式,增量不移位--------------
  41. LCD_write_command(0x01);//清除屏幕显示----------------
  42. delay_n40us(100);//实践证明,我的LCD1602上,用for 循环200 次就能可靠完成清屏指令。
  43. }



  44. //********延时函数***************
  45. void delay_n40us(uint n)
  46. { uint i;
  47. uchar j;
  48. for(i=n;i>0;i--)
  49. for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
  50. } //实践证明我的LCD1602 上普
  51. //通的指令只需1次循环就能可靠完成。

  52. //*************88延时子程序
  53. void Delay_DS18B20(int num)
  54. {
  55.   while(num--) ;
  56. }
  57. //***********8初始化DS18B20
  58. void Init_DS18B20(void)
  59. {
  60.   bit q;
  61.     //DQ = 1;                                //把总线拿高
  62.         //Delay_DS18B20(1);            //15us
  63.         DQ = 0;                                //给复位脉冲
  64.         Delay_DS18B20(80);                //750us
  65.         DQ = 1;                                //把总线拿高 等待
  66.         Delay_DS18B20(8);                //120us
  67.         q = DQ;                                //读取18b20初始化信号
  68.         Delay_DS18B20(30);                //等待450us确保初始化成功
  69.         DQ = 1;                                //把总线拿高 释放总线*/

  70. }
  71. //***********从1820读一个字节
  72. uchar ReadOneChar(void)
  73. {
  74.   unsigned char i=0;
  75.   uchar dat=0;
  76.   for (i=8;i>0;i--)
  77.   {
  78.     bit x;
  79.         dat>>=1;         //        右移一位
  80.     DQ = 0;     // 给复位脉冲信号
  81.     DQ = 1;     // 拉高电平确实读给脉冲信号
  82.         x=DQ;                //读总线输出一位数据
  83.     if(x)
  84.     dat|=0x80; //高电平保存数据
  85.     Delay_DS18B20(5);//等待75us
  86. }
  87. return (dat); //返回读出的十进制数据
  88. }


  89. //*********向1820写一个字节
  90. void WriteOneChar(unsigned char dat)
  91. {
  92. unsigned char i=0;
  93.   for (i=8; i>0; i--)
  94.   {
  95.     DQ = 0;                        // 给复位脉冲信号
  96.     DQ = dat&0x01;        //写入一位数据
  97.     Delay_DS18B20(5); //等待75微妙确保数据写入
  98.     DQ = 1;                          //释放总线为高电平
  99.     dat>>=1;
  100.   }
  101. }
  102. //读取温度
  103. uint ReadTemperature(void)
  104. {
  105.   uchar a=0;
  106.   uint t=0;
  107.   Init_DS18B20();
  108.   Delay_DS18B20(50);
  109.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  110.   WriteOneChar(0x44);  //启动温度转换
  111.   Init_DS18B20();

  112.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  113.   WriteOneChar(0xBE);  //读取温度寄存器

  114.   a=ReadOneChar();     //读低8位
  115.   t=ReadOneChar();    //读高8位
  116. t <<= 8;
  117. t|=a;
  118.   return(t);
  119. }

  120. //延时子程序
  121. void Delay(int num)
  122. {
  123. while( --num );
  124. }

  125. //显示温度子程序
  126. void Disp_Temperature(void)     //显示温度
  127. {
  128.    uint h;
  129.         int feng,ge,shi,bai;

  130.           LCD_init();                          //LCD初始化
  131.           LCD_write_command(0x80);//第一行写入数据
  132.           LCD_write_data('T');          //写T
  133.           delay_n40us(15000);          //延迟
  134.           LCD_write_data('e');
  135.           delay_n40us(15000);
  136.           LCD_write_data('m');
  137.           delay_n40us(15000);
  138.           LCD_write_data('p');
  139.           delay_n40us(15000);
  140.           LCD_write_data(':');
  141.           delay_n40us(15000);



  142.           h= ReadTemperature();
  143.           if(h<=0x07d0)                  //判断温度为正
  144.         {
  145.         h*=0.625;
  146.         bai=h/1000;                     
  147.         feng=h%10;
  148.         ge=h/10%10;
  149.         shi=h/100;
  150.           LCD_write_command(0x80+5);  //从第一行第六个开始显示
  151.           LCD_write_data(0x30+bai);
  152.           delay_n40us(15000);
  153.   
  154.       LCD_write_command(0x80+6);
  155.           LCD_write_data(0x30+shi);
  156.           delay_n40us(15000);
  157.           LCD_write_data(0x30+ge);
  158.           delay_n40us(15000);
  159.           LCD_write_data('.');
  160.           delay_n40us(15000);
  161.           LCD_write_data(0x30+feng);
  162.           delay_n40us(15000);
  163.           }
  164.           else                                          //温度为负时
  165.           {
  166.           h=h-1;                                  //减1取反
  167.           h=(~h);
  168.           h*=0.625;
  169.                                
  170.         feng=h%10;
  171.         ge=h/10%10;
  172.         shi=h/100;
  173.           LCD_write_command(0x80+5);  
  174.           LCD_write_data('-');               
  175.           delay_n40us(15000);
  176.   
  177.           LCD_write_data(0x30+shi);
  178.           delay_n40us(15000);
  179.           LCD_write_data(0x30+ge);
  180.           delay_n40us(150000);
  181.           LCD_write_data('.');
  182.           delay_n40us(1500);
  183.           LCD_write_data(0x30+feng);
  184.           delay_n40us(15000);
  185.           }

  186.           //*************显示C*************
  187.           LCD_write_command(0x80+10);
  188.           LCD_write_data('C');
  189.           delay_n40us(15000);
  190.           

  191. }

  192. //主函数
  193. void main(void)
  194. {
  195.    Init_DS18B20();
  196.    while(1)
  197.    {
  198.    Disp_Temperature();
  199.         }
  200.   
  201. }
复制代码

所有资料51hei提供下载:
LCD1602显示DS18B20采集的温度.zip (357.22 KB, 下载次数: 91)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:520434 发表于 2021-6-4 14:42 | 只看该作者
Proteus8.8可以 但是protues8.9版本lcd无法显示,DS180也是没办法运行的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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