⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.txt

📁 DS18b20测温及12864液晶显示 可用来做温度计
💻 TXT
字号:
DS18b20测温及12864液晶显示加入收藏
            网站地图
            网站搜索
            繁體 

      首页  业界新闻  嵌入式编程  PC编程  DSP ARM 单片机  自动控制  测量检验  进入技术论坛 
        软硬件开发网 论坛 C++,VC,VB,DSP,ARM,MCU → 嵌入式编程 

      阅读新闻 



      DS18b20测温及12864液晶显示
            [日期:2007-07-17]来源:  作者:[字体:大 中 小] 

      #i nclude<reg51.h>
      #i nclude<math.h>
      #i nclude<intrins.h>


      /************定义端口****************/
      sbit DA=P2^7;                        /*DS18B20的数据端口*/

      sbit RS=P2^3;            
      sbit RW=P2^2;            
      sbit E=P2^1;             
      sbit PSB=P2^0;


      /*************定义变量****************/
      unsigned char temp1,temp2;                /*温度的小数部分和整数部分*/
      unsigned int temp;                       /*温度*/
      float tempdecimal;                       /*温度小数部分用小数表示*/
      unsigned char data i;                    /*用于循环的变量*/  



      /*******DS18B20函数原型说明*************/
      bit reset(void);
      void DSinit(void);
      void DSWrite(unsigned char val);
      unsigned char DSRead(void);
      void DSTrans(void);



      /***********LCD函数原型说明************/
      void LCDinit();
      void LCDDispTemp();
      void LCDwritedata(unsigned char da);
      void LCDwritecmd(unsigned char cmd);
      void LCDwait();
      void LCDlocate(unsigned char pox,unsigned char poy);
      void delay400ms();
      void delay1s();
      void delay100us();
      void delay15(unsigned char count);
      void delayms(unsigned char k);





      /*****************主函数*****************/
      void main(void)
      {
         LCDinit();
         delay400ms();
         LCDwritedata(0x36);
         DSinit();
         while(1)
         {
             DSTrans();
             tempdecimal=temp1*0.0625;
             //LCDDispTemp();
         }
      }
          


      /*************DS18B20初始化***********/
      bit reset(void)
      {
          bit ack;
          DA=1;
          _nop_();
          DA=0;
          delay15(32);
          DA=1;
          delay15(4);
          ack=DA;
          delay15(16);
          return(ack);
      }

      /************写到DS18B20一个字节*********/
      void DSWrite(unsigned char val)
      {
          unsigned char i;
          bit vb;
          for(i=0;i<8;i++)
          {
              vb=val&0x01;
              DA=0;
              delay15(1);
              DA=vb;
              delay15(2);
              DA=1;
              val>>=1;
              }
      }
      /***********从DS18B20读一个字节************/
      unsigned char DSRead(void)
      {
           unsigned char i,dat;
           dat=0;
           for(i=0;i<8;i++)
           {
               dat>>=1;
               DA=1;
               DA=0;
               _nop_();
               _nop_();
               DA=1;
               delay15(1);
               if(DA)dat|=0x80;
               delay15(4);
               }
           return(dat);
      }


      /******************DS18B20初始化***************/
      void DSinit(void)
      {
          bit flag;
          do{ flag=reset();}while(flag);
          DSWrite(0xcc);
          DSWrite(0x4e);
          DSWrite(0x64);
          DSWrite(0x00);
          DSWrite(0x7f);
      }


      /***********DS18B20测量温度************/
      void DSTrans(void)
      {
          unsigned char a,b;
          bit flag;
          do{ flag=reset();}while(flag);
          DSWrite(0xcc);
          DSWrite(0x44);
          delay1s();
          do{ flag=reset();}while(flag);
          DSWrite(0xcc);
          DSWrite(0xbe);
          a=DSRead();
          b=DSRead();
          DSRead();
          DSRead();
          DSRead();
          DSRead();
          DSRead();
          DSRead();
          DSRead();
          temp=b;
          temp=temp<<8;
          temp|=a;
          if((temp&0x0800)==0x0800) 
          {
              temp|=0xf000;
              temp=~temp+1;
          }
          temp1=temp&0x000f;
          temp=temp>>4;
          temp2=temp;
          //LCDwritedata(0x42);
          //LCDlocate(2,2);
          //LCDwritedata(temp1);
          //LCDwritedata(temp2);
          //while(1);
      }
          
          





      /**********LCD初始化************/
      void LCDinit()                       
      {
          PSB=0;
          delay400ms();                 
          PSB=1; 
          delay400ms();
          LCDwritecmd(0x30);
          delay100us();                   
          LCDwritecmd(0x0c);
          delay100us();           
          LCDwritecmd(0x01);
          delay100us();           
          LCDwritecmd(0x06); 
          delay100us();       
          
      }

      /*************向LCD写一个字节数据*************/
      void LCDwritedata(unsigned char da)                     
      {
          LCDwait();
          RS=1;
          RW=0;
          P0=da;
          E=1;
          E=0;
      }

      /*************向LCD写一个字节命令*************/
      void LCDwritecmd(unsigned char cmd)               
      {
          LCDwait();
          RS=0;
          RW=0;
          P0=cmd;
          E=1;
          E=0;
      }

      /*************等待LCD空闲****************/
      void LCDwait()                                        
      {
          RS=0;
          RW=1;
          P0=0XFF;
          E=1;
          while(P0&0x80);
          E=0;
      }

      /**************LCD显示定位****************/
      void LCDlocate(unsigned char pox,unsigned char poy)     
      {   unsigned char data pos;
          if(pox&0x01) 
               {  
                   pos=poy|0x80;
                   if(pox&0x02) pos+=0x07;
                   else  pos-=0x01;            
                
                }
          else {
                   pos=poy|0x90;
                   if(pox&0x02) pos-=0x01;
                   else pos+=poy|0x07; 
                }
           LCDwritecmd(pos);
      }



      /**************LCD显示温度****************/
      void LCDDispTemp(void)
      {
          unsigned int a;
          unsigned char num1[3],num2[4];
          //temp1=0x0f;
          //temp2=12;
          //tempdecimal=0.856;
          for(i=2;i>=0;i--)
          {
              num1=0x30+temp2%10;
              temp2=temp2/10;
              if(!i) break;
          }
          a=tempdecimal*10000;
          for(i=3;i>=0;i--)
          {
              num2=0x30+a%10;
              a/=10;
              if(!i) break;
          }
          for(i=0;i<=2;i++)
              if(num1!=0x30) break;
          LCDlocate(2,2);
          if(i==3) LCDwritedata(0x30);
          else  for(;i<=2;i++)  LCDwritedata(num1);
          LCDwritedata(0x2e);
          for(i=0;i<4;i++)  LCDwritedata(num2);
      }


      /***************延时函数******************/
      void delay400ms()
      {
          unsigned int data j;
          for(i=5;i>0;i--)
              for(j=7269;j>0;j--);
      }

      void delay1s()
      {
          unsigned int data j;
          for(i=100;i>0;i--)
             for(j=1000;j>0;j--);
      }

      void delay100us()
      {
          for(i=10;i>0;i--);
      }


      void delayms(unsigned char k)
      {
          unsigned int data j;
          for(i=0;i<j;i++)
              for(j=0;j<100;j++)  
      }
           
      void delay15(unsigned char count)
      {
         while(count)
         {
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             count--;
             }
      }




                  阅读: 次
                  录入:admin



            【 评论 】 【 推荐 】 【 打印 】 
            上一篇:《Windows CE 开发初步》
            下一篇: 


      相关新闻       


      本文评论       全部评论 


      发表评论 
                    
                    
            点评:  字数 
            姓名:   

              尊重网上道德,遵守中华人民共和国的各项有关法律法规 
              承担一切因您的行为而直接或间接导致的民事或刑事法律责任 
              本站管理人员有权保留或删除其管辖留言中的任意内容 
              本站有权在网站内转载或引用您的评论 
              参与本评论即表明您已经阅读并接受上述条款 


       

      网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式
      Copyright &copy; allnode.com Powered by 
      陕ICP备05009440号
        本站法律顾问:李朝阳律师 
        iwms 4.5 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -