⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 有水位检测
💻 C
字号:
#include<AT892051.H>
#include <intrins.h>

#define Nop()           _nop_();
typedef unsigned char   uchar;
typedef unsigned int    uint;

uchar 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};

code uchar DisMode[14] = {0xa0, 0xbd, 0x64, 0x25, 0x39, 0x23, 0x22, 0xb5, 0x20, 0x21, 0x62, 0x7f, 0xff, 0xdf};
uchar DisCon[3];       //   0    1     2      3    4      5     6    7     8      9    e     -     nl    dot
																								   
sbit k1      = P3^0;    //继电器H
sbit Ld      = P3^1;    //
sbit key_up  = P3^2;    //+key
sbit key_do  = P3^3;    //-key
sbit led_r   = P3^4;    //green led
sbit led_y   = P3^5;    //red led
sbit led2    = P3^7;    //L
            
sbit led3    = P1^0;    //L
sbit led1    = P1^1;    //L
sbit led_g   = P1^2;    //green led
sbit Sck     = P1^4;    //4094 Sck
sbit Qd      = P1^5;    //4069 Qd
sbit Sw      = P1^6;    //water postion
sbit TempIO  = P1^7;    //18b20

bit   Flag, DisFlag, ErFlag;   //Flag 1,18b20 工作常 0,异常  DisFlag 1,显示当前温度 0,显示设定温度
bit   Error;  
uchar *p;
uchar idata temp_buff[9];
uint Temperature; 
uchar SetTemp;
const HiTemp = 60, LoTemp = 23;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数原型声明
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void Swbt(uchar bt,bit Sw);
void Config18b20 (void);
void delay(uchar x);
void display(void);
void GetKey(void);
void Init18b20 (void);
void WriteByte (uchar wr);
uchar ReadByte (void);
void read_bytes (uchar j);
uchar CRC (uchar j);
void TemperatuerResult(void);


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: Swbt 
//+ 功能: 指定位数码管开关
//+ 参数: bt位,Sw开关0开1关
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void Swbt(uchar bt,bit Sw)
{
   if (Sw)
   {
      switch (bt)
      {
         case 0:led1 = 0; break;
         case 1:led2 = 0; break;
         case 2:led3 = 0; break;
         default: break;  
      }
   }
   else
   {
      switch (bt)
      {
         case 0:led1 = 1; break;
         case 1:led2 = 1; break;
         case 2:led3 = 1; break;
         default: break;  
      }
   }
      
}           

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: delay 
//+ 功能: 按键和显示用延时
//+ 参数: x
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void kdelay(uchar x)
{
   uchar i, j;
   for (i = x; i > 0; i--)
   {
      for (j = 0; j < 255; j++)
      {;}
   }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: delay 
//+ 功能: 18B20 用延时
//+ 参数: x
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void delay(uchar x)
{
   while (x--);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: Rread_bytes
//+ 功能: 读18B20
//+ 参数: j
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void read_bytes (uchar j)
{
   uchar i;
   for(i = 0; i < j; i ++)
   {
      *p = ReadByte();
      p ++;
   }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: ReadByte
//+ 功能: 读取单字节
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
uchar ReadByte (void)     //读取单字节
{
   uchar i,u = 0;
   for(i = 0; i < 8; i ++)
   {
      TempIO = 0;
      u >>= 1;
      TempIO = 1;
      if(TempIO ==1 )
      u |= 0x80;
      delay (4);
      Nop();
   }
   return(u);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: ReadID
//+ 功能: 读取器件 id
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
/*void ReadID (void)
{
  Init18b20();
  WriteByte(0x33);         //read rom
  read_bytes(8);
}*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+函数:Init18b20 
//+ 功能:18B20初始化
//+ 参数: wr
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void Init18b20 (void)
{
   TempIO = 1;
   Nop();
   TempIO = 0;
   delay(86);                //delay 530 uS//80
   Nop();
   TempIO = 1;
   delay(14);                //delay 100 uS//14
   Nop(); Nop();   Nop();
   
   if(TempIO == 0)
      Flag = 1;                  //detect 1820 success!
   else
      Flag = 0;                  //detect 1820 fail!
   delay(20);               //20
   Nop();      
   Nop();
   TempIO = 1;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: WriteByte
//+ 功能: 18B20单字节写入
//+ 参数: wr
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void WriteByte (uchar wr)     //单字节写入
{
   uchar i;
   
   for (i = 0; i < 8; i ++)
   {
      TempIO = 0;
      Nop();
      TempIO = wr & 0x01;
      delay(5);            //delay 45 uS //5
      Nop();
      Nop();
      TempIO = 1;
      wr >>= 1;
   }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: Config18b20
//+ 功能: 重新配置报警限定值和分辨率
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void Config18b20 (void)  //重新配置报警限定值和分辨率
{
   Init18b20();
   WriteByte(0xcc);         //skip rom
   WriteByte(0x4e);         //write scratchpad
   WriteByte(0x28);         //上限
   WriteByte(0x14);         //下限
   WriteByte(0x7f);         //set 11 bit (0.125)
   Init18b20();
   WriteByte(0xcc);         //skip rom
   WriteByte(0x48);         //保存设定值
   Init18b20();     
   WriteByte(0xcc);         //skip rom
   WriteByte(0xb8);         //回调设定值
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: GemTemp
//+ 功能: 读取温度
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void GemTemp (void)
{
   read_bytes (9);
   if (CRC(9) == 0)         //校验正确
   {
      Temperature = temp_buff[1]*0x100 + temp_buff[0];
      Temperature /= 16;
//     SetTemp = Temperature;
      delay(1);
   }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: CRC
//+ 功能: 查表校验
//+ 参数: j
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
uchar CRC (uchar j)
{
   uchar i,crc_data = 0;
   for(i = 0; i < j; i ++)        //查表校验
   crc_data = CrcTable[crc_data^temp_buff[i]];
   return (crc_data);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: GetKey
//+ 功能: 取键值
//+ 参数: 无
//+ 返回: uchar
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void GetKey(void)
{
   
   if(!key_up | !key_do)
   {
      kdelay(50);
      if(!key_up & !key_do) 
      {
         kdelay(100);
         if(!key_up & !key_do)
            DisFlag = ~DisFlag;
      }                          //两键同时按下。
      
      if (!DisFlag)
      {
         
         if(!key_do)
         {
            kdelay(100);
            if(!key_do)
            {
               if (SetTemp > LoTemp)
                  SetTemp--;
               else
                  SetTemp = LoTemp;
            }
         }
         
         if(!key_up)
         {
            kdelay(100);
            if(!key_up)
            {
               if (SetTemp < HiTemp)
                  SetTemp++;
               else
                  SetTemp = HiTemp;
            }
         }
      }
   }

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: timer0() interrupt 1
//+ 功能: 定时器0用作显示
//+ 输入: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
/*void timer0() reentrant interrupt 1 using 3 
{
   uchar j, tmp;
   uchar BitCou;

   TL0 = 0x00;
   TH0 = 0x00;

 }    */

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: display
//+ 功能: 显示数值
//+ 输入: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void display(void)
{
   uchar i, j, tmp;

   DisCon[0] = 12;
   
   if (!ErFlag)
   {
      led_r	= 0;
      led_y = 1;
      led_g = 1;
      Error = 0;
      DisCon[0] = 10;   // E
      DisCon[1] = 12;   //nul
      if (Ld)  
         DisCon[2] = 1;
      if (!Sw)
         DisCon[1] = 2; 
      if (!Flag)
         DisCon[2] = 3;
   }
   else
   {
      if (DisFlag)
      {
         DisCon[1] = Temperature / 10;
         DisCon[2] = Temperature - DisCon[1] * 10;
      }
      else
      {
         DisCon[0] = 14; 
         DisCon[1] = SetTemp / 10;
         DisCon[2] = SetTemp - DisCon[1] * 10;
      }
   }
   
   for (i = 0; i < 3; i ++)
   {
      tmp = DisMode[DisCon[i]];  
      for(j = 0; j < 8; j++)
      {
         if (tmp & 0x01)
            Qd = 1;
         else
            Qd = 0;
         Sck = 1;
         tmp >>= 1;
         Sck =0;
      }
      Swbt(i,1);
      delay(100);
      Swbt(i,0);
   }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: TemperatuerResult
//+ 功能: 读取温度全过程
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void TemperatuerResult(void)
{
//   p = id_buff;
//   ReadID();
// Config18b20();
   Init18b20 ();
   WriteByte(0xcc);   //skip rom
   WriteByte(0x44);   //Temperature convert
   Init18b20 ();
   WriteByte(0xcc);   //skip rom
   WriteByte(0xbe);   //read Temperature
   p = temp_buff;
   GemTemp();
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: main
//+ 功能: 
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++  
void main(void)
{
           
   uchar Count;

   Sck = 0;
   DisFlag = 1;
   Error = ErFlag = 1;
 
   Init18b20();
   if (Ld |!Sw |!Flag)
   {
      ErFlag = 0;
      display();
   }
   else
   {   
      if (Flag) 
      {
         Config18b20();
         TemperatuerResult();
         SetTemp = temp_buff[2]; 
      }
      while(1)
      {
         if (Count < 10)
         {
            display();
            Count ++;
         }
         else
         {
             Count = 0;
             if (Flag)
               TemperatuerResult();
         }
   
         if ((Temperature <= (SetTemp - 1)) && Error)
         {
            k1 = 0;
            led_y = 0;
            led_g = 1;
         }
   
         if ((Temperature >= (SetTemp + 1)) && Error)
         {
            k1 = 1;
            led_y = 1;
            led_g = 0;
         }
   
         GetKey();
       } 
    } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -