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

📄 systhree.c

📁 单片机小系统测试程序,在C++语言环境下实现测试单片机系统的程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
		led[2] = 0x11;
		led[3] = 0x11;
		led[4] = 0x11;
	}
	led[5] = 0x0e;
	led[6] = 0x11;
	led[7] = 0x11;
}

/*******************************************************************
                    延时函数               
函数原型: void  delay(uint8 time_nop);  
功能:       延时time_nop个nop
  
********************************************************************/
void  delay(uint8 time_nop)
{
	uint8 i;
	for(i=0;i<time_nop;i++)
	{
		_nop_();	
	}
}
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:       启动I2C总线,即发送I2C起始条件.
  
********************************************************************/
void Start_I2c(void)
{
  sda = 1;   /* SDA=1发送起始条件的数据信号*/
  delay(2);
  scl = 1;
  delay(6);    /*SCL=1起始条件建立时间大于4.7us,延时*/
 
  sda = 0;   /*SDA=0发送起始信号*/
  delay(6);    /* 起始条件锁定时间大于4μs*/
     
  scl = 0;   /*SCL=0钳住I2C总线,准备发送或接收数据 */
  delay(2);
}




/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:       结束I2C总线,即发送I2C结束条件.
  
********************************************************************/
void Stop_I2c(void)
{
  sda = 0;  /*SDA=0发送结束条件的数据信号*/
  delay(2);   /*发送结束条件的时钟信号*/
  
  scl = 1;  /*SCL=1结束条件建立时间大于4μs*/
  delay(6);
  sda = 1;  /*SDA=1发送I2C总线结束信号*/
  delay(6);
}




/*******************************************************************
                 字节数据传送函数               
函数原型: uint8  SendByte(uint8 c); 
功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
     此状态位进行操作. 发送数据正常返回1 ,发送失败返回0。
********************************************************************/
uint8  SendByte(uint8 c)
{
 uint8 BitCnt, ack;

 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)
     	sda = 1;   /*SDA=1判断发送位 从高位开始传输 */ 
     else  
     	sda = 0; //SDA=0               
     delay(2);
     scl = 1;               /*SCL=1置时钟线为高,通知被控器开始接收数据位*/ 
     delay(6);               /*保证时钟高电平周期大于4μs   */     
     scl = 0; //SCL=0
    }
    delay(2);
    sda = 1;        //SDA=1 8位发送完后释放数据线,准备接收应答位
    delay(2);  
    scl = 1;  //SCL=1
    delay(4);
    if(sda == 1)
    	ack=0;  //SDA==1   未收到
    else 
    	ack=1;        /*判断是否接收到应答信号*/
    scl = 0;  //SCL=0
    delay(2);
    
    return(ack);		
}






/*******************************************************************
                 字节数据接受函数               
函数原型: uint8  RcvByte();
功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号)
  
********************************************************************/	
uint8  RcvByte(void)
{
	uint8 retc;
  	uint8 BitCnt;
  
  	retc=0; 
  	for(BitCnt=0;BitCnt<8;BitCnt++)
  	{
  		delay(2);          
        scl = 0;       /*SCL=0置时钟线为低,准备接收数据位*/
        
        delay(6);         /*时钟低电平周期大于4.7μs*/
       
        scl = 1;       /*SCL=1置时钟线为高使数据线上数据有效*/
        delay(9);
        retc=retc<<1;
        if(sda == 1)
        	retc=retc+1; /*SDA==1读数据位,接收的数据位放入retc中 */
        delay(2); 
	}
  	scl = 0;    //SCL=0
  	delay(2);
  	return(retc);
}




/********************************************************************
                     应答子函数
原型:  void Ack_I2c(bit a);
 
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(uint8 a)
{
	if(a==0)
  		sda = 0;     /*SDA=0  应答信号 */
  	else 
  		sda = 1;   //SDA=1    非应答信号
  	delay(4);    
  	scl = 1;  //SCL=1

    delay(4);             /*时钟低电平周期大于4μs*/
    
 	scl = 0;                /*SCL=0清时钟线,钳住I2C总线以便继续接收*/
    delay(2);
        
}






/*******************************************************************
                    向无子地址器件发送字节数据函数               
函数原型: uint8  ISendByte(uint8 sla,uint8 c);  
功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uint8 ISendByte(uint8 sla,uint8 c)
{
   uint8 ack;
	
   Start_I2c();                    /*启动总线*/
   ack = SendByte(sla);            /*发送器件地址*/
     if(ack==0)return(0);
   ack = SendByte(c);               /*发送数据*/
     if(ack==0)return(0);
   Stop_I2c();                 /*结束总线*/ 
   return(1);
}




/*******************************************************************
                    向有子地址器件发送多字节数据函数               
函数原型: uint8  ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uint8 ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{
   uint8 i,ack;

   Start_I2c();                     /*启动总线*/
 
   ack = SendByte(sla);             /*发送器件地址*/
   if(ack==0)return(0);
   
   ack = SendByte(suba);            /*发送器件子地址*/
   if(ack==0)return(0);

   for(i=0;i<no;i++)
    {   
     	ack = SendByte(*s);         /*发送数据*/
        if(ack==0)return(0);
        s++;
    } 

   Stop_I2c();                 /*结束总线*/ 
   return(1);
}






/*******************************************************************
                    向无子地址器件读字节数据函数               
函数原型: uint8  IRcvByte(uint8 sla,uint8 *c);  
功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
          址sla,返回值在c.
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uint8 IRcvByte(uint8 sla,uint8 *c)
{
   uint8 ack;

   Start_I2c();                /*启动总线*/
   ack = SendByte(sla + 1);      /*发送器件地址  +1 代表读 */
   if(ack==0)return(0);
   *c = RcvByte();             /*读取数据*/
   Ack_I2c(1);               /*发送非就答位*/
   Stop_I2c();                  /*结束总线*/ 
   return(1);
}



/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: uint8  ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uint8 IRcvStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{
   uint8 i, ack;

   Start_I2c();               /*启动总线*/
  
   ack = SendByte(sla);            /*发送器件地址*/
   if(ack==0)return(0);
   
   ack = SendByte(suba);            /*发送器件子地址*/
   if(ack==0)return(0);

   Start_I2c();
   ack = SendByte(sla + 1);       // +1 代表读
   if(ack==0)return(0);

   for(i=0;i<no-1;i++)
    {   
     *s=RcvByte();               /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/  
     s++;
    } 
   *s=RcvByte();
    Ack_I2c(1);                 /*发送非应位*/
    
    Stop_I2c();                    /*结束总线*/ 
    return(1);
}

/**************************************************************************
                     写函数                				                  *
函数原型: void  write_24lc16b(uint16 adrress, uint8 *data, uint8 number); *
功能:       向24lc16b以address地址开始的单元写number个数据,number从1到16 *
  
**************************************************************************/
void  write_24lc16b(uint16 adrress, uint8 *wdata, uint8 number)
{
	uint8 control;
	uint8 sub_addr;
	uint8 flag;
	
	flag = 0;
	control = (uint8)(adrress >> 7) & 0x0e; 
	control |= 0xa0;  
	sub_addr = (uint8)(adrress & 0x00ff);
	
	do
	{
    		flag = ISendStr(control, sub_addr, wdata, number);
	}while(flag == 0);

}

/**************************************************************************
                     读函数                				                  *
函数原型: void  read_24lc16b(uint16 adrress, uint8 *data, uint8 number);  *
功能:       向24lc16b以address地址开始的单元读number个数据,number从1到2048*
  
**************************************************************************/
void  read_24lc16b(uint16 adrress, uint8 *rdata, uint8 number)
{
	uint8 control;
	uint8 sub_addr;
	uint8 flag;
	
	flag = 0;
	control = (uint8)(adrress >> 7) & 0x0e; 
	control |= 0xa0; 
	sub_addr = (uint8)(adrress & 0x00ff);
		
	do
	{
    		flag = IRcvStr(control, sub_addr, rdata, number);
	}while(flag == 0);
}

/****************************************************************************************
                     24c16测试函数        				                                *
函数原型:   void check_24c16(void)                                                      *
功能:       向24lc16b全部存储单元写0x00、0xff并读回比较,出错单元数量用数码管后四位显示 *
****************************************************************************************/
void check_24c16(void)
{
	uint8 wdata[2] = {0x00,0xff};
	uint8 rdata[2] = {0x00,0x00};
	uint16 count = 0;
	uint16 flash_error = 0;

	for(count=0;count<2048;count++)
	{
		write_24lc16b(count, wdata, 1);
		read_24lc16b(count, rdata, 1);
		write_24lc16b(count, wdata + 1, 1);
		read_24lc16b(count, rdata + 1, 1);
		if((rdata[0] != wdata[0]) || (rdata[1] != wdata[1]))
		{
  			flash_error = flash_error + 1;	
		}
	}

	if(flash_error != 0)
	{
		for(count = 0;count < 4;count++)
		{
			if(flash_error != 0)
			{	
				led[count] = flash_error % 10;
				flash_error = flash_error / 10;
			}
			else
			{
				led[count] = 0xff;
			}
		}	
	}
	else
	{
		led[0] = 0x00;
		led[1] = 0x11;
		led[2] = 0x11;
		led[3] = 0x11;
	}
	led[4] = 0x0e;
	led[5] = 0x11;
	led[6] = 0x11;
	led[7] = 0x11;
}


⌨️ 快捷键说明

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