📄 mcu.c
字号:
/*光纤收发嚣监控程序,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 + -