电源设计技术实用资料点击免费获取>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 关于蓝桥杯训练小程序(4)ds18b20练习


共3条 1/1 1 跳转至

关于蓝桥杯训练小程序(4)ds18b20练习

菜鸟
2019-01-24 22:49:39    评分

这是关于蓝桥杯备赛路上练习的小程序,蓝桥杯的竞赛路上希望大家互相勉励。      

  •  祝大家有个好成绩。  

  • 以下代码是我利用手头上小红板(JW-51)训练的小程序。  

  • 希望大家一同进步。  

  • 这次程序是在大家的帮助下完成的,再次感谢大家的帮助。

     

  • /*数码管+ds18b20*/
    #include<reg52.h>
    
    #include<intrins.h>
    
    typedef unsigned char u8;
    
    typedef unsigned int u16;
    
    sbit ds=P2^2;
    
    sbit ser=P2^7;
    
    sbit srclk=P2^6;
    
    sbit rclk=P2^5;
    
    bit flag;
    
    u8 a,b;
    
    unsigned char code smgduan[]={0x3f,
    
      0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
    
      0x77,0x7c,0x39,0x5e,0x79,0x71};
    
       unsigned char code smgwei[]={0xfe,
    
      0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    
    void delayms(u16 n);
    
    void TempDelay(u16 us);
    
      void send_595(u8 dat);
    
    void ds_reset()
    
    {
    
     ds=1;
    
     _nop_();
    
     ds=0;
    
     TempDelay(80);//520us
    
     ds=1;
    
     TempDelay(5);
    
     if(ds==0)
    
      flag=1;
    
     else
    
      flag=0;
    
     TempDelay(20);
    
     ds=1;
    
    }
    
    bit ds_read_bit()
    
    {
    
     bit dat;
    
     ds=0;
    
     _nop_();
    
     _nop_();
    
     ds=1;
    
     _nop_();
    
     dat=ds;
    
     TempDelay(12);
    
     return dat;
    
    }
    
    u8 ds_read_byte()
    
    {
    
     u8 i,j,value;
    
     for(i=0;i<8;i++)
    
     {
    
      j=ds_read_bit();
    
      value=(j<<7)|(value>>1);
    
     }
    
     return value;
    
    }
    
    void ds_write_byte(u8 dat)
    
    {
    
     u8 i,onebit;
    
     for(i=0;i<8;i++)
    
     {
    
      onebit=dat&0x01;
    
      if(onebit)    //?1
    
      {
    
       ds=0;
    
       TempDelay(1);
    
       ds=1;
    
       _nop_();
    
      }
    
      else  //?0
    
      {
    
       ds=0;
    
       TempDelay(11);
    
       ds=1;
    
       _nop_();
    
      }
    
      dat>>=1;
    
     }
    
    }
    
    u8 get_temperature()
    
    {
    
     u16 temp,temp1;
    
     
    
      ds_reset();
    
     ds_write_byte(0xcc);
    
     ds_write_byte(0x44);
    
     ds_reset();
    
     ds_write_byte(0xcc);
    
     ds_write_byte(0xbe);
    
     a=ds_read_byte();
    
     b=ds_read_byte();
    
     temp=b;
    
     temp<<=8;
    
     temp|=a;
    
     temp1 = temp*0.0625;
    
     return temp1 ;
    
    }
    
    void main()
    
      {   u16 j,d;  
    
       while(1){ 
    
       j=get_temperature();
    
         send_595(smgwei[0]);
    
       send_595(smgduan[j/100]);    
    
       rclk=0;
    
       rclk=1;
    
       delayms(1);
    
          send_595(smgwei[1]);
    
       send_595(smgduan[j%100/10]);    
    
       rclk=0;
    
       rclk=1;
    
       delayms(1);
    
          send_595(smgwei[2]);
    
       send_595(smgduan[j%10]);    
    
       rclk=0;
    
       rclk=1; 
    
          delayms(1);   
    
        send_595(smgwei[3]);
    
       send_595(0X80);    
    
       rclk=0;
    
       rclk=1;
    
       delayms(1); 
    
       d=(a%16)*10/16;
    
        send_595(smgwei[4]);
    
       send_595(smgduan[d%10]);    
    
       rclk=0;
    
       rclk=1;
    
       delayms(1);
    
        send_595(smgwei[5]);
    
       send_595(smgduan[12]);    
    
       rclk=0;
    
       rclk=1;
    
       delayms(1);
    
          }
    
      }
    
      void delayms(u16 n)
    
      {
    
        u8 i;
    
     while(n--)
    
     for(i=0;i<113;i++);
    
        }
    
      void TempDelay(u8 us)
    
      {
    
       while(us--);
    
        }
    
      void send_595(u8 dat)
    
     {
    
        u8 i;
    
      for(i=0;i<8;i++)
    
      {
    
        if(dat&0x80)
    
        ser=1;
    
       else
    
        ser=0;
    
       srclk=0;
    
          srclk=1;
    
       dat=dat<<1;
    
      }
    
     }
    /*1602屏+ds18b20其实只要返回值正确,用什么显示出来都一样,
    因为先做的1602显示就干脆一起发出来了。*/
    #include<reg52.h>
    
    #include<intrins.h>
    
    typedef unsigned char u8;
    
    typedef unsigned int u16;
    
    sbit ds=P2^2;
    
    sbit RS=P3^5;
    
    sbit RW=P3^6;
    
    sbit EN=P3^4;
    
    bit flag;
    
    u8 a,b;
    
    void delayms(u16 n);
    
    void TempDelay(u16 us);
    
    void W_cmd(u8 cmd);
    
    void W_dat(u8 dat);
    
    void init();
    
    void ds_reset()
    
    {
    
     ds=1;
    
     _nop_();
    
     ds=0;
    
     TempDelay(80);//520us
    
     ds=1;
    
     TempDelay(5);
    
     if(ds==0)
    
      flag=1;
    
     else
    
      flag=0;
    
     TempDelay(20);
    
     ds=1;
    
    }
    
    bit ds_read_bit()
    
    {
    
     bit dat;
    
     ds=0;
    
     _nop_();
    
     _nop_();
    
     ds=1;
    
     _nop_();
    
     dat=ds;
    
     TempDelay(12);
    
     return dat;
    
    }
    
    u8 ds_read_byte()
    
    {
    
     u8 i,j,value;
    
     for(i=0;i<8;i++)
    
     {
    
      j=ds_read_bit();
    
      value=(j<<7)|(value>>1);
    
     }
    
     return value;
    
    }
    
    void ds_write_byte(u8 dat)
    
    {
    
     u8 i,onebit;
    
     for(i=0;i<8;i++)
    
     {
    
      onebit=dat&0x01;
    
      if(onebit)    //?1
    
      {
    
       ds=0;
    
       TempDelay(1);
    
       ds=1;
    
       _nop_();
    
      }
    
      else  //?0
    
      {
    
       ds=0;
    
       TempDelay(11);
    
       ds=1;
    
       _nop_();
    
      }
    
      dat>>=1;
    
     }
    
    }
    
    u8 get_temperature()
    
    {
    
     u16 temp,temp1;
    
      ds_reset();
    
     ds_write_byte(0xcc);
    
     ds_write_byte(0x44);
    
     ds_reset();
    
     ds_write_byte(0xcc);
    
     ds_write_byte(0xbe);
    
     a=ds_read_byte();
    
     b=ds_read_byte();
    
     temp=b;
    
     temp<<=8;
    
     temp|=a;
    
     temp1 = temp*0.0625;
    
     return temp1 ;
    
    }
    
    void main()
    
      {   u16 j,d;
    
       init();
    
       while(1){ 
    
      j=get_temperature();
    
        W_cmd(0x80);
    
       W_dat(j/100+0x30);
    
       W_cmd(0x81);
    
       W_dat(j%100/10+0x30);
    
       W_cmd(0x82);
    
       W_dat(j%10+0x30);
    
       W_cmd(0x83);
    
       W_dat(0x2e);
    
       d=(a%16)*10/16;
    
       W_cmd(0x84);
    
       W_dat(d%10+0x30);
    
          W_cmd(0x85); 
    
      W_dat('C');
    
          }
    
      }
    
      void delayms(u16 n)
    
      {
    
        u8 i;
    
     while(n--)
    
     for(i=0;i<113;i++);
    
        }
    
      void TempDelay(u8 us)
    
      {
    
       while(us--);
    
        }
    
      void W_cmd(u8 cmd)
    
     {
    
        EN=0;
    
        RS=0;
    
        RW=0;
    
        EN=1;
    
        P0=cmd;
    
       delayms(2);
    
        EN=0;  
    
     }
    
     void W_dat(u8 dat)
    
     {
    
        EN=0;
    
        RS=1;
    
        RW=0;
    
        EN=1;
    
        P0=dat;
    
       delayms(2);
    
        EN=0;  
    
     }
    
      void init()
    
      {
    
        W_cmd(0x38); 
    
      
    
       W_cmd(0x0f); 
    
       
    
       W_cmd(0x06);
    
        
    
       W_cmd(0x01);
    
       
    
      }

 

 

 




关键词: ds18b20     训练    

助工
2019-01-24 23:15:16    评分
2楼
调试出来就好,加油

管理员
2019-01-25 09:53:16    评分
3楼

谢谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]