×
单片机 > 单片机程序设计 > 详情

51单片机18b20温度及按键可调上下限报警源程序

发布时间:2020-08-27 发布时间:
|

于18b20显示2位温度并显示上下限,超限报警,温度上下限均可调整,附带闪烁灯

单片机源程序如下:


#include

#define uchar unsigned char

#define uint unsigned int

sbit ds=P2^2;                

sbit key1=P3^4;

sbit key2=P3^5;

sbit key3=P3^6;

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

bit key=0;

sbit led=P1^2;

uint get_temp();

void send(uchar);

uint temp,num,p,cycle,high,low,zd,xs,TL;        

uint l=19;                        //定义温度下限

uint h=25;                        //定义温度上限

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                                        0x66,0x6d,0x7d,0x07,

                                        0x7f,0x6f,0xbf,0x86,

                                    0xdb,0xcf,0xe6,0xed,

                                    0xfd,0x87,0xff,0xef};

void delay(uint z)  //延时函数

{

uint x,y;

for(x=z;x>0;x--)

  for(y=110;y>0;y--);

}

void delay1(uint ms)  

{

  uchar j;

        while(ms--)

         for(j=110;j>0;j--);

}

/////中断/////////////////////

void init()

{          

        TMOD|=0X10;

        TH0=(65536-2000)/256;

        TL0=(65536-2000)%256;

        EA=1;                  

        ET0=1;

        TR0=1;

}

//按键扫描程序******************************************************

void keyscan()

{

if(key3==0)

        delay1(5);

  if(key3==0)

  {    while(!key3);

                key=!key; 

                while(key3==0);

   }

if(key==0)

   {

  if(key1==0)

   {

    delay1(5);

  if(key1==0)

        //while(!key1)  ;

                 l++;   

                delay(50);

  if(l==99)

            l=0;

       }

   }                      

if(key2==0)

   {

    delay1(5);

  if(key2==0)

{//        while(!key2);

           if(l!=0)

           l--;          

                   delay(50);

      }

          }

          }

if(key==1)

{

  if(key1==0)

   {

    delay1(5);

if(key1==0)

{//        while(!key1)  ;

                 h++; 

                delay(50);

           if(h==99)

            h=0;

       }

   }                      

      if(key2==0)

   {

    delay1(5);

if(key2==0)

{//while(!key2);

          if(h!=0)

           h--;        

                   delay(50);                   

}  

}

}

}

//温度传感器********************************************************

void dsreset()//ds18b20复位 初始化函数

{

        uint i;

        ds=0;

        i=80;

        while(i>0)i--;

        ds=1;

        i=4;

        while(i>0)i--;

}

bit tempreadbit()

{

        uint i;

        bit dat;

        ds=0;i++;         //i++起延时作用

        ds=1;i++;i++;

        dat=ds;

        i=8;while(i>0)i--;

        return(dat);

}

uchar tempread()                                                 

{

                uchar i,j,dat;

                dat=0;

                for(i=1;i<=8;i++)

                {

                        j=tempreadbit();

                        dat=(j<<7)|(dat>>1);                //读出数据最低位在最前面,这样刚好一个字节在dat里


                }           

                return(dat);

                }

void tempwritebyte(uchar dat)           //向ds18b20写一个字节数据函数                  

{

                uint i;

                uchar j;

        bit testb;

        for(j=1;j<=8;j++)

                {

                        testb=dat&0x01;

                        dat=dat>>1;

        if(testb)//写一

                {

                         ds=0;

                        i++;i++;

                        ds=1;

                        i=8;

                while(i>0)i--;

                }

        else

                        {

                                ds=0;//写0

                                i=8;while(i>0)i--;

                                ds=1;

                                i++;i++;


                        }

                }

}                

void tempchange() //DS18B20开始获取温度并转换

{

                dsreset();

                delay(1);

                tempwritebyte(0xcc);   //写跳过读ROM指令

                tempwritebyte(0x44);   //写温度转换指令

}

uint get_temp()

                {

                        uchar a,b;

                        dsreset();

                        delay(1);

                        tempwritebyte(0xcc);

                        tempwritebyte(0xbe);

                        a=tempread(); //读低八位

                        b=tempread();         //读高八位

                        temp=b;

                        temp<<=8;//两个字节组合为一个字

                        temp=temp|a;

                        temp=temp*0.0625;        //温度在寄存器中为12位,分辨率位0.0625        度

                SBUF=temp;

                        return temp;//temp是整型

        }

//数码管显示**********************************************************************

void


关键字:51单片机  18b20  按键可调

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向