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

📄 mcu.c

📁 串口通信程序与IIC程序.详细说明了上位机与下位机的通信过程。
💻 C
📖 第 1 页 / 共 2 页
字号:
	/*光纤收发嚣监控程序,CPU--AT89C2051-12PI*/
	#include<AT892051.h>


	sbit	TRCONL=P3^7;
	sbit	MDC=P3^4;
	sbit	MDIO=P3^5;
	sbit	INTB=P3^2;

	sbit	CLK1=P1^7;
	sbit	CLK2=P1^6;
	sbit	CONL=P1^5;
	sbit	MADDR=P1^3;
	sbit	SADDR=P1^4;
	sbit	A_T=P1^2;

	typedef unsigned char	uchar;
	typedef unsigned int	uint;



	uchar receive[13];
	uchar transmit[30];


	extern uchar FLAG=0;
	uchar CMD=0,MADD=0,SADD=0;
	uint	reg20,reg22,reg23,reg24,reg25,reg26,reg27;


        void address(void);
        void SMI_START(void);
	void SMI_END(void);
        uint SMI_READ(uchar);
        void SMI_WRITE(uchar,uint);
	void local(uchar);
	void request(uchar);
	void command(uchar);
        void softrst(void);
        void send(uchar);
        uchar cksum(uchar);
	void recept(void);
	void delay(void);
	void _nop_(void);
	uchar _crol_(uchar ,uchar);



   	/*************************************
   	名称:address()
   	功能:读取设备的地址
   	参数:无
   	返回:无
   	*************************************/
   	void address(void)
   	{
   	  uchar i;
	  bit	C;
   	  CLK2=1;
	  CLK1=1;
   	  CONL=1;
   	  _nop_();
	  _nop_();
   	  CONL=0;
   	  _nop_();
          _nop_();
	  _nop_();
   	  CONL=1;
   	  CLK2=0;
	  MADD=0;
	  SADD=0;

	  C=MADDR;
	  MADD=MADD|~C;


   	  for(i=0;i<7;i++)
   	  {
            MADD=_crol_(MADD,1);
            CLK1=0;
	    _nop_();
	    _nop_();
   	    CLK1=~CLK1;
	    _nop_();
	    C=MADDR;
	    MADD=MADD|~C;
	   }

         CLK2=1;
	  CLK1=1;
   	  CONL=1;
   	  _nop_();
	  _nop_();
   	  CONL=0;
   	  _nop_();
          _nop_();
	  _nop_();
   	  CONL=1;
   	  CLK2=0;

          C=SADDR;
   	  SADD=SADD|~C;


   	  for(i=0;i<7;i++)
   	  {
             SADD=_crol_(SADD,1);
            CLK1=0;
   	    CLK1=~CLK1;
            _nop_();
	    _nop_();
	    C=SADDR;
   	    SADD=SADD|~C;

   	  }
   	}


	/*************************************
   	名称:softrst()
   	功能:实现设备的软复位。
   	参数:无
   	返回:无
   	*************************************/
	void softrst(void)
	{
		uint temp;
		temp=SMI_READ(31)|0X0001;
		SMI_WRITE(31,temp);
                delay();
		SMI_WRITE(25,temp);
		SMI_WRITE(24,0XFF7);
                transmit[1]=6;
		transmit[5]=CMD;
		transmit[6]=0x59;
		transmit[7]=cksum(6);
		transmit[8]=0x7E;
		send(9);
	}

     /*************************************
   	名称:SMI_START()
   	功能:为SMI接口初始工作条件
   	参数:无
   	返回:无
   	*************************************/
    void SMI_START(void)
    {
		uchar i;
		MDIO=1;
		for(i=0;i<32;i++)
		{
			MDC=0;
			_nop_();
            _nop_();
            _nop_();
			MDC=1;
			_nop_();
            _nop_();
            _nop_();
		}
		MDIO=0;
		MDC=0;
		_nop_();
        _nop_();
        _nop_();
		MDC=1;

		MDIO=1;
		MDC=0;
		_nop_();
        _nop_();
        _nop_();
		MDC=1;
	}

	/*************************************
   	名称:SMI_END()
   	功能:为SMI接口结束工作
   	参数:无
   	返回:无
   	*************************************/
    void SMI_END(void)
    {
		uchar i;
		MDIO=1;
		for(i=0;i<32;i++)
		{
			MDC=0;
			_nop_();
            _nop_();
            _nop_();
			MDC=1;
			_nop_();
            _nop_();
            _nop_();
		}

	}

   	/*************************************
   	名称:SMI_READ()
   	功能:读取指定寄存器的值
   	参数:寄存器地址
   	返回:寄存器的值
   	*************************************/
   	 uint SMI_READ(uchar REG_ADDR)
   	 {
   	 	uchar i=0,PHY_ADDR=0;

   	 	uint  REG_CON=0;
        SMI_START();
                //1
				MDIO=1;
                MDC=0;
                _nop_();
                _nop_();
                _nop_();
                MDC=1;
                //0
                MDIO=0;
                _nop_();
                _nop_();
                _nop_();
                MDC=0;
                _nop_();
                _nop_();
                _nop_();
                MDC=1;


   	 	PHY_ADDR=PHY_ADDR<<3;  //写入IP113F的物理地址
   	 	for(i=0;i<5;i++)
   	 	{

   	 		if(PHY_ADDR&0x80)
   	 		{
                                MDIO=1;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
   	 			PHY_ADDR=PHY_ADDR<<1;
   	 		}
   	 		else{
                                MDIO=0;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
   	 			PHY_ADDR=PHY_ADDR<<1;
   	 		}
   	 	}


   	 	REG_ADDR=REG_ADDR<<3;  //写入寄存器的地址
   	 	for(i=0;i<5;i++)
   	 	{

   	 		if(REG_ADDR&0x80)
   	 		{
                                MDIO=1;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
   	 			REG_ADDR=REG_ADDR<<1;
   	 		}
   	 		else{
                                MDIO=0;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
   	 			REG_ADDR=REG_ADDR<<1;
   	 		}
   	 	}
                 MDIO=1;

   	 	for(i=0;i<16;i++)    //读出指定的寄存器值
   	 	{
   	 		MDC=0;
                        _nop_();
                        _nop_();
                        _nop_();
   	 		MDC=1;
                        _nop_();
   	 		REG_CON=REG_CON|MDIO;
   	 		REG_CON=REG_CON<<1;
   	 	}

   	 	SMI_END();
   	 	return(REG_CON);
   	}


   	 /*************************************
   	名称:SMI_WRITE()
   	功能:为指定寄存器写值
   	参数:寄存器地址,所要写入的值
   	返回:无
   	*************************************/
   	 void SMI_WRITE(uchar REG_ADDR,uint REG_CON)
   	 {
   	 	uchar i=0,PHY_ADDR=0;

   	 	SMI_START();
   	 	MDC=0;
                _nop_();
                _nop_();
                _nop_();
   	 	MDIO=0;
                _nop_();
                _nop_();
                _nop_();
   	 	MDC=1;
                _nop_();
                _nop_();
                _nop_();

   	 	MDC=0;
                _nop_();
                _nop_();
                _nop_();
   	 	MDIO=1;
                _nop_();
                _nop_();
                _nop_();
   	 	MDC=1;

   	 	PHY_ADDR=PHY_ADDR<<3;  //写入IP113F的物理地址
   	 	for(i=0;i<5;i++)
   	 	{

   	 		if(PHY_ADDR&0x10)
   	 		{
                                MDIO=1;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
                                _nop_();
                                _nop_();
   	 			PHY_ADDR=PHY_ADDR<<1;
   	 		}
   	 		else{
   	 			MDIO=0;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
                                _nop_();
                                _nop_();
   	 			PHY_ADDR=PHY_ADDR<<1;
   	 		}
   	 	}


   	 	REG_ADDR=REG_ADDR<<3;  //写入寄存器的地址
   	 	for(i=0;i<5;i++)
   	 	{

   	 		if(REG_ADDR&0x80)
   	 		{
   	 			MDIO=1;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
                                _nop_();
                                _nop_();
   	 			REG_ADDR=REG_ADDR<<1;
   	 		}
   	 		else{
   	 			MDIO=0;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			MDC=1;
                                _nop_();
                                _nop_();
   	 			REG_ADDR=REG_ADDR<<1;
   	 		}
   	 	}
                MDIO=1;
                _nop_();
                _nop_();
                _nop_();
   	 	MDC=0;
                _nop_();
                _nop_();
                _nop_();

   	 	MDC=1;
                _nop_();
                _nop_();
                _nop_();

                MDIO=0;
                _nop_();
                _nop_();
                _nop_();
   	 	MDC=0;
                _nop_();
                _nop_();
                _nop_();

   	 	MDC=1;
                _nop_();
                _nop_();
                _nop_();


   	      //写入寄存器的值
   	 	for(i=0;i<16;i++)
   	 	{

   	 		if(REG_CON&0x8000)
   	 		{
                                MDIO=1;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();

   	 			MDC=1;
                                _nop_();
                                _nop_();
                                _nop_();
   	 			REG_CON=REG_CON<<1;
   	 		}
   	 		else{
   	 			MDIO=0;
                                _nop_();
                                _nop_();
                                _nop_();
                                MDC=0;
                                _nop_();
                                _nop_();
                                _nop_();

   	 			MDC=1;
                                _nop_();
                                _nop_();

⌨️ 快捷键说明

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