找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7755|回复: 8
收起左侧

单片机DS18B20温度检测LCD1602显示程序+电路PCB设计

  [复制链接]
ID:396717 发表于 2018-12-26 09:44 | 显示全部楼层 |阅读模式
内容请自己看
制作出来的实物图如下:
温度_LCD显示IMG_4787.JPG 温度_LCD显示IMG_4788.JPG 温度_LCD显示IMG_4790.JPG 温度_LCD显示IMG_4791.JPG 温度_LCD显示IMG_4792.JPG

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

单片机源程序如下:
  1. /***********************************************
  2.                                                                 该程序为温度测量  
  3.                                                                 用到DS18B20、LCD1602
  4.                                                                                
  5. 备注:程序的许多地方也是理解了他人的程序才写出来的如果有理解错误、书写错误的地方望大家留言指导
  6. ***********************************************/

  7. #include <reg52.h>

  8. bit flag = 0;
  9. unsigned int Temp = 0;                                                       
  10. unsigned char str[6];                                                                                                                //用来存字符串
  11. unsigned char high;                                                                                                                        //定时器的高低8位
  12. unsigned char low;
  13. unsigned char L;                                                                                                                                //温度的小数部分
  14. unsigned char H;                                                                                                                                //整数部分

  15. extern bit Get_temperature(unsigned int *temp);
  16. extern void TemptoNum();       
  17. extern void LCD_Start();
  18. extern void LCD_Sta(unsigned char x, unsigned char y, unsigned char *p);

  19. unsigned char NumberToString(unsigned char *str, unsigned int dat);
  20. void configtime0(unsigned char ms);
  21. /****************************************
  22.                                                                 主函数
  23. ****************************************/
  24. void main()
  25. {
  26.         unsigned char len;
  27.         bit flag_ack = 0;
  28.        
  29.         EA = 1;                                                                                                                                        //开启总中断
  30.         LCD_Start();                                                                                                                //LCD初始化
  31.         configtime0(1);                                                                                                        //配置定时器
  32.         LCD_Sta(0,0,"Temp:");                                                                                //显示"Temp:"字符
  33.         TemptoNum();                                                                                                                //温度转换
  34.        
  35.         while(1)                                                                                                       
  36.         {
  37.                 if(flag)                                                                                                                                //1秒到了  标识位为1
  38.                 {
  39.                         flag = 0;                                                                                                                        //标识位置0
  40.                         flag_ack = Get_temperature(&Temp);                //获取温度值
  41.                         if(flag_ack)
  42.                         {
  43.                                 flag_ack = 0;
  44.                                 H = Temp >> 4;                                                                                        //分离出整数部分
  45.                                 L = Temp & 0x0F;                                                                                //分离出小数部分
  46.                                 L = L * 10 / 16;                                                                                //将小数部分转换成10进制数取出(这个地方我也想了好久才想明白,一开始自己写是写了%10,但是这样就存在不准确的问题,这么写我也是书上看来,先放大10倍,然后最大就是150,/16刚好为9,140/16为8,以此类推)
  47.                                 len = NumberToString(str, L);                                //将小数部分转换成字符
  48.                                 LCD_Sta(16-len,0,str);                                                        //显示在LCD的第一行的最后一位
  49.                                 LCD_Sta(14,0,".");                                                                        //倒数第二位是小数点
  50.                                 len +=1;                                                                                                                //长度加1,方便取整数的位置
  51.                                 len += NumberToString(str, H);                        //将整数部分转换成字符  返回的长度加上小数点和小数的长度
  52.                                 LCD_Sta(16-len,0,str);                                                        //显示在LCD上
  53.                         }
  54.                         TemptoNum();                                                                                                        //再一次温度转换
  55.                 }
  56.         }
  57. }
  58. /*******************************************
  59.                                                         数字转字符串
  60. *******************************************/
  61. unsigned char NumberToString(unsigned char *str, unsigned int dat)
  62. {
  63.         unsigned char buf[5];
  64.         unsigned char i = 0;
  65.         unsigned char len;
  66.        
  67.         do{                                                                                                                                                //将数字的每一位都取出来放入buf[]中
  68.                 buf[i++] = dat%10;
  69.                 dat = dat / 10;
  70.         }while(dat>0);                                                                                               
  71.         len = i;                                                                                                                        //算出长度
  72.         while(i-->0)                                                                                                        //将每一位都转换成字符
  73.         {
  74.                 *str++ = buf[i] + '0';       
  75.         }
  76.        
  77.         return len;
  78. }
  79. /***************************************
  80.                                                         定时器配置
  81. ***************************************/
  82. void configtime0(unsigned char ms)                                                                                               
  83. {
  84.         unsigned long tmp;
  85.        
  86.         tmp = 12000000/12;
  87.         tmp = tmp*ms/1000;
  88.         tmp = 65536 - tmp;
  89.         high = (unsigned char)(tmp>>8);
  90.         low  = (unsigned char)tmp;
  91.         TMOD = 0x01;
  92.         TH0 = high;
  93.         TL0 = low;
  94.         TR0 = 1;
  95.         ET0 = 1;
  96. }
  97. /*************************************
  98.                                                         中断函数
  99. ……………………

  100. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
温度_LCD显示.7z (623 KB, 下载次数: 359)

评分

参与人数 4黑币 +67 收起 理由
joeliang + 12
关外秀才 + 3 赞一个!
魔法少女 + 2 有用,感谢
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:532392 发表于 2019-5-10 12:40 | 显示全部楼层
非常棒
回复

使用道具 举报

ID:535492 发表于 2019-5-11 15:24 | 显示全部楼层
赞一个 优秀
回复

使用道具 举报

ID:503018 发表于 2019-6-22 22:59 | 显示全部楼层
感谢啊,,非常有用啊
回复

使用道具 举报

ID:555539 发表于 2019-10-27 20:42 | 显示全部楼层
赞一个!
回复

使用道具 举报

ID:330370 发表于 2019-10-28 08:55 | 显示全部楼层
good!thank you
回复

使用道具 举报

ID:473694 发表于 2020-1-8 13:44 | 显示全部楼层
厉害了,非常感谢
回复

使用道具 举报

ID:745043 发表于 2020-5-6 10:15 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:861694 发表于 2020-12-16 20:27 | 显示全部楼层
有仿真截图就好了,但还是感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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