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

📄 zldlb.c

📁 直流电压表采用ICL7135,四位半AD,静态扫描,单片机采用AT89S52进行处理
💻 C
📖 第 1 页 / 共 2 页
字号:
  {
    led[5]=18;//正号//
  }
  /*************数值处理****************************************************/
  if(lcbz==4)
  {
    led[4]=led2[4];
    led[3]=led2[3]; 
    led[2]=led2[2];
    led[1]=led2[1]|0x80;
  } 
  if(lcbz==3)
  {
    led[4]=led2[4];
    led[3]=led2[3]; 
    led[2]=led2[2]|0x80;
    led[1]=led2[1];
  }
  if(lcbz==2)
  {
    led[4]=led2[4];
    led[3]=led2[3]|0x80; 
    led[2]=led2[2];
    led[1]=led2[1];

  }
  if(lcbz==1)
  {
    led[4]=led2[4]|0x80;
    led[3]=led2[3]; 
    led[2]=led2[2];
    led[1]=led2[1];
  }
}
/***************************************************************************
*名称:read_key()
*功能:读键盘程序
***************************************************************************/
void read_key()
{
  unsigned  char  key1;
  unsigned  char  key2;
  key0=P1&0x08;
  if(key0==0)
  {
    key1=P2&0x0f;
    delay(50);
    key2=P2&0x0f;
    if(key1=key2)
    {
      keydig=key1;
    }
  }
  else
  {
    keydig=0xff;//清除
  }
}
void read_key1()
{
  unsigned  char  key1;
  unsigned  char  key2;
//  run=1;
  key0=P1&0x08;
  if(key0==0x8)
  {
    key1=P2&0x0f;
    delay(50);
    key2=P2&0x0f;
    if(key1=key2)
    {
      keydig=key1;
    }
  }
  else
  {
    keydig=0xff;//清除
  }
}

void CH452_I2c_Start_2()		//两线制方式,SDA用做中断输出,使用以下两个函数
{   rst_wdog();
	CH452_SDA_SET;
	CH452_SCL_CLR;	//通知CH452,将要对其操作,此段时间不要再产生按键中断
/*	do {
		DELAY_1US;  // 保留足够的时间给CH452产生中断
		DELAY_1US;
	} while ( CH452_SDA_IN == 0 );  // CH452正在请求中断?
	DELAY_1US;
	DISABLE_INTERRUPT;	*/		  //禁止键盘中断,防止开始时被CH452中断而进入中断服务程序中的START
	CH452_SDA_SET;   /*发送起始条件的数据信号*/
	CH452_SCL_SET;
	DELAY_1US;
	CH452_SDA_CLR;   /*发送起始信号*/
	DELAY_1US;      
	CH452_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */
	DELAY_1US;
}

void CH452_I2c_Stop_2()
{   rst_wdog();
	CH452_SDA_CLR;
	DELAY_1US;
	CH452_SCL_SET;
	DELAY_1US;
	CH452_SDA_SET;  /*发送I2C总线结束信号*/
	DELAY_1US;
  //	CLEAR_INTER_FLAG;  // 清除中断标志,因为通过SDA输出数据所以会误中断
  //	ENABLE_INTERRUPT;
}

void CH452_I2c_WrByte(unsigned char c)	//写一个字节数据
{
	unsigned char i;
	rst_wdog();
	for(i=0;i!=8;i++)  // 输出8位数据
	{
		if(c&0x80) 
		     {CH452_SDA_SET;}
		else 
		     {CH452_SDA_CLR;}
		CH452_SCL_SET;
		c<<=1;
		DELAY_1US;
		DELAY_1US;
		CH452_SCL_CLR;
		DELAY_1US;
//		DELAY_1US;
	}
	DELAY_1US;
	CH452_SDA_SET;
	CH452_SCL_SET;  // 接收应答
	DELAY_1US;
	DELAY_1US;
	CH452_SCL_CLR;
	DELAY_1US;
}

unsigned char  CH452_I2c_RdByte()		//读一个字节数据
{
	unsigned char c,i;
	c=0;
	rst_wdog();
	for(i=0;i!=8;i++)  // 输入8位数据
	{
		CH452_SDA_SET;
		CH452_SCL_SET;
		DELAY_1US;
		DELAY_1US;
		c<<=1;
		if(CH452_SDA_IN) c|=0x01;  // 输入1位
		CH452_SCL_CLR;
		DELAY_1US;
//		DELAY_1US;
	}
	DELAY_1US;
	CH452_SDA_SET;
	CH452_SCL_SET;  // 发出无效应答
	DELAY_1US;
	DELAY_1US;
	CH452_SCL_CLR;
	DELAY_1US;
	return(c);
}

void CH452_Write(unsigned int command)	//写命令
{   unsigned char a;
    unsigned char b;
	CH452_I2c_Start_2();               /*启动总线*/

   	CH452_I2c_WrByte(((unsigned char)(command>>7)&0x3E)|0x60);  // CH452的ADDR=1时(默认)
	//debug
    a=(((unsigned char)(command>>7)&0x3E)|0x60);

    rst_wdog();
   	CH452_I2c_WrByte((unsigned char)command);               /*发送数据*/
	//debug
	b=(unsigned char)command;
  	CH452_I2c_Stop_2();                 /*结束总线*/ 
}

unsigned char CH452_Read()		//读取按键
{
	unsigned char key;
   	CH452_I2c_Start_2();                /*启动总线*/
   	CH452_I2c_WrByte(0x6F);    // 若有两个CH452并连,当ADDR=0时,此值为0x4F
   	key=CH452_I2c_RdByte();               /*读取数据*/
	CH452_I2c_Stop_2();                /*结束总线*/ 
	return(key);
}
/***************************************************************************
*名称:displa()
*功能:数码管显示子程序
***************************************************************************/
void displa(void)
{
 
  //unsigned char sdate,i,n;
 /* unsigned char  i;
  unsigned char leddispla[6];
   rst_wdog();
  for(i=5;i>0;i--)
  {
    switch(led[i])
    {
      case 0x00:leddispla[i]=0x3f;break;//0
      case 0x01:leddispla[i]=0x06;break;
      case 0x02:leddispla[i]=0x5B;break;
      case 0x03:leddispla[i]=0x4F;break;
      case 0x04:leddispla[i]=0x66;break;
      case 0x05:leddispla[i]=0x6D;break;
      case 0x06:leddispla[i]=0x7D;break;
      case 0x07:leddispla[i]=0x07;break;
      case 0x08:leddispla[i]=0x7F;break;
      case 0x09:leddispla[i]=0x6F;break;
      case 0x0a:leddispla[i]=0x77;break;
      case 0x0b:leddispla[i]=0x7C;break;
      case 0x0c:leddispla[i]=0x39;break;
      case 0x0d:leddispla[i]=0x5e;break;
      case 0x0e:leddispla[i]=0x79;break;
      case 0x0f:leddispla[i]=0x71;break;
      case 0x10:leddispla[i]=0xbf;break;
      case 0x11:leddispla[i]=0x86;break;
      case 0x12:leddispla[i]=0xdb;break;
      case 0x13:leddispla[i]=0xcf;break;
      case 0x14:leddispla[i]=0xe6;break;
      case 0x15:leddispla[i]=0xed;break;
      case 0x16:leddispla[i]=0xfd;break;
      case 0x17:leddispla[i]=0x87;break;
      case 0x18:leddispla[i]=0xff;break;
      case 0x19:leddispla[i]=0xef;break;
      case 0x1a:leddispla[i]=0xf7;break;
      case 0x1b:leddispla[i]=0xfc;break;
      case 0x1c:leddispla[i]=0xb9;break;
      case 0x1d:leddispla[i]=0xde;break;
      case 0x1e:leddispla[i]=0xf9;break;
      case 0x1f:leddispla[i]=0xf1;break;//F.
      case 0x20:leddispla[i]=0x76;break;//h
      case 0x21:leddispla[i]=0x06;break;//I
      case 0x22:leddispla[i]=0x0f;break;//j
      case 0x23:leddispla[i]=0x73;break;//p
      case 0x24:leddispla[i]=0x3e;break;//U
      case 0x25:leddispla[i]=0x00;break;//灭
      case 0x26:leddispla[i]=0x40;break;//--
      case 0x27:leddispla[i]=0x38;break;
      case 0x28:leddispla[i]=0x40;break;
      case 0x29:leddispla[i]=0xe7;break;
      default:break;
    }
  }
  CH452_Write(0x0800+leddispla[0]);
  DELAY_1US;*/

  CH452_Write(0x0800|led[1]);
  DELAY_1US;
  CH452_Write(0x0900|led[2]);
  DELAY_1US;
  CH452_Write(0x0a00|led[3]);
  DELAY_1US;
  CH452_Write(0x0b00|led[4]);
  DELAY_1US;
  CH452_Write(0x0c00|led[5]);
  DELAY_1US;

  /*for(i=5;i>0;i--)
  {

    sdate=leddispla[i];
    for(n=0;n<=7;n++)
    {
      ACC=sdate;
      ACC<<=1;
      clke=0;
      dat=CY;
      _nop_();
      clke=1;
      sdate=ACC;
    }
  }*/
}
void  main()
{
  unsigned char sum;
  unsigned char i;
  rst_wdog();
  CH452_Write(0x0201) ;     //inti
   delay(100);
   CH452_Write(0x0401) ;    //SET C   OPEN DISPLAY
   DELAY_1US;
   CH452_Write(0x05D0) ;    //SET Code   
   DELAY_1US;
   rst_wdog();
  keydig=1;
  led[0]=0;
  led[1]=0;
  led[2]=0;
  led[3]=0;
  led[4]=0;
  led[5]=0;
  cbz=0;//存储标志
  xbz=0;//查询标志
  txbz=0;//未通讯
  rdata=0;//接收数据个数
  init_port();//端口初始化
  init_series();//串口初始化
  displa();//显示数据 
  rst_wdog();
  while(1)
  {
    rst_wdog(); 
    delay(30);   //延时
    read_key();//读入键盘数据//手动
    read_dat();//读入测量数据
    rst_wdog();  //看门狗
    displa();    //显示处理
    read_key1();//读键盘
    bell=1;//过量程处理,报警
    //over=0;
    over=1;
    /*******报警处理程序**********/
    if(key0==0x0)
    {
	      if(ovr==1)
		  {
          bell=0;//过量程处理,报警
          //over=1;//过量程处理,切断电源
          over=0;
          led[5]=0x08;
          led[4]=0x08;
          led[3]=0x08;
          led[2]=0x08;
          led[1]=0x08;
          displa(); 
		  rst_wdog(); 
         }		
     }	  
     /*******************************************************/
    /*通讯处理*/ 
    /*******************************************************/
   if(rdata==5)
    {
      txbz=0;
      rdata=0;
      TH0=0X0f;
      TL0=0x00;
      ET0=0;
      TR0=0; 
      sum=rdat[0]+rdat[1]+rdat[2]+rdat[3];//累加和
      bell=1;
      /*********************完成数据回复5个数据***************/
      if(sum==rdat[4])//数据检效
      {
        rt485=1;
        SBUF=0x01;//站号
        delay(30);
        SBUF=0x00;//回传命令
        delay(30);
        SBUF=rdat[2];//其始地址
        delay(30);
        SBUF=rdat[3];//数据个数
        delay(30);
        SBUF=led[5];
        delay(30);
        SBUF=led[4];
        delay(30);
        SBUF=led[3];
        delay(30);
        SBUF=led[2];
        delay(30);
        SBUF=led[1];
        delay(30);
        SBUF=0x01+rdat[2]+rdat[3]+led[5]+led[4]+led[3]+led[2]+led[1];//这里的值应与地址相符
        delay(30);
        sum=0;
        rt485=0;
      }
      delay(230);
    }
    /****************通讯结束****************************/
    /*****************自动档位**************************/
   if(keydig==0x0e)
    {
      for(i=0;i<6;i++)
      { 
        memory[cbz][i]=led[5-i];     //存储
      }
      cbz=cbz+1;
      if(cbz>16)
      {
        cbz=0;
      }  
      led[5]=cbz; 
      led[4]=16;
      led[3]=16;
      led[2]=16;
      led[1]=16;
      xbz=cbz;
      displa(); //显示程序    
      rst_wdog(); 
	  delay(230);
      delay(230);   
      rst_wdog(); 
      delay(230);
      delay(230); 
	  rst_wdog(); 
    }
    if(keydig==0x0d)
    {
      if(xbz==0)
      {
        xbz=cbz;
      }              
      xbz=xbz-1;
      led[5]=xbz; 
      led[4]=16;
      led[3]=16;
      led[2]=16;
      led[1]=16;
      displa(); //显示程序    
      rst_wdog(); 
	  delay(230);
      rst_wdog();
      delay(230);
      rst_wdog();
      delay(230);
	  rst_wdog(); 
      delay(230);
      rst_wdog();
      led[5]=memory[xbz][1];  //查询
      led[4]=memory[xbz][2];
      led[3]=memory[xbz][3];
      led[2]=memory[xbz][4];
      led[1]=memory[xbz][5];
      displa(); //显示程序    
      rst_wdog(); 
	  delay(230);
	  rst_wdog(); 
      delay(230);
      rst_wdog();
      delay(230);
	  rst_wdog(); 
      delay(230);
	  rst_wdog(); 
    }
    if(keydig==0x0b)
    {
       //选择
    }
  }
}

⌨️ 快捷键说明

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