专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

ds18b20电冰箱控制系统

作者:胡永明   来源:本站原创   点击数:  更新时间:2013年12月10日   【字体:


# include "reg52.h"
# include "math.h"
#include<intrins.h>

# define uchar unsigned char
# define uint unsigned int

//写eeprom存储中
sbit scl=P1^1;
sbit sda=P1^2;

sbit DQ = P3^0; //温度输入口
sbit DQ2 = P3^1; //温度输入口

sbit kmbj=P1^4; //开门报警灯入口
sbit motordc=P3^5; //直流电机入口
sbit hghlgt=P3^6; //温度高于设定值入口
sbit motorout=P3^7;

sbit setlclgt=P3^2; //设置提示灯入口
sbit setldlgt=P1^6; //设置提示灯入口
sbit addlgt=P3^3; //温度加灯入口
sbit sublgt=P3^4; //温度减灯入口
sbit syslgt=P1^7;    //系统工作提示灯

sbit setbtn=P1^0; //设置按键入口
sbit addbtn=P1^1; //温度加按键入口
sbit subbtn=P1^2; //温度减按键入口

sbit opndr=P1^3;       //开门开关
sbit opndrspk=P1^5;    //18度报警

uchar data temp_data[2]={0x00, 0x00,};   //读出温度暂存
uchar temp_buff[3]={0x00,0x00,0x00};
uchar disp_buff[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};          //显示缓冲单元
uint tt=0,tt2=0,tm=0,cjtm=0,flag_cj=0,open=0,ccount=0;

char lcsetvalue=0,ldsetvalue=0;

uchar code TABLE[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};  //共阳极 0-9的代码
uchar code codeseat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar flag_set=1,flag_temp=1,flag_opendr=0,flag_kmbj=0,flag_hbj=0;

 void delay(uint j)
{
   uint i;
   for(i=0;i<=j;i++);
}
 

/*****************温度设定函数*************************/
   void temp_set(void)
{
   syslgt=1;
   while(flag_set)            //设定冷藏室温度和冷冻室温度
             {
    if(flag_temp)       
      {
         setbtn=1;
           if(!setbtn)      
          { while(!setbtn)
                 { setbtn=1;setlclgt=0;   }//等待键的释放
      flag_temp++;
      if(flag_temp==2)
                           { setlclgt=0;setldlgt=1;}
      if(flag_temp==3)
         {setlclgt=1;addlgt=1;sublgt=1;setldlgt=0;}
      if(flag_temp==4)
        {flag_temp=1;setlclgt=1;setldlgt=1;addlgt=1;sublgt=1;syslgt=0;flag_set=0;}

      tm=0;
      disp_buff[0]=10; disp_buff[1]=10;
      disp_buff[2]=10; disp_buff[3]=10;
                       }
          }
     if(flag_temp==2)        //开始冷藏室温度加或者减
       {
      addbtn=1;
      if(!addbtn)
         { while(!addbtn)
             { addbtn=1;addlgt=0;sublgt=1;}//等待键的释放
        lcsetvalue++;
        if(lcsetvalue>=60)
           lcsetvalue=60;
        if(lcsetvalue<0)
           disp_buff[0]=11;
        else
           disp_buff[0]=10;

        disp_buff[1]=abs(lcsetvalue)/10;
        disp_buff[2]=abs(lcsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
       }
      subbtn=1;
      if(!subbtn)
         { while(!subbtn)
             { subbtn=1;sublgt=0;addlgt=1;}//等待键的释放
                          lcsetvalue--;
        if(lcsetvalue<0)
           disp_buff[0]=11;
        else
           disp_buff[0]=10;
        
        disp_buff[1]=abs(lcsetvalue)/10;
        disp_buff[2]=abs(lcsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}             
       }
         }
                 if(flag_temp==3)        //开始冷冻室温度加或者减
       {
      addbtn=1;
      if(!addbtn)
         { while(!addbtn)
             { addbtn=1;addlgt=0;sublgt=1;}//等待键的释放
        ldsetvalue++;
        if(ldsetvalue>=60)
           ldsetvalue=60;
        if(ldsetvalue<0)
           disp_buff[0]=11;
        else
           disp_buff[0]=10;

        disp_buff[1]=abs(ldsetvalue)/10;
        disp_buff[2]=abs(ldsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
       }
      subbtn=1;
      if(!subbtn)
         { while(!subbtn)
             { subbtn=1;sublgt=0;addlgt=1;}//等待键的释放
                          ldsetvalue--;
        if(ldsetvalue<0)
           disp_buff[0]=11;
        else
           disp_buff[0]=10;
        
        disp_buff[1]=abs(ldsetvalue)/10;
        disp_buff[2]=abs(ldsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}             
       }
         }  
     }
}


 /********************************计算温度子函数**********************************************/
 void temp_work(void)
 {  
       disp_buff[0]=10;

    if(temp_data[1]>127)
           {temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[0]=11;} //负温度求补码
       tt=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;

    disp_buff[1]=tt/10;
       disp_buff[2]=tt%10;
       disp_buff[3]=0;
   
    if(!disp_buff[1])
           disp_buff[1]=10; 
 }

 /*******************************DS复位函数******************************/
void ow_reset2(void)
{
  uchar presence=1;

  while(presence)
  {
   while(presence)
   {
    DQ2=1;        //DQ复位
    DQ2=0;        //单片机将DQ拉低
    delay(50);             //延时550毫秒
    DQ2=1;        //拉高总线
    delay(6);
    presence=DQ2;      //如果=0则初始化成功 =1则初始化失败
   }
    delay(45);
    presence=~DQ2;
  }
    DQ2=1;
 } 
 /*****************************DS写命令函数*********************************/
 void write_byte2(uchar dat)  //向1-WIRE总线上写一字节
{
  uchar i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ2 = 0 ;
    DQ2 = dat&0x01 ;
    delay(7) ;               //0时序延时至少60US
    DQ2 = 1 ;
    dat>>=1 ;
  }
}
/*******************************DS读一字节函数****************************************************/
 uchar read_byte2(void)
{
uchar i = 0 ;
uchar dat = 0 ;

for (i = 8 ; i > 0 ; i--)
  {
    DQ2 = 0 ; // 给脉冲信号
    dat >>= 1 ;
    DQ2 = 1 ; // 给脉冲信号

    if(DQ2)
     dat |= 0x80 ;
    delay(7) ;
  }
  return (dat) ;
}
/*******************************DS复位函数******************************/
void ow_reset(void)
{
  uchar presence=1;

  while(presence)
  {
   while(presence)
   {
    DQ=1;        //DQ复位
    DQ=0;        //单片机将DQ拉低
    delay(50);             //延时550毫秒
    DQ=1;        //拉高总线
    delay(6);
    presence=DQ;      //如果=0则初始化成功 =1则初始化失败
   }
    delay(45);
    presence=~DQ;
  }
    DQ=1;
 } 
 /*****************************DS写命令函数*********************************/
 void write_byte(uchar dat)  //向1-WIRE总线上写一字节
{
  uchar i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = dat&0x01 ;
    delay(7) ;               //0时序延时至少60US
    DQ = 1 ;
    dat>>=1 ;
  }
}
/*******************************DS读一字节函数****************************************************/
 uchar read_byte(void)
{
uchar i = 0 ;
uchar dat = 0 ;

for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ; // 给脉冲信号
    dat >>= 1 ;
    DQ = 1 ; // 给脉冲信号

    if(DQ)
     dat |= 0x80 ;
    delay(7) ;
  }
  return (dat) ;
}

 /******************************读出温度函数*************************************************/
 void read_temp(void)
 {
  ow_reset(); 
  write_byte(0xcc);//skip ROM
  write_byte(0x44);// 启动温度转换

  ow_reset();
  write_byte(0xcc);
  write_byte(0xbe);  //读取温度寄存器
 
  temp_data[0]=read_byte();                 //温度低8位
  temp_data[1]=read_byte();     //温度高8位

 }

 
/*****************第二个ds18b20处理函数******************/

    /******************************读出温度函数*************************************************/
 void read_temp2(void)
 {
  ow_reset2(); 
  write_byte2(0xcc);//skip ROM
  write_byte2(0x44);// 启动温度转换

  ow_reset2();
  write_byte2(0xcc);
  write_byte2(0xbe);  //读取温度寄存器
 
  temp_data[0]=read_byte2();                 //温度低8位
  temp_data[1]=read_byte2();     //温度高8位

 }
 /********************************计算温度子函数**********************************************/
 void temp_work2(void)
 {  
       disp_buff[4]=10;

    if(temp_data[1]>127)
           {temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[4]=11;} //负温度求补码
       tt2=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; 
    disp_buff[5]=tt2/10;
       disp_buff[6]=tt2%10;
       disp_buff[7]=0;
   
    if(!disp_buff[5])
           disp_buff[5]=10; 

 }
/**********eeprom函数******************/
////////延时//////////////////////////////////
void flash()
{  ;  ; }
void x24c02_init()  //24c02初始化子程序
{
 scl=1; //拉高
 flash(); //延时
 sda=1;
 flash();//同上
}
void start()        //启动I2C总线
{
 sda=1;
 flash();
 scl=1;
 flash();
 sda=0;
 flash();
 scl=0;
 flash();
}
void stop()         //停止I2C总线
{
 sda=0;
 flash();
 scl=1;
 flash();
 sda=1;
 flash();
}
void writex(uchar j)  //写一个字节
{
 uchar i,temp;
    temp=j;
    for (i=0;i<8;i++)
  {
   temp=temp<<1;
   scl=0;
   flash();
   sda=CY;
   flash();
   scl=1;
   flash();
  }

 scl=0;
 flash();
 sda=1;
 flash();
}
char readx()   //读一个字节
{
 char i,j,k=0;
 scl=0;
 flash();
 sda=1;
    for (i=0;i<8;i++)
  {
   flash();
   scl=1;
   flash();
   if (sda==1) j=1;
   else j=0;
   k=(k<<1)|j;
   scl=0;
  }
 flash();
 return(k);
}
void clock()         //I2C总线时钟,在此作第个时钟
{
 
 scl=1;
 flash();
 while (sda==1);//如果SDA为0即收到应答则跳过,为1则等应答
 scl=0;
 flash();
}

////////从24c02的地址address中读取一个字节数据/////

char x24c02_read(uchar address)
{
 char i;
 start();
 writex(0xa0);
 clock();//第9个时钟
 writex(address);//选中24C02
 clock();
 start();
 writex(0xa1); //选中24C02中的存储器地址
 clock();
 i=readx();
 stop();
 delay(10);
 return(i);
}

void x24c02_write(char address,char info)
{
 EA=0;
 start();
 writex(0xa0);
 clock();
 writex(address);
 clock();
 writex(info);
 clock();
 stop();
 EA=1;
 delay(50);
}

 /*******************************主函数**********************************************************/
 void main (void)
 {
   char i,num1,num2;
   TMOD=0x11; //定时器0设置方式1,定时器1设置方式1
   TH0=0xf4;   //定时3ms 为了计数值显示的需要
   TL0=0x48;

   TH1=0xbf;   //定时16.6ms 为了计数值显示的需要
   TL1=0x28;

   EA=1;  //开总中断
   ET0=1;    //定时器中断使能
   ET1=1;
   TR0=1;    //启动定时器0
   TR1=1;

   P2=0x00;
   
   kmbj=0;
   motordc=0;

   hghlgt=0;
   setlclgt =0;
   syslgt=1;

   opndrspk=0;

 
主程序略。

关闭窗口

相关文章