单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 253|回复: 2
收起左侧

51单片机测温程序(18B20+LCD1602)

[复制链接]
简简单单♂ 发表于 2020-6-19 15:41 | 显示全部楼层 |阅读模式
本帖最后由 简简单单♂ 于 2020-6-19 15:49 编辑

  1. FILE NAME:                        main.c
  2. CHIP TYPE:                        STC12C5A60S2
  3. CLOCK FREQUENCY:        11.0592 MHZ
  4. IDE:                                WAVE SH51
  5. COMPILER:                        KEIL for 8051
  6. TIME:                                20/09/2013
  7. AUTHOR:                                RE
  8. VERSION:                        2.0
  9. HARDWARE CONNECT:        MAIN_BOARD       CPU_51
  10.                   RS     ---                           P0.6
  11.                                                 RW     ---                                 P0.5
  12.                                                 E      ---                           P0.4
  13.                                                 D0-D7  ---                           P1.0-P1.7
  14.                                                 CPU_51                 SENSOR
  15.                                                 P0.0   ---                   18B20_OUT
  16.                                 
  17. ***************************************************/
  18. #include<reg51.h>

  19. #define uchar unsigned char
  20. #define uint unsigned  int



  21. sbit DQ = P0^0;
  22. sbit RS = P0^6;
  23. sbit RW = P0^5;
  24. sbit EN = P0^4;

  25. uchar data disdata[7];

  26. uint tvalue;                        //温度值
  27. uchar tflag;                        //温度正负标志
  28.                                                                                           
  29. /********************************************************
  30.                           LCD1602相关程序
  31. ********************************************************/
  32. void delay1ms(unsigned int ms)         //延时1毫秒
  33. {
  34.         unsigned int i,j;
  35.         for(i=0;i<ms;i++)
  36.         {
  37.           for(j=0;j<100;j++);
  38.         }
  39. }

  40. void Lcd_Write_Com(unsigned char com)   //LCD1602的写指令程序
  41. {
  42.         delay1ms(1);
  43.         RS=0;
  44.         RW=0;
  45.         EN=0;
  46.         P1=com;
  47.         delay1ms(1);
  48.         EN=1;
  49.         delay1ms(1);
  50.         EN=0;
  51. }
  52. void Lcd_Write_Dat(unsigned char dat)    //LCD1602的写数据程序
  53. {
  54.         delay1ms(1);;
  55.         RS=1;
  56.         RW=0;
  57.         EN=0;
  58.         P1=dat;
  59.         delay1ms(1);
  60.         EN=1;
  61.         delay1ms(1);
  62.         EN=0;
  63. }
  64. void Lcd_Init()                            //LCD1602初始化设置
  65. {
  66.         delay1ms(15);
  67.         Lcd_Write_Com(0x38);delay1ms(5);
  68.         Lcd_Write_Com(0x08);delay1ms(5);
  69.         Lcd_Write_Com(0x01);delay1ms(5);
  70.         Lcd_Write_Com(0x06);delay1ms(5);
  71.         Lcd_Write_Com(0x0c);delay1ms(5);
  72. }

  73. void Lcd_1602_Display_String(uchar ad, uchar *s)//LCD1602的显示程序
  74. {
  75.         Lcd_Write_Com(ad);
  76.         while(*s>0)
  77.         {
  78.                 Lcd_Write_Dat(*s++);
  79.         }
  80. }

  81. /****************************************************
  82.                            DS18B20相关程序
  83. ****************************************************/
  84. void delay_18B20(unsigned int i)//延时1微秒
  85. {
  86.         while(i--);
  87. }

  88. void DS18B20_Reset()                        //DS18B20的复位程序
  89. {
  90.         unsigned char x=0;
  91.          DQ = 1;                        //DQ复位
  92.          delay_18B20(80);                //延时
  93.          DQ = 0;                        //DQ拉低
  94.          delay_18B20(750);              //精确延时大于480us    小于960us
  95.          DQ = 1;                        //拉高
  96.          delay_18B20(140);
  97. }

  98. uchar DS18B20_Read()                         //DS18B20的读数据程序
  99. {
  100.         unsigned char i=0;
  101.         unsigned char dat = 0;
  102.         for (i=8;i>0;i--)
  103.         {   
  104.                 DQ = 0;                        //给脉冲信号
  105.                 dat>>=1;
  106.                 DQ = 1;                    //给脉冲信号
  107.                 if(DQ)
  108.                 {
  109.                   dat|=0x80;
  110.                 }
  111.                 delay_18B20(40);
  112.         }
  113.         return(dat);
  114. }

  115. void DS18B20_Write(uchar wdata)   //DS18B20的写数据程序
  116. {
  117.         unsigned char i=0;
  118.         for (i=8; i>0; i--)
  119.         {
  120.                 DQ = 0;
  121.                 DQ = wdata&0x01;
  122.                 delay_18B20(40);
  123.                 DQ = 1;
  124.                 wdata>>=1;
  125.         }
  126. }

  127. /***************************************************
  128.               读取温度值并转换
  129. ***************************************************/
  130. DS18B20_Read_Temp()
  131. {
  132.         uchar a,b;
  133.         DS18B20_Reset();   
  134.         DS18B20_Write(0xcc);   //跳过读序列号
  135.         DS18B20_Write(0x44);   //启动温度转换
  136.         DS18B20_Reset();   
  137.         DS18B20_Write(0xcc);   //跳过读序列号
  138.         DS18B20_Write(0xbe);   //读取温度
  139.         a=DS18B20_Read();
  140.         b=DS18B20_Read();
  141.         tvalue=b;
  142.         tvalue<<=8;
  143.         tvalue=tvalue|a;
  144.         if(tvalue<0x0fff)
  145.         {
  146.                 tflag=0;
  147.         }
  148.         else
  149.         {
  150.                 tvalue=~tvalue+1;
  151.                 tflag=1;
  152.         }
  153.         tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小
  154.         return(tvalue);
  155. }

  156. /************************************************************
  157.                                   温度值显示
  158. *************************************************************/

  159. void DS18B20_Display()
  160. {   
  161.         uchar flagdat;
  162.         disdata[0]=tvalue/1000+0x30;     //百位数
  163.         disdata[1]=tvalue%1000/100+0x30; //十位数
  164.         disdata[2]=tvalue%100/10+0x30;   //个位数
  165.         disdata[3] = '.';                                 
  166.         disdata[4]=tvalue%10+0x30;                 //小数位
  167.         disdata[5]=0xDF;
  168.         disdata[6]='C';

  169.         Lcd_1602_Display_String(0x80, "Current Temp :");

  170.         if(tflag==0)
  171.         {
  172.     flagdat=0x20;//正温度不显示符号
  173.   }              
  174.         else
  175.         {
  176.     flagdat=0x2d;//负温度显示负号:-
  177.   }              
  178.         if(disdata[0]==0x30)
  179.         {
  180.                 disdata[0]=0x20;             //如果百位为0,不显示
  181.                 if(disdata[1]==0x30)
  182.                 {
  183.                         disdata[1]=0x20;         //如果百位为0,十位为0也不显示
  184.                 }
  185.         }
  186.         Lcd_Write_Com(0xc0);
  187.         Lcd_Write_Dat(flagdat);          //显示符号
  188.         Lcd_1602_Display_String(0xc1,disdata);
  189. }


  190. /******************************************************
  191.                     主函数
  192. ******************************************************/

  193. void main()
  194. {
  195.         Lcd_Init();                                    //清屏
  196.         while(1)
  197.         {
  198.                 DS18B20_Read_Temp();  //读取温度
  199.                 DS18B20_Display();    //显示
  200.         }
  201. }
复制代码


18B20温度测量实验.zip

99.33 KB, 下载次数: 27, 下载积分: 黑币 -5

回复

使用道具 举报

QQ820270087 发表于 2020-6-20 10:00 | 显示全部楼层
这是调试成功的代码吗
回复

使用道具 举报

 楼主| 简简单单♂ 发表于 2020-6-20 11:53 | 显示全部楼层
QQ820270087 发表于 2020-6-20 10:00
这是调试成功的代码吗

是的,调试完成了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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