用51模拟I2C从机程序

发布者:qiuxubiao最新更新时间:2018-05-20 来源: eefocus关键字:模拟I2C  从机程序 手机看文章 扫描二维码
随时随地手机看文章

/********************************************************************/
//宏观声明
#include
#include
#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
/*
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
/********************************************************************/
//EEPROM 声明文件
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83
/********************************************************************/
//红外学习声明
uchar data IRcode[4],IRcode2[4];
uchar CodeTemp;
uchar i,j,k,p,studyi,num;
uchar IRS_STATE=0;
uchar idata key_ircode[30][4];
sbit IRsignal=P3^2;
sbit LED1=P1^6; 
sbit LED2=P1^7;
/********************************************************************
sbit Skey=P2^7;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit key5=P2^4;
/********************************************************************/ 
//I2C声明文件
sbit SDA=P3^3;
sbit SCL=P3^7; 
/********************************************************************/ 
uchar data keynum;
/********************************************************************/
//-----------------------------------------------------
//static bit OP;        //红外发射管的亮灭
//static unsigned int count;       //延时计数器
//static unsigned int endcount; //终止延时计数
static unsigned char Flag;      //红外发送标志
char iraddr1;  //十六位地址的第一个字节
char iraddr2;  //十六位地址的第二个字节
sbit IR_SEND=P1^3;
uchar cnt;
uint value;
//------------------------------------------------------------
#define FOSC    11059200
#define T38KHz (FOSC / 4 / 37900)
/********************************************************************/
void Delay0_9ms(void)//0.9毫秒延迟
{
unsigned char i, j;
 _nop_();
 _nop_();
 _nop_();
 i = 10;
 j = 170;
 do
 {
  while (--j);
 } while (--i);
}
void Delay1ms(void)//1毫秒延迟
{
/*********************************************************************/
unsigned char i, j;

 _nop_();
 i = 11;
 j = 190;
 do
 {
  while (--j);
 } while (--i);
}
/********************************************************************/
void Delay4ms(void)//4毫秒延迟
{
unsigned char i, j;

 _nop_();
 _nop_();
 _nop_();
 i = 44;
 j = 3;
 do
 {
  while (--j);
 } while (--i);
}
/********************************************************************
void Delay500us()//0.5毫秒延迟  //@11.0592MHz
{
 unsigned char i, j;

 i = 6;
 j = 93;
 do
 {
  while (--j);
 } while (--i);
}
********************************************************************/
void Delay(void)//  普通延迟
{
uchar i,j,k;
  for(i=200;i>0;i--)
  for(j=200;j>0;j--)
  for(k=3;k>0;k--);
}
/*****************************************************************/
void putchar(unsigned char data1)//字符发送函数 
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
/*****************************************************************/
void putstring(unsigned char *dat)//字符串发送函数
{
for(i=0;i<4;i++) //判断字符串是否发送完毕
{
putchar(*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
}
}
/****************************************************************/
void initUart(void)//串口初始化
{
    TMOD=0x20;     //用定时器设置串口波特率
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 REN=1;          //串口初始化
 SM0=0;
 SM1=1;
 EA=1;           //开启总中断
 ES=1;
}

/****************************************************************/
void IRinit()//红外学习声明初始化
{
    IT0=1;
 EX0=0;
 EA=1;
 CodeTemp=0;
}
void IICinitSteve()//I2C从总线初始化
{
 IT1=0;
 EX1=1;
 EA=1;
}
/****************************************************************/
void PCAinit()//PCA定时器0初始化
{
 CCON = 0;                       //Initial PCA control register
                                    //PCA timer stop running
                                    //Clear CF flag
                                   //Clear all module interrupt flag
    CL = 0;                         //Reset PCA base timer
    CH = 0;
    CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2
                                    //Disable PCA timer overflow interrupt
    value = T38KHz;
    CCAP0L = value;                 //P1.3 output 100KHz square wave
 CCAP0H = value >> 8;            //Initial PCA module-0
    value += T38KHz;            //Initial PCA module-0
    CCAPM0 = 0x4d;                  //PCA module-0 work in 16-bit timer mode and enable PCA interrupt, toggle the output pin CEX0(P1.3)

    CR = 0;                         //PCA timer start run
    EA = 1;
    cnt = 0; 
}
/****************************************************************/
void T0init()
{
  Flag = 0;
  P3_4 = 1;
  EA = 1; //允许CPU中断 
  TMOD |= 0x01; //设定时器0和1为16位模式1 
  ET0 = 1; //定时器0中断允许
}
/****************************************************************/
void IapIdle()//EEPROM初始化
{
 IAP_CONTR=0;
 IAP_CMD=0;
 IAP_TRIG=0;
 IAP_ADDRH=0X80;
 IAP_ADDRL=0;
}
/****************************************************************/
uchar IapReadByte(uint addr)//EEPROM读取命令
{
 uchar dat;
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_READ;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 dat=IAP_DATA;
 IapIdle();

 return dat;
}
/****************************************************************/
void IapProgramByte(uint addr,uchar dat)//EEPROM 写入命令
{
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_PROGRAM;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_DATA=dat;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 IapIdle();
}
/****************************************************************/
void IapEraseSector(uint addr)//EEPROM清除命令
{
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_ERASE;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 IapIdle();
}
/****************************************************************
void keycan()
{
 if(key1==0)
 {
  Delay();
  if(key1==0)
  {
   while(key1==0);
   keynum=0;
  }
 }
 else if(key2==0)
 {
  Delay();
  if(key2==0)
  {
   while(key2==0);
   keynum=1;
  }
 } 
 else if(key3==0)
 {
  Delay();
  if(key3==0)
  {
   while(key3==0);
   keynum=2;
  }
 } 
 else if(key4==0)
 {
  Delay();
  if(key4==0)
  {
   while(key4==0);
   keynum=3;
  }
 } 
 else if(key5==0)
 {
  Delay();
  if(key5==0)
  {
   while(key5==0);
   keynum=4;
  }
 }

 
}
/****************************************************************/
void int0(void) interrupt 0 using 2//红外学习命令
{  
 EA=0; 
 for(k=0;k<10;k++)
 {
  Delay0_9ms();
  if(IRsignal==1)
  {
  k=10;break;
  }
  else if(k==9)
  {
   while(IRsignal==0);
   Delay4ms();
   Delay1ms();
//   Delay500us();
   for(i=0;i<4;i++)
   {
    for(j=1;j<=8;j++)
    {
     while(IRsignal==0);
     Delay0_9ms();
     
     if(IRsignal==1)
     {
      Delay1ms();
      CodeTemp=CodeTemp|0x80;
      if(j<8) CodeTemp=CodeTemp>>1;
     }
     else
     if(j<8)CodeTemp=CodeTemp>>1;
    }
    IRcode[i]=CodeTemp;
    CodeTemp=0; 
   }
   
   Delay();
    studyi++;
  }
 }
 if(studyi==1)
 {
  for(i=0;i<4;i++)
  {
  IRcode2[i]=IRcode[i]; 
  }
 }
 if(studyi==2)
 {
  for(i=0;i<4;i++)
  {
  if(IRcode2[i]!=IRcode[i])
  {
   studyi=0;
   break;
  }
  if(i==3)
  {
  for(i=0;i<4;i++)
  {
  key_ircode[keynum][i]=IRcode[i];
  }
  EX0=0;
  LED2=1;
  } 
  }
  studyi=0;
 }
 EA=1;
}
void SendIRdata(uchar IR[])
{
  int i;       
  char irdata;
  //---发红外码
  CR = 1;
  //发送9ms的起始码
  TH0 = 0xDF; 
  TL0 = 0x98; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数
  Flag=1;
  P3_4=0;  
  do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
  //发送4.5ms的结果码
  TH0 = 0xEF; 
  TL0 = 0xcb; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数
  Flag=1;
  P3_4=1;
  do{}while(Flag!=0);

  //发送十六位地址的前八位
  irdata=IR[0];
  for(i=0;i<8;i++)
  {

     //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //设定时值0为38K 也就是每隔26us中断一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止发送红外信号(即编码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //设定时值0为38K 也就是每隔26us中断一次  
       TR0 = 1;  //1为宽的高电平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //设定时值0为38K 也就是每隔26us中断一次  
     TR0 = 1;   //0为窄的高电平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //发送十六位地址的后八位
  irdata=IR[1];
  for(i=0;i<8;i++)
  {
    //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //设定时值0为38K 也就是每隔26us中断一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止发送红外信号(即编码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //设定时值0为38K 也就是每隔26us中断一次  
       TR0 = 1;  //1为宽的高电平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //设定时值0为38K 也就是每隔26us中断一次  
     TR0 = 1;   //0为窄的高电平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //发送八位数据
  irdata=IR[2];
  for(i=0;i<8;i++)
  {
     //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //设定时值0为38K 也就是每隔26us中断一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止发送红外信号(即编码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //设定时值0为38K 也就是每隔26us中断一次  
       TR0 = 1;  //1为宽的高电平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //设定时值0为38K 也就是每隔26us中断一次  
     TR0 = 1;   //0为窄的高电平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //发送八位数据的反码
  irdata=IR[3];
  for(i=0;i<8;i++)
  {
    //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //设定时值0为38K 也就是每隔26us中断一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止发送红外信号(即编码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //设定时值0为38K 也就是每隔26us中断一次  
       TR0 = 1;  //1为宽的高电平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //设定时值0为38K 也就是每隔26us中断一次  
     TR0 = 1;   //0为窄的高电平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }
    CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //设定时值0为38K 也就是每隔26us中断一次  
    TR0 = 1;
  Flag=1;
   P3_4=0;
 do{}while(Flag!=0);
 CR=0;
 IR_SEND=1;
  P3_4=1;
  Flag=0;
}
/****************************************************************/
 bit iic_start_decide()////IIC 开始判断
{
 while(SCL==0);////开始不满足条件
 while((SCL==1)&&(SDA==1));///开始条件
 if((SCL==1)&&(SDA==0))////开始
 {
  while(SCL==1);///等待到时钟开始低跳变
  return 1;
 }
 else
 return 0;
}
/****************************************************************/
bit iic_stop_decide()////IIC 结束判断
{
 while(SCL==0);////结束不满足条件
 if((SCL==1)&&(0==SDA))////结束
 {
  while(SDA==0);///等待到数据开始高跳变
  return 1;
 }
 else
 {
 return 0;}
}
/****************************************************************/
uchar iic_receive()
{
 uchar i;
 uchar rdata='0';
 SDA=1;
 for(i=0;i<8;i++)
 {
  rdata<<=1;
  while(SCL==0);///当时钟为低时,数据无效,等待
  if(SDA==1)
  rdata++;
  while(SCL==1);///防止在一个高电平时读8次
 }
 return (rdata);
}
/****************************************************************/
bit iic_ack_decide()
{
bit ack_flag;///局部变量
SDA=0;////8位发送完毕,释放数据线SDA,准备接收应答位
while(SCL==0);///等待SCL变高电平
//ack_flag=0;
while(SCL==1);///等待SCL变高电平
SDA=1;
ack_flag=1;
return(ack_flag);
}
void keynum_receive()
{
     iic_start_decide();
  iic_receive();
  iic_ack_decide();
  iic_receive();
  iic_ack_decide();
  keynum=iic_receive();
  iic_ack_decide();
  iic_stop_decide();
}
/****************************************************************/
void main()//主程序
{

/*******************************************************************/
//初始化动作    
 studyi=0;     //红外学习状态
   initUart();   //串口初始化
 IRinit();   //红外学习初始化
 IICinitSteve();
 PCAinit();
 T0init();              
 keynum=0xff;   //按键初始化
/********************************************************************/
 for(p=0;p<30;p++)
 {
 for(i=0;i<4;i++)
 {
  key_ircode[p][i]=IapReadByte(0x0000+(p*4)+i);
 }
 } 
/*******************************************************************/ 
  while(1)
  { 
//   keycan();
 while(keynum==0xff);
   if(IRS_STATE==0)//遥控状态
 {
 /********************************************************************
  if(Skey==0)//触发学习键
  {
   Delay();
   if(Skey==0);
   {
   while(Skey==0);
   LED1=0;
   IRS_STATE=1;
   } 
  }
 /********************************************************************/ 
  if(keynum==16)//触发学习键
  {
   LED1=0;
   IRS_STATE=1; 
  }
  else if(keynum!=0xff)
  {
  putstring(key_ircode[keynum]);
  SendIRdata(key_ircode[keynum]); 
  }
 }
 else if(IRS_STATE==1)//学习状态
 {
/********************************************************************/ 
  if((keynum!=0xff)&&(keynum!=16))
  {
    EX0=1;
    LED2=0;
    while(LED2==0); 
  }
/********************************************************************/     
  if(keynum==16)//触发学习键
  {
   LED1=1;
   LED2=1;
   EX0=0;
   IapEraseSector(0x0000);
   for(p=0;p<30;p++)
    {
    for(i=0;i<4;i++)
     {
       IapProgramByte((0x0000+(p*4)+i), key_ircode[p][i]);
     }
    }
   IRS_STATE=0;
   } 
 }
 keynum=0xff;
  }

}
/****************************************************************/
void ser() interrupt 4 //串口中断
{
 RI=0;
 num=1;
}
void PCA_isr() interrupt 7 using 1
{
    CCF0 = 0;                       //Clear interrupt flag
    CCAP0L = value;
 CCAP0H = value >> 8;            //Update compare value
    value += T38KHz;                     //Clear interrupt flag
}
void timeint(void) interrupt 1 

  Flag=0;
  TR0=0;
}
void II2C_INT1(void) interrupt 2
{
 EX1=0;
 keynum_receive();
 EX1=1;
}


关键字:模拟I2C  从机程序 引用地址:用51模拟I2C从机程序

上一篇:I2C模拟程序----汇编语言格式
下一篇:89C52控制MAX7219驱动数码管

推荐阅读最新更新时间:2024-03-16 16:03

51单片教程第6讲_串行口通信
STC51单片机一般带有1个串口,有的带有2个串口,串口一般用于下载程序和串口通信。串口通信特别适合控制设备,所以工控机的电脑上一般都带有串口。 51单片机的串口引脚为P3.0引脚与P3.1引脚,分别是RXD和TXD引脚。串口通信可以用于单片机和其它芯片通信或者单片机之间通信或者单片机与电脑通信。串口通信一般都是交叉连接。标准的串口有9个引脚,我们一般情况下,只用RXD TXD GND,剩下的引脚都是通信控制引脚,在以前用于控制电话机,现在已经基本上不用了。所以我们的51单片机上只保留了RXD和TXD。 串口通信的协议非常简单。如果单片机上的串口不够用,还可以用任意两个引脚模拟串口通信。 一般情况,我们用带有起始位的8位串口协议。
[单片机]
51单片实现能设置速度档位的数码管倒计时程序
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200607 ---- @ModifiedTime: 20200619
[单片机]
<font color='red'>51</font>单片<font color='red'>机</font>实现能设置速度档位的数码管倒计时<font color='red'>程序</font>
ADC0809与51单片的连接方式
模数转换器定位为单片机的外部RAM单元,因此与单片机的连接就有很多种。大体上说ADC0809在整个单片机系统中是作为外部RAM的一个单元定位的。具体到某一个连接方式,定位又有区别。adc0809与单片机典型的连接有以下三种: ADC0809与51单片机的第一种连接方式 这是数据线对数据线、地址线对地址线的标准连接方式,如图2.2所示。由于ADC0809片内没有时钟,可利用单片机提供的地址锁存信号ALE经D触发器2分频后获得,ALE引脚的频率是单片机时钟频率的1/6,如果单片机时钟频率采用6MHz,则ALE引脚的输出频率为1MHz,再经过2分频后为500kHz,恰好符合0809对时钟的要求。 由于ADC0809具有输出
[单片机]
ADC0809与<font color='red'>51</font>单片<font color='red'>机</font>的连接方式
C8051FC40扩展PM23L08扩展电路
C8051FC40扩展PM23L08扩展电路 单片机对串口的扩展已经有很成熟的范例,本文不再列出,下面只列出单片机控制FRAM的原理图。在本系统中采用的是地址信号复用模式,这样可以产生ALE 信号。FM20LO8自身带有锁存器,并且片选信号CE不能像SRAM一样直接接地,需要一个预充电时间,这个信号有HC04和HC32产生。而且地址信号需要在他的下降沿进行锁存,具体扩展如图2所示。
[模拟电子]
C80<font color='red'>51</font>FC40扩展PM23L08扩展电路
51单片实现4位数以内的加减法
  中南民族大学,电子信息工程学院,开设了一门课程,叫《嵌入式电路设计》,由舒老师带头,旨在引导低年级的学生入门嵌入式,其内容比较多,包括模电、数电、C语言、单片机、EDA技术等。最近有位师弟找到我,希望我能帮他指导一下,利用AT89C52单片机设计一个最小系统,其中包括矩阵键盘、数码管显示、中断、2位数加减法、定时计数与暂停等功能。我也粗略的设计了一个,在此分享出来,希望能对初学者有所帮助,使更多的人加入到嵌入式的行业来。   开发工具:keil   仿真工具:proteus 代码如下: 头文件:inc_all.h 1 #ifndef INC_ALL_H_ 2 #define INC_ALL_H_ 3 4 volati
[单片机]
搞定Keil的cant execute C:\Keil\C51\BIN\A51.EXE
症状,在KEIL中建立了工程之后,编译就出现这样的提示can't execute 'C:\Keil\C51\BIN\A51.EXE' 在百度上找到了以下的解答 出错原因;被打开的KEIL程序的编译器安装在C盘,即c:\keil的路径下。而使用者的KEIL装在不同路径。 针对这样的原因,就有两种解决方法: 1、自己重建工程,把要打开的程序的文件拷贝过去,编译即可以通过,但这样做比较费事。 2、打开出错的程序,选择菜单:Project-Compoonents,Environment and Books 选择Folders/Extensions,并把 Use settings from TOOLS
[单片机]
51单片开发之定时器
4.1 定时器 4.1.1 51时钟周期介绍 时钟周期:时钟周期T是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,89C51单片机开发板上常用的晶振是11.0592M,对于这个单片机系统来说,时钟周期=1/11059200 秒。 机器周期:是单片机完成一个操作的最短时间。 机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。 51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。 现在很多的增强型51单片机,其速度都比较块
[单片机]
<font color='red'>51</font>单片<font color='red'>机</font>开发之定时器
基于TPS65137设计的有源矩阵OLED电源技术
本文介绍了TPS65137主要特性,方框图以及典型应用电路。TI 公司的TPS65137 是有源矩阵 OLED (AMOLED)电源解决方案,包括一个采用LDO作为后稳压器的升压转换器,输入电压从2.3V到5.5V,具有极好的线瞬态稳压功能,输出电压精度1%,低噪音,输出电流200mA,固定4.6V正输出电压,数字可编程负输出电压可低至-5.2V,具有短路保护和热关断,主要用在有源矩阵 OLED(AMOLED)。 TPS65137应用: Active Matrix OLED Power Supply 图1。TPS65137功能方框图
[电源管理]
基于TPS6<font color='red'>51</font>37设计的有源矩阵OLED电源技术
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved