找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9416|回复: 26
收起左侧

基于STC12C5A60S2的DS18B20温度显示工程(LCD1602显示)

  [复制链接]
ID:224782 发表于 2018-4-22 23:18 | 显示全部楼层 |阅读模式
STC12C5A60S2单片机DS18B20温度显示工程(LCD1602显示)的实物图如下:

实物照片

实物照片

单片机源程序如下:
  1. #include<STC12C5A60S2.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include<intrins.h>

  3. sbit RS = P1 ^ 0;   //定义端口
  4. sbit RW = P1 ^ 1;
  5. sbit EN = P2 ^ 5;
  6. sbit DS = P2 ^ 2;

  7. unsigned char code Table[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
  8. bit flag;
  9. unsigned char xdata a, b;

  10. #define DataPort P0


  11. /************************LCD1602函数************************/
  12. /******延时函数******/
  13. void DelayUs2x(unsigned char t)
  14. {   
  15.         while(--t);
  16. }
  17. /******延时函数******/
  18. void DelayMs(unsigned char t)
  19. {
  20.         while(t--)
  21.         {
  22.                 //大致延时1mS
  23.                 DelayUs2x(245);
  24.                 DelayUs2x(245);
  25.         }
  26. }
  27. /******判忙函数******/
  28. bit LCD_Check_Busy(void)
  29. {
  30.         DataPort = 0xFF;
  31.         RS = 0;
  32.         RW = 1;
  33.         EN = 0;
  34.         _nop_( );
  35.         EN = 1;
  36.         return (bit)(DataPort & 0x80);
  37. }
  38. /******写入命令函数******/
  39. void LCD_Write_Com(unsigned char com)
  40. {  
  41.         while(LCD_Check_Busy( )); //忙则等待
  42.         RS = 0;
  43.         RW = 0;
  44.         EN = 1;
  45.         DataPort = com;
  46.         _nop_( );
  47.         EN = 0;
  48. }
  49. /******写入数据函数******/
  50. void LCD_Write_Data(unsigned char Data)
  51. {
  52.         while(LCD_Check_Busy( )); //忙则等待
  53.         RS = 1;
  54.         RW = 0;
  55.         EN = 1;
  56.         DataPort = Data;
  57.         _nop_( );
  58.         EN = 0;
  59. }
  60. /******清屏函数******/
  61. void LCD_Clear(void)
  62. {
  63.         LCD_Write_Com(0x01);
  64.         DelayMs(5);
  65. }
  66. /******写入字符串函数******/
  67. void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s)
  68. {     
  69.         if (y == 0)
  70.         {     
  71.                 LCD_Write_Com(0x80 + x);     //表示第一行
  72.         }
  73.         else
  74.         {      
  75.                 LCD_Write_Com(0xc0 + x);      //表示第二行
  76.         }        
  77.         while (*s)
  78.         {     
  79.                 LCD_Write_Data(*s);     
  80.                 s ++;     
  81.         }
  82. }
  83. /******写入字符函数******/
  84. void LCD_Write_Char(unsigned char x, unsigned char y, unsigned char Data)
  85. {     
  86.         if (y == 0)
  87.         {     
  88.                 LCD_Write_Com(0x80 + x);     
  89.         }   
  90.         else
  91.         {     
  92.                 LCD_Write_Com(0xc0 + x);     
  93.         }        
  94.         LCD_Write_Data(Data);  
  95. }
  96. /******初始化函数******/
  97. void LCD_Init(void)
  98. {
  99.         LCD_Write_Com(0x38);    /*显示模式设置*/
  100.         DelayMs(5);
  101.         LCD_Write_Com(0x38);
  102.         DelayMs(5);
  103.         LCD_Write_Com(0x38);
  104.         DelayMs(5);
  105.         LCD_Write_Com(0x38);  
  106.         LCD_Write_Com(0x08);    /*显示关闭*/
  107.         LCD_Write_Com(0x01);    /*显示清屏*/
  108.         LCD_Write_Com(0x06);    /*显示光标移动设置*/
  109.         DelayMs(5);
  110.         LCD_Write_Com(0x0c);    /*显示开及光标设置*/
  111. }
  112.    

  113. /************************DS18B20函数************************/
  114. /******延时函数******/
  115. void DS18B20_Delay(unsigned int j)//延时j * 1us
  116. {
  117.         unsigned int i;
  118.         for(i = 0; i < j; i ++)
  119.         {
  120.                 _nop_( );//@11.0592M晶振(12M晶振:_nop_( );_nop_( );)
  121.         }
  122.         
  123. }
  124. /******初始化/复位函数******/
  125. void DS_Rest( )
  126. {
  127.         DS = 1;
  128.         DS18B20_Delay(60);
  129.         DS = 0;
  130.         DS18B20_Delay(700);
  131.         DS = 1;
  132.         DS18B20_Delay(150);
  133.         if(DS == 0)
  134.         {
  135.                 flag = 1;
  136.         }
  137.         else
  138.         {
  139.                 flag = 0;
  140.         }
  141.         DS18B20_Delay(200);
  142. }
  143. /******位读取函数******/
  144. bit DS_Read_Bit( )
  145. {
  146.         bit Dat;
  147.         DS = 0;
  148.         _nop_( );_nop_( );
  149.         DS = 1;
  150.         _nop_( );
  151.         Dat = DS;
  152.         DS18B20_Delay(100);
  153.         return Dat;
  154. }
  155. /******字节读取函数******/
  156. unsigned char DS_Read_Byte( )
  157. {
  158.         unsigned char idata i, j, k;
  159.         for(i = 0; i < 8; i ++)
  160.         {
  161.                 j = DS_Read_Bit( );
  162.                 k = (j << 7) | (k >> 1);
  163.         }
  164.         return k;
  165. }
  166. /******字节写函数******/
  167. void DS_Write_Byte(unsigned char Dat)
  168. {
  169.         unsigned char idata i;
  170.         for(i = 0; i < 8; i ++)
  171.         {
  172.                 DS = 0;
  173.                 _nop_( );
  174.                 DS = Dat & 0x01;
  175.                 DS18B20_Delay(70);
  176.                 DS = 1;
  177.                 Dat >>= 1;
  178.         }
  179.         DS18B20_Delay(70);
  180. }
  181. /******读取温度数据函数******/
  182. void Read_Temperature( )
  183. {
  184.         unsigned char xdata tvalue_L, tvalue_H;
  185.         float num;
  186.         
  187.         DS_Rest( );
  188.         DS_Write_Byte(0xcc);
  189.         DS_Write_Byte(0xbe);
  190.         tvalue_L = DS_Read_Byte( );
  191.         tvalue_H = DS_Read_Byte( );
  192.         tvalue_H <<= 4;
  193.         tvalue_H += (tvalue_L & 0xf0) >> 4;
  194.         a = tvalue_H;
  195.         num = (tvalue_L & 0x0f) * 0.0625;
  196.         b = (unsigned char)(num * 100);
  197. }
  198. /******温度显示函数******/
  199. void DS18B20_Display( )
  200. {
  201.         LCD_Write_String(0, 0, "The Temperature:");
  202.         LCD_Write_Char(0, 1, Table[a / 10]);
  203.         LCD_Write_Char(1, 1, Table[a % 10]);
  204.         LCD_Write_Char(2, 1, '.');
  205. ……………………

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

所有资料51hei提供下载:
基于STC12C5A60S2的DS18B20温度显示工程(LCD1602显示).zip (38.93 KB, 下载次数: 511)

评分

参与人数 2黑币 +60 收起 理由
兵临天下 + 10 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:288065 发表于 2018-4-24 08:24 | 显示全部楼层
挺好的,不错
回复

使用道具 举报

ID:315981 发表于 2018-4-25 11:20 | 显示全部楼层
很棒,可以试试。
回复

使用道具 举报

ID:324109 发表于 2018-5-16 14:19 | 显示全部楼层
为什么不能显示
回复

使用道具 举报

ID:277616 发表于 2018-5-25 11:57 | 显示全部楼层
特别好~~我写的一直都有warning,这个程序什么错都没有
回复

使用道具 举报

ID:332316 发表于 2018-5-28 15:03 | 显示全部楼层
您好,请问把程序烧到单片机中为什么初始温度值是85℃呢,如何修改一下直接显示实时温度呢,麻烦帮忙解决一下
回复

使用道具 举报

ID:170141 发表于 2018-8-20 23:28 | 显示全部楼层
fenfen625 发表于 2018-5-28 15:03
您好,请问把程序烧到单片机中为什么初始温度值是85℃呢,如何修改一下直接显示实时温度呢,麻烦帮忙解决一 ...

你可以把读取实时温度的函数写2次,屏蔽第一次不让显示,那样就不会显示85度了
回复

使用道具 举报

ID:391728 发表于 2018-8-30 19:20 | 显示全部楼层
我的也是不能显示啊 很难受
回复

使用道具 举报

ID:303383 发表于 2018-8-30 22:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:397622 发表于 2018-12-22 14:49 | 显示全部楼层
好好好
回复

使用道具 举报

ID:465014 发表于 2019-1-21 20:25 | 显示全部楼层
不错,研究一下
回复

使用道具 举报

ID:472756 发表于 2019-3-23 23:59 | 显示全部楼层
参考下
回复

使用道具 举报

ID:229821 发表于 2019-3-24 09:01 | 显示全部楼层
我的keil5.25中找不到STC12C5A60S2单片机。用c52代替的话。晶振选12M。吗?延时1us是一个_nop_吗?
回复

使用道具 举报

ID:229821 发表于 2019-3-24 12:32 | 显示全部楼层
谢谢分享啊。不错的东西。
回复

使用道具 举报

ID:229821 发表于 2019-3-26 11:17 | 显示全部楼层
可能我的ds坏了。无论连接不连接。lcd都显示5.93c。难受香菇
回复

使用道具 举报

ID:498577 发表于 2019-3-26 12:00 | 显示全部楼层
挺好收藏了
回复

使用道具 举报

ID:498577 发表于 2019-3-26 12:00 | 显示全部楼层
挺好,收藏了
回复

使用道具 举报

ID:416287 发表于 2019-3-26 18:39 | 显示全部楼层
fenfen625 发表于 2018-5-28 15:03
您好,请问把程序烧到单片机中为什么初始温度值是85℃呢,如何修改一下直接显示实时温度呢,麻烦帮忙解决一 ...

在你读这次的温度值时 先把上一次的值清除了
回复

使用道具 举报

ID:224782 发表于 2019-3-29 10:19 | 显示全部楼层
fenfen625 发表于 2018-5-28 15:03
您好,请问把程序烧到单片机中为什么初始温度值是85℃呢,如何修改一下直接显示实时温度呢,麻烦帮忙解决一 ...

这个程序就是简单地读取显示的程序,显示值是随实时温度变化改变的,如果你一直都显示85度的话可能是硬件的问题了
回复

使用道具 举报

ID:224782 发表于 2019-3-29 10:21 | 显示全部楼层
saya0769 发表于 2019-3-24 09:01
我的keil5.25中找不到STC12C5A60S2单片机。用c52代替的话。晶振选12M。吗?延时1us是一个_nop_吗?

用ISP烧录软件添加一下STC的型号和头文件就行了
回复

使用道具 举报

ID:500775 发表于 2019-4-1 19:25 | 显示全部楼层
好东西,学习一下
回复

使用道具 举报

ID:118735 发表于 2019-4-2 22:28 | 显示全部楼层
挺好的,不错
回复

使用道具 举报

ID:115740 发表于 2019-5-22 02:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:581127 发表于 2019-7-10 01:48 | 显示全部楼层
怎么温度为0??
回复

使用道具 举报

ID:282095 发表于 2019-7-10 09:17 | 显示全部楼层
可以同时显示温度和湿度吗
回复

使用道具 举报

ID:224782 发表于 2019-8-8 11:19 | 显示全部楼层
鹏博士PBs 发表于 2019-7-10 09:17
可以同时显示温度和湿度吗

这个只是DS18B20的测试程序,它只能测温度,湿度得别的传感器
回复

使用道具 举报

ID:848909 发表于 2020-11-25 12:48 | 显示全部楼层
以后能用到,mark一下,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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