锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51单片机DS18B20温度传感器+继电器小风扇+液晶显示

时间:2022-10-02 00:30:01 传感器继电

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; ///定义温度传感开关
uchar c; ///温度赋值变量
uchar k; ///温度上限值
sbit dula=P2^6;
sbit wela=P2^7;
sbit key2=P3^6; ///独立键盘s4
sbit key3=P3^7; ///独立键盘s5
sbit kai=P1^1; //继电器开关
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit beem=P2^3;
uchar code table2[]={"H:"};
uchar code table1[]={0x04,0x15,0x0E,0x1F,0x01,0x1F,0x01,0x1F, // 当
0x05,0x1F,0x00,0x0E,0x0A,0x0A,0x0E,0x16, // 前
0x00,0x18,0x04,0x14,0x14,0x14,0x0C,0x04, //
0x00,0x00,0x18,0x18,0x00,0x00,0x18,0x18, //:
0x19,0x1A,0x04,0x08,0x08,0x08,0x04,0x02, // `c
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}; //点
/*DS18B20*/
void dsreset(void)
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i ; //i for delay
DS=1;i ;i ;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i )
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); ///读出的最低数据在前面,所以只有一个字节DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bi testb;
          for(j=1;j<=8;j++)
           {
                testb=dat&0x01;
            dat=dat>>1;
                if(testb)     //write 1
            {
              DS=0;
              i++;i++;
              DS=1;
                  i=8;while(i>0)i--;
                }
                else
            {
                  DS=0;       //write 0
                  i=8;while(i>0)i--;
                DS=1;
                  i++;i++;
            }

          }
    }

    void tmpchange(void)  
    {
          dsreset();
          delay(1);
         tmpwritebyte(0xcc);  
         tmpwritebyte(0x44);  
    }

    uint tmp()               
    {
          float tt;
        int temp;
          uchar a,b;
          dsreset();
          delay(1);
          tmpwritebyte(0xcc);
          tmpwritebyte(0xbe);
          a=tmpread();              //接收低8位
          b=tmpread();                //接收高八位   
          temp=b;     
          temp<<=8;
          temp=temp|a;
          tt=temp*0.0625;
          temp=tt*10+0.5;

          return temp;
    }

                /*1602液晶显示屏*/
    void writecome(uchar com)
    {
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
    }      
    void writedata(uchar date)
    {
        lcdrs=1;                                                                                         
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
    }
    void init1()
    {
        wela=0;
        dula=0;
        lcden=0;
        writecome(0x38);
        writecome(0x0c);
        writecome(0x06);
        writecome(0x01);
    }

                        /*扫描    显示*/
    uchar scan()
    {
         if(key2==0)
        {
            delay(5);
            if(key2==0)
            {
                while(!key2);
                k+=1;
                writeadd(2,k);
            }
        }
        else if(key3==0)
        {
            delay(5);
            if(key3==0)
            {
                while(!key3);
                k-=1;
                writeadd(2,k);
            }
        }
        return k;
    }
    void display(uint temp)            //显示程序    temp有百、十、个位;百位为十度位
    {         
        uchar A,B,C,x,f;
        f=temp/10;                               //温度取值
        A=temp/100;
        B=temp%100/10;
        C=temp%10;
        writecome(0x40);                          //字码入库
        for(x=0;x<50;x++)        //x尽量比规定的大一点,避免乱码
        {
            writedata(table1[x]);
        }
        writecome(0x80);                  
        writedata(0);                       //当
        writecome(0x81);
        writedata(1);
        writecome(0x82);
        writedata(2);                     //前
        writecome(0x83);
        writedata(3);                       //:
        writecome(0x87);
        writedata(5);                       //.
        writecome(0x89);                    //·c
        writedata(4);
        writecome(0x85);
        writedata(0x30+A);             //十
        writecome(0x86);
        writedata(0x30+B);                //个
        writecome(0x88);
        writedata(0x30+C);              //小数点后
        writecome(0x80+0x0c);
        writedata(table2[0]);
        writecome(0x80+0x0d);
        writedata(table2[1]);
    
        c=scan();
                                          //每显示一次,则将值给C
        writecome(0x80+0x0e);                      //指针指向位置,依次写入
        writedata(0x30+c/10);
        writedata(0x30+c%10);
    

    
    
        if(f>=c)                               //继电器,蜂鸣器开关
        {
            kai=1;
            beem=0;
            delay(100);        
           }
        else
            kai=0;
            beem=1;
        if(f<=(c-15))            //低于15时报警
        beem=0;
        else
        beem=1;    
    }

                      /*主函数*/
        void main()
        {
        
             uchar a;
            k=30;
            init1();
            delay(20);
            k=readadd(2);                    //读取断电前的温度上限值
              while(1)
              {    
                dsreset();
                tmpwritebyte(0xcc);
                tmpwritebyte(0xbe);
                tmpchange();
                for(a=10;a>0;a--)
                  {   
                      display(tmp());
                
                }
        
              } 
        }
 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章