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

📄 at89c51+pcf8591.c

📁 Anaog to digital by PCF8591 C Language By KEIL
💻 C
字号:
  #include <intrins.h>
  #include <reg51.h>               /* special function register declarations   */
  #include <I2C.h>

  sbit OnAlarm = P3^1; 
  sbit Sensor = P1^0; 

  unsigned int Volt[4],buf[3],Alarm;
  unsigned int BUFF[4],BUF1;

  unsigned char sec,sec100,min,flag1,flag2,temp,temp1,opto;
  unsigned char i,digit,buffer[4];
  char cputick,key,delay,count1;
  
  /* Code for Differrent 7 Segment */
  char code convert[10]={0xfc,0xc0,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
  
  void pause(int); 
  void time();
  void ShowOnce(); 
  void Delayms(unsigned int count);
  void DelayShow();
  void SensorOn();
  void HexToDec();

  void timer0int (void)  interrupt 1  using 1  
  {
	TH0 |= 0xdc;  // reload timer 0 with 0DC00H
	cputick++;
	time();       // update realtime clock
  }

  void time()
  {
   sec100++;
   if(sec100 >= 100)       /* 100 * 10 ms = 1 s */
   	{
    sec100 = 0;
    flag1 |= 0x05;   		/* set bit 0, bit 2 */
    temp = 50;  
	sec = 100;
	HexToDec();
	
	}
  }

  void HexToDec()
  {
  	BUFF[0] = (BUF1*19.53)/100;		/* Convert Hex To DEC  */
	BUFF[1] =  BUF1*19.53;
	BUFF[2] =  BUFF[1]%100;
  }

  void ScanLED() /* scan 4-digit LED */
  {
    int i;
    digit = 0x08;
    for( i = 0; i < 4; i++)  /* 4-DIGIT scanning */
    {
        P2 = ~digit & opto ;  /* send complement[digit] */
        P0 = ~buffer[i];  /* send complement[segment] */
        pause(5);         /* delay a while */
        P0 = 0xff;        /* off LED */
        digit>>=1;        /* next DIGIT */
    }
  }

  void VoltToBuffer()
  {
    buffer[3] = convert[BUFF[2]%10];
    buffer[2] = convert[BUFF[2]/10];
    buffer[1] = convert[BUFF[0]%10];
    buffer[0] = convert[BUFF[0]/10];
  }

  void Blink()				/* Set Dot (DP) */
  {
    if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */
     {
	 	temp--;
        if (temp != 0)
        	{
            buffer[1] |= 0x01;
			}
            else( flag1 &= ~0x04);
      }
  }
 
  void SensorOn()		  // check Sensor Cyclinder 
  {
   if(Sensor == 0)
     {
     OnAlarm = 1;
     DelayShow();
	 OnAlarm = 0;
	 }
  }

  void ShowOnce() 			/* Show  DATA */
  {
    int i;
    for(i=0;i<2500;i++)
    ScanLED();
  }

  void DelayShow() 			  /* Delay for wait IO Nizer Working  */
  {
   unsigned long i;
   for(i=0;i<141500;i++)	  /* Delay 120 s */
   ScanLED();	  
  }

  void Offmsd()
  {
    if (buffer[0] == 0xfc)    /* if msd = '0' then put blank unstead */
        buffer[0] = 0x00;
  }

  void pause(j)			/* Delay for scan 7 Segment */
  int j;
  {
   int i;
   for (i = 0; i < j; i++)
   ;
  }
  
  void CompareVolt()	/* Compare Voltage Bat. */
  {
    if(Alarm > BUFF[0])   /* Check Bat. for Alarm */
    {        
	OnAlarm = 1; 	/* set bit P3.7 turning Alarm on */
	}
	
	else
    OnAlarm = 0; 	/* clear P3.7 turning Alarm off   */
 }
  
  void main()
  {
  EA = 1;
  ET0 = 1;  			// or IE |= 0x82;   /* set bit EA and Timer0 enable */ 
  TMOD |= 0x01; 		/* timer 0 run 16 bit counter */
  TR0 = 1; 				//or TCON |= 0x10; /* run timer 0 */
  cputick = 0;
  flag1 = 0x00;
  flag2 = 0x00;
  P3 = 0xff;
  P1 = 0xff;
  opto = 0xff;
  Sensor = 1;
  //sec = 100; 

  Alarm = 19;			/* Set Alarm Battery at 19.00 V */
  
  buffer[0] = 0x1e;		/* Show Tor */
  buffer[1] = 0x3a;
  buffer[2] = 0x0a;
  buffer[3] = 0x00;
  ScanLED();
  ShowOnce();

  buffer[0] = 0x1c;		/* Show Load */
  buffer[1] = 0x3a;
  buffer[2] = 0x7a;
  buffer[3] = 0x00;
  ScanLED();
  ShowOnce();
  
  buffer[0] = 0x0a;		/* Show Run */
  buffer[1] = 0x38;
  buffer[2] = 0x2a;
  buffer[3] = 0x00;
  ScanLED();
  ShowOnce();

  P3 = 0x00;
  P1 = 0xff;

  while(1)
   {
    while(cputick < 10)
	ScanLED();
	cputick = 0;

/*------------- the following tasks execute every 100ms ------*/

	I2Cstart();			 // Start I2C
	I2Cwrbyte(0x90);	 // PCF8591 address 0 (000)
	I2Cwrbyte(0x40|0x40);	 // Write Channel for read
	I2Cstop();				 // Stop I2C
	
	for(i=0;i<2;i++)		 // 2 Read DATA 
	  	{
		I2Cstart();				 // Restart I2C
    	I2Cwrbyte(0x91);		 // Write Data Control for READ Data  
		temp1 = I2Crdbyte();	 // temp1 buffer for keep data(HEX)
		I2Cstop();				 // Stop I2C
		}

	BUF1 = temp1;	//   ADC(CH0);

    VoltToBuffer();
    Blink();
    Offmsd();
	SensorOn();
	CompareVolt();
	}
  }

⌨️ 快捷键说明

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