久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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;

 
主程序略。

關閉窗口

相關文章

主站蜘蛛池模板: 91美女在线| 美女黄色在线观看 | 久久久久成人精品 | 日韩三极 | 久久成人国产 | 激情综合五月 | 成人在线免费网站 | 一区二区三区在线观看视频 | 全免费a级毛片免费看视频免费下 | 日韩av成人在线 | 国产亚洲精品精品国产亚洲综合 | 久久久久久久亚洲精品 | 欧美日韩第一页 | 欧美久久一区 | 亚洲激情一区二区三区 | 九九亚洲 | 91一区| 亚洲成人中文字幕 | 国产羞羞视频在线观看 | 久久日韩精品 | www.一级毛片 | 91爱爱·com | 色橹橹欧美在线观看视频高清 | 亚洲人成在线播放 | 在线观看黄色大片 | 久久99国产精一区二区三区 | 日韩中文一区 | 日本不卡一区 | 亚洲高清久久 | 国产精品一区二区三区久久 | 国产一区二区三区四区在线观看 | 日美女逼逼 | 中文日本在线 | 小h片免费观看久久久久 | av片在线观看网站 | 九九精品影院 | 久久国产精品-久久精品 | 男女啪啪高潮无遮挡免费动态 | 成年人在线播放 | 日韩福利在线观看 | 国产日韩欧美激情 |