找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS1820温度测量1602显示的单片机源码

[复制链接]
跳转到指定楼层
楼主
利用51单片机,DS1820温度传感器可以实现实时温度检测。        


单片机源程序如下:
  1. ///无线模块板
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit k1=P3^5;
  7. sbit k2=P3^4;
  8. sbit k3=P3^3;
  9. sbit k4=P3^2;
  10. sbit DQ=P3^7;                         //ds18b20
  11. // 1602
  12. sbit lcden=P0^5;
  13. sbit lcdrs=P0^7;
  14. sbit lcdrw=P0^6;
  15. sbit bell=P3^6;
  16. uint        a[19];
  17. uint wendu=0;
  18. uint time=0;
  19. uchar        fen=0;
  20. uchar        miao=0;
  21. ////////  1602
  22. void delay1ms(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=114;y>0;y--);
  27. }

  28. void write_com(uchar com)
  29. {
  30.         lcdrs=0;
  31.         P2=com;
  32.         delay1ms(5);
  33.         lcden=1;
  34.         delay1ms(5);
  35.         lcden=0;
  36. }

  37. void write_data(uchar date)
  38. {
  39.         lcdrs=1;
  40.         P2=date;
  41.         delay1ms(5);
  42.         lcden=1;
  43.         delay1ms(5);
  44.         lcden=0;
  45. }
  46. void write_str(uchar *str)  
  47. {  
  48. while(*str!='\0')  //未结束   
  49. {  
  50.   write_data(*str++);  
  51.   delay1ms(1);  
  52. }  
  53. }
  54. void init_1602()
  55. {
  56. //        uchar num;
  57.         uchar table[16]={0};
  58.         uchar table1[16]={0};
  59.         lcdrw=0;
  60.         lcden=0;
  61.         write_com(0x38);       
  62.         write_com(0x0e);
  63.         write_com(0x06);
  64.         write_com(0x01);
  65.         write_com(0x80);
  66. /*        for(num=0;num<16;num++)
  67.         {
  68.                 write_data(table[num]);
  69.                 delay1ms(10);
  70.         }
  71.         write_com(0x80+0x40);
  72.         for(num=0;num<16;num++)
  73.         {
  74.                 write_data(table1[num]);
  75.                 delay1ms(10);
  76.         }
  77. */
  78. }
  79. /////         ////                         ds18b20

  80. bit init_DS18B20()
  81. {
  82.         uchar num;
  83.         bit flag;
  84.         DQ=1;
  85.         for(num=0;num<2;num++);  //先拉高
  86.         DQ=0;
  87.         for(num=0;num<200;num++);  // 480-960us        powerup
  88.         DQ=1;
  89.         for(num=0;num<20;num++);        //  >60us   wait
  90.         flag=DQ;                                        // 响应
  91.         for(num=0;num<150;num++);        //         60-240us ds18b20存在信号
  92.         DQ=1;
  93.         return flag;
  94. }

  95. void DS18B20_WR_CHAR(uchar byte)        // 先写低位
  96. {       
  97.         uchar num;
  98.         uchar num1;
  99.         for(num1=0;num1<8;num1++)
  100.         {                
  101.                 DQ=0;                //拉低
  102.                 _nop_();        //下拉1us
  103.                 _nop_();
  104.                 DQ=byte&0x01;
  105.                 for(num=0;num<20;num++);        //  >60us   wait
  106.                 byte>>=1;       
  107.                 DQ=1;          //拉高       
  108.                 _nop_();
  109.                 _nop_();
  110.         }               
  111. }

  112. uchar DS18B20_RD_CHAR()        //先读低位
  113. {
  114.         uchar num;
  115.         uchar num1;
  116.         uchar byte=0;
  117.         for(num1=0;num1<8;num1++)
  118.         {
  119.                 DQ=0;          //拉低
  120.                 _nop_();
  121.                 DQ=1;
  122.                 for(num=0;num<1;num++);  // <10us        
  123.                 byte>>=1;
  124.                 if(DQ==1)
  125.                         byte|=0x80;
  126.                 else
  127.                         byte|=0x00;
  128.                 DQ=1;        //拉高
  129.                 _nop_();
  130.                 _nop_();
  131.                 for(num=0;num<20;num++);  //  >60us
  132.                
  133.         }
  134.         return byte;
  135. }

  136. uint DS18B20_WENDU()
  137. {
  138.         uchar temperaturel=0,temperatureh=0;
  139.         uint temperature=0;
  140.         if(init_DS18B20()==0)
  141.         {
  142.                 DS18B20_WR_CHAR(0xcc);
  143.                 DS18B20_WR_CHAR(0x44);
  144.                 delay1ms(500);
  145.                 if(init_DS18B20()==0)
  146.                 {       
  147.                         DS18B20_WR_CHAR(0xcc);
  148.                         DS18B20_WR_CHAR(0xBE);
  149.                         _nop_();
  150.                         temperaturel=DS18B20_RD_CHAR();
  151.                         temperatureh=DS18B20_RD_CHAR();
  152.                         temperature=(temperatureh*256+temperaturel)*0.625;
  153.                         init_DS18B20();
  154.                 }
  155.                 return temperature;                               
  156.         }
  157. }

  158. void xianshi()
  159.         {
  160.    
  161.                         fen=time/60;
  162.                         miao=time%60;

  163.                           
  164.                         write_com(0x80);
  165.                         write_str("time    temp    ");
  166.                         write_com(0x80+0x40);
  167.                         write_data(fen/10+48);
  168.                         write_data(fen%10+48);
  169.                         write_data(':');
  170.                         write_data(miao/10+48);
  171.                         write_data(miao%10+48);                  // 0xdf
  172.                         write_data(0x20);                  // 0xdf
  173.                         write_data(0x20);                  // 0xdf
  174.                         write_data(0x20);                  // 0xdf
  175.                        
  176.                         write_data((wendu/100)%10+48);
  177.                         write_data((wendu/10)%10+48);
  178.                         write_data('.');
  179.                         write_data(wendu%10+48);
  180.                         write_data(0xdf);                  // 0xdf
  181.                         write_data('c');
  182.                        
  183.                   
  184.         }
  185. ///////
  186. main()
  187. {

  188.         uchar i=0;
  189.         init_1602();
  190.         delay1ms(1000);
  191.          if( init_DS18B20()==0)
  192.          {
  193.          wendu=DS18B20_WENDU();
  194.          }
  195.          delay1ms(1000);

  196.         while(1)
  197.         {
  198.         if( init_DS18B20()==0)
  199.          {
  200.          wendu=DS18B20_WENDU();
  201.          }
  202.         xianshi();
  203.         if(k1==0)
  204.         {
  205.         time=0;
  206.         bell=0;
  207.         delay1ms(50);
  208.         bell=1;
  209.         delay1ms(200);
  210.         while(time<721&&k4)
  211.         {
  212.          if( init_DS18B20()==0)
  213.          {
  214.          wendu=DS18B20_WENDU();
  215.          }
  216.          
  217.          xianshi();
  218.                         delay1ms(190);                   //200
  219.                         if(time==0){a[0]=wendu;}
  220.                         if(time==60){a[1]=wendu;}
  221.                         if(time==120){a[2]=wendu;}
  222.                         if(time==180){a[3]=wendu;}
  223.                         if(time==240){a[4]=wendu;}
  224.                         if(time==300){a[5]=wendu;}
  225.                         if(time==315){a[6]=wendu;}
  226.                         if(time==330){a[7]=wendu;}
  227.                         if(time==345){a[8]=wendu;}
  228.                         if(time==360){a[9]=wendu;}
  229.                         if(time==375){a[10]=wendu;}
  230.                         if(time==390){a[11]=wendu;}
  231.                         if(time==405){a[12]=wendu;}
  232.                         if(time==420){a[13]=wendu;}
  233.                         if(time==480){a[14]=wendu;}
  234.                         if(time==540){a[15]=wendu;}
  235.                         if(time==600){a[16]=wendu;}
  236.                         if(time==660){a[17]=wendu;}
  237.                         if(time==720){a[18]=wendu;}
  238.          time++;
  239.         }
  240.         time--;
  241.         bell=0;
  242.         delay1ms(50);
  243.         bell=1;
  244.         }
  245.         if(k2==0)
  246.         {
  247.          i=0;
  248.          bell=0;
  249.         delay1ms(50);
  250.         bell=1;

  251.          while(k1)
  252.          {
  253.          if(k4==0&&i<18)
  254.          {
  255.          i++;
  256.          bell=0;
  257.         delay1ms(50);
  258.         bell=1;
  259.          delay1ms(300);
  260.          }
  261.          if(k3==0&&i>0)
  262.          {
  263.          i--;
  264.          bell=0;
  265.         delay1ms(50);
  266.         bell=1;
  267.          delay1ms(300);
  268.          }
  269.                          if(i==0){time=0;wendu=a[0];}
  270.                         if(i==1){time=60;wendu=a[1];}
  271.                         if(i==2){time=120;wendu=a[2];}
  272.                         if(i==3){time=180;wendu=a[3];}
  273.                         if(i==4){time=240;wendu=a[4];}
  274.                         if(i==5){time=300;wendu=a[5];}
  275.                         if(i==6){time=315;wendu=a[6];}
  276.                         if(i==7){time=330;wendu=a[7];}
  277.                         if(i==8){time=345;wendu=a[8];}
  278.                         if(i==9){time=360;wendu=a[9];}
  279.                         if(i==10){time=375;wendu=a[10];}
  280.                         if(i==11){time=390;wendu=a[11];}
  281.                         if(i==12){time=405;wendu=a[12];}
  282.                         if(i==13){time=420;wendu=a[13];}
  283.                         if(i==14){time=480;wendu=a[14];}
  284.                         if(i==15){time=540;wendu=a[15];}
  285.                         if(i==16){time=600;wendu=a[16];}
  286.                         if(i==17){time=660;wendu=a[17];}
  287.                         if(i==18){time=720;wendu=a[18];}


  288.          xianshi();
  289.          delay1ms(500);
  290.          }
  291.         bell=0;
  292.         delay1ms(50);
  293.         bell=1;
  294.         time=0;
  295.          while(!k1);
  296.         delay1ms(600);
  297.          }
  298.        
  299.         }
  300.         }

复制代码

所有资料51hei提供下载:
326 温度测量1602显示.rar (31.37 KB, 下载次数: 25)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:194581 发表于 2019-5-6 18:18 | 只看该作者
感谢大佬分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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