原创 LED数码管+18b20+定时报警(温度倒计时提醒器)

2008-3-30 10:54 3932 5 5 分类: MCU/ 嵌入式

点击下载


这是一个温度定时报警器,可以查看温度,定时,如果超过温度范围或者到时间就蜂鸣器报警,4位LED显示。定时可调,系统初始化30分30秒。报警设置Temperature>25||Temperature<5||(hour==0&&minute==0&&v<=30)。


设置时间超过一个小时,就显示小时数和分钟数,少于1小时就显示分钟和秒。K1查看温度,K5设置定时,K3小时数+1,K7分钟数+1,K8设置好定时返回显示。


开机先显示4个8.,表示数码管正常。然后是4个0,然后是系统初始时间30分30秒。


因为还不会定时器啊,中断啊,呵呵,所以时间不怎么准确。EDN51验证。


#include
#include
#include


sbit A0=P2^0;
sbit A1=P2^1;
sbit A2=P2^2;
sbit A3=P2^3;
sbit B0=P2^4;
sbit B1=P2^5;
bdata F;
sbit FA="F"^0;
sbit FB="F"^1;
sbit FC="F"^2;
sbit FD="F"^3;
sbit FE="F"^4;
sbit FF="F"^5;
sbit FG="F"^6;
sbit FH="F"^7;
sbit feng="P1"^7;


static v="30";
static hour="0";
static minute="30";
static count="0";


/*****************************************


       


/****温度+LED*****************************************/


 


  sbit         L0=P1^0;


  sbit         L1=P1^1;


  sbit         L2=P1^2;


  sbit         L3=P1^3;


  sbit         DS18b20_DQ = P1^6 ;


  bit          flag;
 
  unsigned char *p;


  char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
             0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82};  
  char b[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
             0x00,0x10,0x08,0x03,0x46,0x06,0x0e,0x02};
    
  char one,two;
  int N;


unsigned char  code CrcTable [256]={
0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};


 unsigned char temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节


 unsigned char crc_data;


 unsigned int Temperature;


 unsigned char id_buff[8];



/******定义函数****************/


# define uchar unsigned char


# define uint unsigned int


 



void delay_n40us(uint n);//延时函数


void shezi(void);
void display1(void);
void  init(void);
void init1(void);
void delay_n40us(uint n);
void display(void);
void DelayNms(int N);
void Key(void);



//****************************************************/
void TempDelay (uint us)
{
     while(us--);
}


//******************************************************/
void Init18b20 (void)
{
    DS18b20_DQ = 1;
   
 _nop_();
   
 DS18b20_DQ = 0;
   
 TempDelay(86);   //delay 530 uS//80
 
    _nop_();
 
    DS18b20_DQ = 1;
 
    TempDelay(14);   //delay 100 uS//14
   
 _nop_();
   
 _nop_();
 
    _nop_();
 
    if(DS18b20_DQ==0)
         flag = 1;   //detect 1820 success!
    else
         flag = 0;    //detect 1820 fail!
 
    TempDelay(20);       //20
 
    _nop_();
 
    _nop_();
 
    DS18b20_DQ  = 1;
}


/******************** *********
*Function:向18B20写入一个字节*/
void WriteByte (uchar wr)     //单字节写入
{
     uchar i;
     for (i=0;i<8;i++)
     {
         DS18b20_DQ  =  0 ;
         _nop_();
         DS18b20_DQ = wr & 0x01;
         TempDelay(5);   //delay 45 uS //5
         _nop_();
         _nop_();
         DS18b20_DQ = 1;
         wr >>= 1;
      }
}


/************************************************************
*Function:读18B20的一个字节
*************************************************************/
uchar ReadByte (void)     //读取单字节
{
    uchar i,u=0;
    for(i=0;i<8;i++)
    {
       DS18b20_DQ = 0 ;
       u >>= 1;
       DS18b20_DQ = 1;
       if(DS18b20_DQ ==1 )
           u |= 0x80;
       TempDelay (4);
       _nop_();
    }
    return(u);
}


/************************************************************
*Function:读18B20
*************************************************************/
void read_bytes (uchar j)
{
  uchar i;
  for(i=0;i  {
        *p = ReadByte();
        p++;
  }
}


/*Function:CRC校验********************************/
uchar CRC (uchar j)
{
     uchar i,crc_data=0;
     for(i=0;i          crc_data = CrcTable[crc_data^temp_buff];
     return (crc_data);
}
/************************************************************
*Function:读取温度
*************************************************************/
void GemTemp (void)
{
   read_bytes (9);
   if (CRC(9)==0) //校验正确
   {
     Temperature = temp_buff[1]*0x100 + temp_buff[0];
     //     Temperature *= 0.625;
     Temperature /= 16;


     TempDelay(1);
    }
}


 /************************************************************
*Function:内部配置
*************************************************************/
void Config18b20 (void)  //重新配置报警限定值和分辨率
{
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0x4e);  //write scratchpad
     WriteByte(0x19);  //上限
     WriteByte(0x1a);  //下限
     WriteByte(0x7f);     //set 11 bit (0.125)
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0x48);  //保存设定值
     Init18b20();
     WriteByte(0xcc);  //skip rom
     WriteByte(0xb8);  //回调设定值
}


 /************************************************************
*Function:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//读取器件 id
{
 Init18b20();
 WriteByte(0x33);  //read rom
 read_bytes(8);
}


/************************************************************
*Function:18B20ID全处理*/
void TemperatuerResult(void)
{
   p = id_buff;
   ReadID();
   Config18b20();
   Init18b20 ();
   WriteByte(0xcc);   //skip rom
   WriteByte(0x44);   //Temperature convert
   Init18b20 ();
   WriteByte(0xcc);   //skip rom
   WriteByte(0xbe);
}


void Get_Temperature()
{
   p  = temp_buff;
   GemTemp();
}


 


void delay_n40us(uint n)


{   
       uint i;


      uchar j;           


        for(i=n;i>0;i--)


           for(j=0;j<15;j++)
            ;          //


}                                         //


 


void display(void)
{
 
  int i;
  for(i=0;i<1000;i++)
    {  P0=a[one];
      L0=0;
      delay_n40us(10);
       L0=1;


      P0=a[two];
      L1=0;
      delay_n40us(10);
      L1=1;
     }
 }



 /*延时Nms程序*/
void DelayNms(int N)
{
 do
 {
  int i;
  for(i=0;i<50;i++);
 }while(N--);
}


 



void Key(void)
{
 P2=0x1F;      //初始化P2键盘口
 if(!A0)       //如果A0为0
 {
  DelayNms(10);    //延时100ms
  if(!A0)      /*7号按键*/
  {
//   L1=ON;     //置高标志位
   FB=1;     //置高标志位
  }
 }
 P2=0x1F;      //初始化P2键盘口
 if(!A1)       //如果A1为0
 {
  DelayNms(10);    //延时100ms
  if(!A1)      /*3号按键*/
  {
//   L5=ON;     //置高标志位
   FF=1;     //置高标志位
  }
 }
 P2=0x1F;      //初始化P2键盘口
 if(!A2)       //如果A2为0
 {
  DelayNms(10);    //延时100ms
  if(!A2)      /*6号按键*/
  {
//   L6=ON;     //置高标志位
   FG=1;     //置高标志位
  }
 }
 P2=0x1F;      //初始化P2键盘口
 if(!A3)       //如果A3为0
 {
  DelayNms(10);    //延时100ms
  if(!A3)      /*7号按键*/
  {
//   L7=ON;     //置高标志位
   FH=1;     //置高标志位
  }
 }
 P2=0x2F;      //初始化P2键盘口
 if(!A0)       //如果A0为0
 {
  DelayNms(10);    //延时100ms
  if(!A0)      /*5号按键*/
  {
//   L0=ON;     //置高标志位
   FA=1;     //
  }
 }
 P2=0x2F;      //初始化P2键盘口
 if(!A1)       //如果A0为0
 {
  DelayNms(10);    //延时100ms
  if(!A1)      /*4号按键*/
  {
//   L4=ON;     //置高标志位
   FE=1;     //置高标志位
  }
 }
 P2=0x2F;      //初始化P2键盘口
 if(!A2)       //如果A0为0
 {
  DelayNms(10);    //延时100ms
  if(!A2)      /*2号按键*/
  {
//   L2=ON;     //置高标志位
   FC=1;     //置高标志位
  }
 }
 P2=0x2F;      //初始化P2键盘口
 if(!A3)       //如果A0为0
 {
  DelayNms(10);    //延时100ms
  if(!A3)      /*3号按键*/
  {
//   L3=ON;     //置高标志位
   FD=1;     //置高标志位
  }
 }
}


 



void shezi(void)
{ int i;
 
 while(FE==0)
  {
    Key();
   if(FA)
 {
  FA=0;
  minute++;
  if(minute>59)
  {
   minute=0;
  }
  count=0;
 }
 if(FC)
 {
  FC=0;
  hour++;
  if(hour>100)
  {
   hour=0;
  }
  }
  for(i=0;i<100;i++)
                 { 
           P0=a[hour/10];
                        L0=0;
                        delay_n40us(10);
                        L0=1;


                        P0=b[hour%10];
                        L1=0;
                        delay_n40us(10);
                          L1=1;


                     P0=a[minute/10];
                        L2=0;
                        delay_n40us(10);
                        L2=1;


                     P0=a[minute%10];
                        L3=0;
                        delay_n40us(10);
                        L3=1;
                      }
  Key(); 
  }
  FE="0";
}


void display1(void)


{
    int i;


   count++;      //计数器+1
 if(count>=5)     //到1s
 {
  count=0;     //计数器清零
  v--;      //秒计数器+1
  if(v<0)
  {
   v=59;     //如果秒数大于9999,秒计数器清零
   minute--;    //分钟+1
   if(minute<0)
   {
    minute=59;   //如果分钟到了60,则分钟置零
    hour--;    //并且小时-1
            }
  }
 }
    if(hour<=0)
      {   for(i=0;i<50;i++)
         {
        
                       P0=a[minute/10];
                        L0=0;
                        delay_n40us(10);
                        L0=1;


                        P0=b[minute%10];
                        L1=0;
                        delay_n40us(10);
                          L1=1;


                     P0=a[v/10];
                        L2=0;
                        delay_n40us(10);
                        L2=1;


                     P0=a[v%10];
                        L3=0;
                        delay_n40us(10);
                        L3=1;
                     
      } }
      else
       {   for(i=0;i<50;i++)
         {
        
                      P0=a[hour/10];
                        L0=0;
                        delay_n40us(10);
                        L0=1;


                        P0=b[hour%10];
                        L1=0;
                        delay_n40us(10);
                          L1=1;


                     P0=a[minute/10];
                        L2=0;
                        delay_n40us(10);
                        L2=1;


                     P0=a[minute%10];
                        L3=0;
                        delay_n40us(10);
                        L3=1;
                     
         } }
  
 
  
}
void  init(void)
  { int i;
     for(i=0;i<1000;i++)
         {
                       P0=b[8];
                        L0=0;
                        delay_n40us(10);
                        L0=1;


                        P0=b[8];
                        L1=0;
                        delay_n40us(10);
                          L1=1;


                     P0=b[8];
                        L2=0;
                        delay_n40us(10);
                        L2=1;


                     P0=b[8];
                        L3=0;
                        delay_n40us(10);
                        L3=1;
 }                           
  }
 void init1(void)
    { int i;
      for(i=0;i<1000;i++)
         {
                        P0=a[0];
                        L0=0;
                        delay_n40us(10);
                        L0=1;


                        P0=a[0];
                        L1=0;
                        delay_n40us(10);
                          L1=1;


                     P0=a[0];
                        L2=0;
                        delay_n40us(10);
                        L2=1;


                     P0=a[0];
                        L3=0;
                        delay_n40us(10);
                        L3=1;
  }                          
  }
   
 


 


void main(void)



             init();
     delay_n40us(1000);
     init1();
     delay_n40us(1000);
  while(1)
   {    
       
     
          TemperatuerResult();


          Get_Temperature();


          Key();


         if(FD)
                 {
              FD=0;


        one=Temperature/10;


             two="Temperature"%10;
         
                    display();


      delay_n40us(1000);


     }
      if(FB)


       {
      FB="0";


      shezi();
     
                 }
   else
      {
      display1();
             
    
         }


      if(Temperature>25||Temperature<5||(hour==0&&minute==0&&v<=30))


     {


    
    
     delay_n40us(1000);
               feng=~feng;


      delay_n40us(1000);
               feng=~feng;


      
   }       
}  } 


 


 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条