4114|9

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

keil优化出的问题? [复制链接]

编译环境keil uVersion3 , memory mode :large,variable in xdata时候有问题

static unsigned int ADC0_result[9]

function ()
{
unsigned int kk;
int temp0;
int temp1;
unsigned char i;
...
for(i=0;i <9;i++){
  Delay_ms(100);  //停顿100毫秒
  temp0 = AD0SL  //AD0SL是寄存器
  temp1 = AD0SH  //AD0HL是寄存器
  temp0 = temp0 >> 4;
  temp1 = temp1 < < 4;
  kk=temp1+temp0;
  ADC0_reslut=kk;
}
}

调试发现如果
i=0
temp0=AD0SL----->temp0=0x00a0
temp1=AD0SH----->temp1=0x0090
temp0=temp0>>4----->temp0=0x000a
temp1=temp1 < <4----->temp1=0x0900
kk=temp1+temp0----->kk=0x090a
但是
ADC0_result[0]=kk----->ADC0_result[0]=0x0a0a  这一句赋值不正确!!!找不到原因,类型都是正确的。

为什么0x090a会变成0x0a0a 把高位换成了低位?

更奇怪的是运行调试中,Delay_ms(100);运行好,temp1的值会莫名其妙变化,但其实没有操作!!

怎么这么奇怪,memory mode 选择small,variable in data 似乎没问题。 改回large模式,然后优化选择0,还是在最后一步赋值错误

最新回复

也是有这种可能的, 有些编译器对16位的CPU超过16位的运算支持做的不是很好. 如果认为是编译器的问题, 写个简单的类似的程序再试试.   详情 回复 发表于 2008-9-30 09:55
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
AD0是怎么控制的? 其余部分的代码是什么样的?
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

文件3 main.c


/*******************************引用外部头文件***************************************/
#include "main.h"


/*************************************************************************************
* 主循环程序
*************************************************************************************/
void main (void)
{
        unsigned long voltage;              // 电压值(毫伏)
        //unsigned long tp;
        unsigned char ii;                              // 循环计数器
                                              
        WDTCN = 0xde;
        WDTCN = 0xad;

        SYSCLK_Init();                                       // 系统时钟初始化                                              
        PORT_Init();                        // 系统端口初始化
    ADC0_Init ();                                                // ADC初始化
    Timer3_Init(SYSCLK/SAMPLERATE0);           // 初始化Timer3溢出的值
        ADC0_enable(1);                                                // ADC0使能


        Uart0_Init(BaudRate_115200);
        Uart1_Init(BaudRate_115200);
        Uart0_Enable(1);
        Uart1_Enable(1);
        Uart0_SendString("www.mlarm.com\r\n");
        Uart1_SendString("www.mlarm.com\r\n");
        Uart0_SendString("TeL:029-88223597-802\r\n");
        Uart1_SendString("TeL:029-88223597-802\r\n");
        Uart1_SendString("AD Data on Com1\r\n");        // 提示 数据在Uart0                  

        while (1)
        {
                Delay_ms(200);
                readado();   //自己加的用ADC0BUSY置1启动转化,同样有问题

                    //下面部分注释掉,用time3益处启动转化的,同样有问题
                /*for (ii=0;ii<9;ii++)                                                // ADC0九个通道
                  {
                        Delay_ms(100);
                 EA=0;                                                                // 关闭中断
                 voltage = ADC_Valud_Return(ii);                // 给全局变量赋ADC的值
                 EA=1;                                                                // 重新开启中断
                voltage = voltage * VREF0;                        // 实际电压微伏
                        EA=0;                                                                // 关中断  
                        switch(ii)
                        {
                                case 0:                                                        // 通道0显示
                                 voltage = voltage >> 16;
                                        if(voltage > 0x0004E2)
                                        {
                                                voltage =8*(voltage-0x0004E2);
                                                printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        }
                                        else
                                        {
                                                voltage =8*(0x0004E2 - voltage);
                                                printf ("Channel '%d' voltage Value is -%ldmV\n", ii, voltage);
                                        }
                                        break;
                                case 1:                                                        // 通道1显示
                                        voltage = voltage >> 16;
                                        if(voltage > 0x0004E2)
                                        {
                                                voltage =8*(voltage-0x0004E2);
                                                printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        }
                                        else
                                        {
                                                voltage =8*(0x0004E2 - voltage);
                                                printf ("Channel '%d' voltage Value is -%ldmV\n", ii, voltage);
                                        }
                                        break;
                                case 2:                                                        // 通道2显示
                                 voltage = voltage >> 16;
                                        if(voltage > 0x0004E2)
                                        {
                                                voltage =8*(voltage-0x0004E2);
                                                printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        }                                                                                                         
                                        else
                                        {
                                                voltage =8*(0x0004E2 - voltage);
                                                printf ("Channel '%d' voltage Value is -%ldmV\n", ii, voltage);
                                        }
                                        break;
                                case 3:                                                        // 通道3显示
                                        voltage = voltage >> 16;
                                 if(voltage > 0x0004E2)
                                        {
                                                voltage =8*(voltage-0x0004E2);
                                                printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        }
                                        else
                                        {
                                                voltage =8*(0x0004E2 - voltage);
                                                printf ("Channel '%d' voltage Value is -%ldmV\n", ii, voltage);
                                        }
                                        break;
                                case 4:                                                        // 通道4显示
                                     voltage =10*(voltage >> 16);
                                        printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        break;
                                case 5:                                                        // 通道5显示
                                 voltage =10*(voltage >> 16);
                                        printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        break;
                                case 6:                                                        // 通道6显示
                                 voltage =10*(voltage >> 16);
                                        printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        break;
                                case 7:                                                        // 通道7显示
                                 voltage =10*(voltage >> 16);
                                        printf ("Channel '%d' voltage Value is %ldmV\n", ii, voltage);
                                        break;
                    case 8:                                                        // 芯片温度显示                        
                                        voltage = ADC_Valud_Return (8);
                                        //tp=(voltage/16-1324)*839/4096;       
                                        //printf ("Channel '%d' Tempreture is %ld%ld\n", ii, tp/10,tp%10);
                                        break;
                                default:
                                        break;
                         }
                        EA=1;                                        //显示完毕,开中断
              }*/                          
           }
}

/************************************************************************************
* 文件结束
************************************************************************************/
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 

文件2: ADC.c

/************************************************************************************/
// 引用外部头文件
#include "c8051f020.h"                 
#include "ADC.h"
#include

/************************************************************************************/

/***********************************************************************************
* 函数名称:ADC0_Init;
*
* 函数功能描述:设置ADC0使用定时器Timer3溢出作为转换源,转换完成后产生中断,使用左对齐输出模式
*              
* 输入参数:unsigned int类型指针,是ADC0使用时存放返回数据数组的指针;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void ADC0_Init (void)
{
        ADC0_Ctr_Set;       // 关闭ADC0; 低能追踪模式
        REF_Ctr_Set;        // 打开温度传感器, on-chip VREF
        ADC0_Channel_0;         // ADC0使用"0"通道
        SAR0_Clk_Set;             // ADC转换时钟= 2.5MHz
        ADC0_Gain;          // PGA gain = 1
        AMX0CF_set;          //设置AMU0X通道寄存器,都为单端输入         shenhong added
        //ENABLE_ADC3;        // 打开ADC0中断               
}

/***********************************************************************************
* 函数名称:Timer3_Init;
*
* 函数功能描述:lcd_init;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer3_Init (int counts)
{
   Timer3_Stop;                      // 停止Timer3; 清除TF3;
   Timer3_Reload_init=-counts;       // 初始化装载值
   TMR3_Count_Start;                 // 设置立即装载
   DISABLE_Tmr3;                     // 禁止定时器Timer3中断
   Timer3_Start;                     // 开启Timer3
}

/***********************************************************************************
* 函数名称:ADC0_enable
*
* 函数功能描述:ADC0开关,1:打开;0:关闭
*              
* 输入参数:1:打开;0:关闭
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void ADC0_enable(unsigned char flag)
{
        if(flag)
        {
                ADC0_Start;              // 打开ADC
                ENABLE_INTERRUPTS;  // 开启全局中断
        }
        else
                ADC0_Stop;               // 关闭ADC
}

/***********************************************************************************
* 函数名称:ADC0_ISR;
*
* 函数功能描述:中断服务响应;ADC0 采样,存储在主程序定义的全局数组中,选择下个通道转换
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void ADC0_ISR (void) interrupt 15
{
   static unsigned char channel = 0;    // ADC mux 通道 (0-8)

   ADC0_IntFlag_Clear;                  // 清除ADC转换完成标志
   ADC0_result[channel]=ADC_Value(0);          // 读ADC值
   channel++;                           // 改变通道
   if (channel == 9)
      channel = 0;
   ADC0_Channel = channel;              // 设置mux到下个通道
}

/***********************************************************************************
* 函数名称:ADC_Value;
*
* 函数功能描述:ADC0,ADC1转换完成后数据寄存器数据转换成unsigned int型
*              
* 输入参数:unsigned char类型,"0"为选择转换ADC0数据格式,非"0"为选择转换ADC1数据格式;
*
* 返回数据:unsigned int类型,当前AD转换完成后的unsigned int类型数据量;
*
* 注意:    none;
************************************************************************************/
unsigned int ADC_Value (unsigned char Flag)
{
        unsigned int data temp,temp0,temp1;

        while(AD0INT==0){ }                  //shenhong added

        if(Flag)                                        //ADC1
                temp0=ADC1;                                                       
        else                                                //ADC0                                       
        {
                temp0=ADC0L;
                temp1=ADC0H;
        }
        temp=temp1*16+temp0/16;       
        return temp;                                //取回ADC转换数据
}

/***********************************************************************************
* 函数名称:ADC_Value_Return;
*
* 函数功能描述:主程序通过此函数取得ADC0目标通道数据
*              
* 输入参数:unsigned char类型,ADC0通道号;
*
* 返回数据:unsigned int类型,ADC0通道对应的数据;
*
* 注意:    ADC0共有9个通道(包括温度通道),注意范围,超出范围返回0XFFFF;
************************************************************************************/
unsigned int ADC_Valud_Return (unsigned char chn)
{
        if (chn<9)                                        //通道范围有效
        return ADC0_result[chn];        //取回通道对应数据
        else                                                        //通道范围出错
        return 0xffff;                                        //返回错误信息
}

/***********************************************************************************
* 函数名称:ADC_ReadADC0;
*
* 函数功能描述:主程序通过此函数直接获取ADC0通道的9个通道的数据,包括8温度数据
*               此函数只能在ADC0设置为AD0BUSY=1启动AD转化情况下其作用。
*              
* 输入参数:无
*
* 返回数据:unsigned int类型,ADC0通道对应的数据;
*
* 作者:沈宏
*
* 注意: ADC0共有9个通道(包括温度通道),注意范围,超出范围返回0XFFFF;
************************************************************************************/

void ADC_ReadADC0(void)
{
unsigned char i;
volatile int kk;
volatile int temp0;
volatile int temp1;

        for(i=0;i<9;i++){
                   ADC0_Channel = i;
                   AD0INT = 0;
                   AD0BUSY = 1;
                   //while(AD0INT==0){ }
                   Delay_ms(100);
                   temp0 =  ADC0L;
                   temp1 =  ADC0H;
                   temp0 = temp0 >> 4;
                   temp1 = temp1 << 4;
                   kk = temp1 + temp0 ;
                   ADC0_result = kk;
        }
}
/************************************************************************************
* 文件结束
************************************************************************************/
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
程序阅读注意:
1.这个程序本是山西铭朗科技的ML-F020DK+学习板,配的是C8051F020芯片
2.自带AD程序本来用time3溢出启动转化,后发现1楼类似的问题后,自己写了个函数改成ADC0BUSY=1启动
3.程序编译使用keil uVserion3,target钟memory mode设置large:variable in XDATA,优化0-8都试过
即使设置成0,还是1楼类似的问题。总之程序有点混乱。

文件1 ADC.h

#include "Delay.h"

#ifndef __ADC_h__
#define __ADC_h__

/************************************************************************************
* 常量及全局变量定义
*************************************************************************************/
static unsigned int  ADC0_result[9];                        // AIN0-7和温度传感器数值寄存数组
static unsigned int  ADC1_result[8];                        // 8Bit ADC1 数值寄存数组

sfr16 TMR3RL   = 0x92;                                 // Timer3 reload value
//sfr16 ADC0     = 0Xbe;                      //ADC0的值 shenhong added

#define Timer3_Reload_init        TMR3RL                        // 定时器3重装载数值寄存器
sfr16 TMR3     = 0x94;                                 // Timer3 counter
#define TMR3_Count_Start          TMR3=0xffff                // 设置定时器3计满溢出,立即装载.
#define SYSCLK                       22118400        // SYSCLK frequency in Hz
#define BAUDRATE                     115200          // Baud rate of UART in bps
#define SAMPLERATE0                  50000           // ADC0 Sample frequency in Hz
#define VREF0                        2500            // VREF voltage in millivolts
#define ADC0_IntFlag_Clear        AD0INT=0                // 清零AD中断标志位
#define ADC0_Start                        AD0EN=1                        // ADC0中断使能
#define ADC0_Stop                        AD0EN=0                        // ADC0中断使能关闭
#define DISABLE_INTERRUPTS  EA=0                        // 中断禁止
#define ENABLE_INTERRUPTS   EA=1                        // 中断允许
#define ADC0_Channel                 AMX0SL                        // ADC0通道寄存器
#define ADC0_Channel_0                 AMX0SL=0x00                // ADC0使用"0"通道
#define Timer3_Stop                TMR3CN = 0x02                  // 清除定时器3中断标志位,定时器3禁止。
#define Timer3_Start        TMR3CN|= 0x04                  // 定时器3开启
#define DISABLE_Tmr3        EIE2&=0xFE                        // 定时器3中断允许
#define ENABLE_ADC3                EIE2|=0x02                        // 打开ADC0中断
//#define ADC0_Ctr_Set        ADC0CN = 0x45                // ADC0控制设置,定时器3溢出启动AD转换,数据左对齐
#define ADC0_Ctr_Set        ADC0CN = 0x41                // ADC0控制设置,ADBUSY=1出启动AD转换,数据左对齐
#define REF_Ctr_Set                REF0CN = 0x07                // 打开温度传感器, on-chip VREF
#define ADC0_Gain                ADC0CF&=0xf8                // ADC0增益设置
#define SAR0_Clk                2500000                                // ADC0 SAR转换时钟数值
#define        SAR0_Clk_Set        ADC0CF=(SYSCLK/SAR0_Clk)<<3                // ADC0 SAR转换时钟数值设置
#define AMX0CF_set      AMX0CF=0x00                        //设置AMUX0通道寄存器,都为单端输入
                                                                                        // 请参考C8051F020.PDF

/******************************函数外部引用声明**************************************/
/***********************************************************************************
* 函数名称:ADC0_Init;
*
* 函数功能描述:设置ADC0使用定时器Timer3溢出作为转换源,转换完成后产生中断,使用左对齐输出模式
*              
* 输入参数:unsigned int类型指针,是ADC0使用时存放返回数据数组的指针;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void ADC0_Init (void);

/***********************************************************************************
* 函数名称:Timer3_Init;
*
* 函数功能描述:lcd_init;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer3_Init (int counts);

/***********************************************************************************
* 函数名称:ADC0_enable
*
* 函数功能描述:ADC0开关,1:打开;0:关闭
*              
* 输入参数:1:打开;0:关闭
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void ADC0_enable(unsigned char flag);

/***********************************************************************************
* 函数名称:ADC_Value;
*
* 函数功能描述:ADC0,ADC1转换完成后数据寄存器数据转换成unsigned int型
*              
* 输入参数:unsigned char类型,"0"为选择转换ADC0数据格式,非"0"为选择转换ADC1数据格式;
*
* 返回数据:unsigned int类型,当前AD转换完成后的unsigned int类型数据量;
*
* 注意:    none;
************************************************************************************/
unsigned int ADC_Value (unsigned char Flag);

/***********************************************************************************
* 函数名称:ADC_Value_Return;
*
* 函数功能描述:主程序通过此函数取得ADC0目标通道数据
*              
* 输入参数:unsigned char类型,ADC0通道号;
*
* 返回数据:unsigned int类型,ADC0通道对应的数据;
*
* 注意:    ADC0共有9个通道(包括温度通道),注意范围,超出范围返回0XFFFF;
************************************************************************************/
unsigned int ADC_Valud_Return (unsigned char channel);

/************************************************************************************/
#endif

/*************************************************************************************
* 文件结束
**************************************************************************************/
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
还没来得及仔细看.   

可能还是同步的问题, 是不是被中断或者别的地方把数据改了.
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

7
 
应该不会是中断,调试的时候没有进中断,我在函数ADC_ReadADC0(或者readad0)中也增加了关闭中断的语句,老样子。

修改来修改去,不是这步赋值错,就是那步赋值错,反正就是赋值有问题! main增加调步进电机的函数时,传转1.8度的参数进去,跟踪进去,发现传入的浮点数不是1.8,变成了很小的一个数。

总而言之,言而总之,赋值有问题。

我在网上看了一些keil的优化讨论,感觉keil是非常奇怪的编译器,有点强行优化的感觉,不管你运行逻辑对不对,就是给你瞎改。 不是先保证正确性,而是先保证乱优化。  空间不够,你可以报错啊,我们有能力自己改,谁让你瞎优化了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
跟踪ADC_ReadADC0函数的一些汇编片段

C:0x03C8    AFBE     MOV      R7,ADC0L(0xBE)
C:0x03CA    900088   MOV      DPTR,#0x0088
C:0x03CD    E4       CLR      A
C:0x03CE    F0       MOVX     @DPTR,A
C:0x03CF    A3       INC      DPTR
C:0x03D0    EF       MOV      A,R7
C:0x03D1    F0       MOVX     @DPTR,A   //这句显然有问题,谁让它把寄存器ADC0H第二次赋值temp0了
   189:                    temp1 =  ADC0H;
C:0x03D2    AFBF     MOV      R7,ADC0H(0xBF)
C:0x03D4    A3       INC      DPTR
C:0x03D5    E4       CLR      A
C:0x03D6    F0       MOVX     @DPTR,A
C:0x03D7    A3       INC      DPTR
C:0x03D8    EF       MOV      A,R7
C:0x03D9    F0       MOVX     @DPTR,A         //这句显然有问题,谁让它把寄存器ADC0H第二次赋值temp1了
   190:                    temp0 = temp0 >> 4;
C:0x03DA    900088   MOV      DPTR,#0x0088
C:0x03DD    E0       MOVX     A,@DPTR
C:0x03DE    FE       MOV      R6,A
C:0x03DF    A3       INC      DPTR
C:0x03E0    E0       MOVX     A,@DPTR
C:0x03E1    7804     MOV      R0,#0x04
C:0x03E3    CE       XCH      A,R6
C:0x03E4    A2E7     MOV      C,0xE0.7
C:0x03E6    13       RRC      A
C:0x03E7    CE       XCH      A,R6
C:0x03E8    13       RRC      A
C:0x03E9    D8F8     DJNZ     R0,C:03E3
C:0x03EB    F0       MOVX     @DPTR,A
C:0x03EC    EE       MOV      A,R6
C:0x03ED    900088   MOV      DPTR,#0x0088
C:0x03F0    F0       MOVX     @DPTR,A
   191:                    temp1 = temp1 << 4;
   192:                    //kk = temp1 + temp0 ;
C:0x03F1    90008B   MOV      DPTR,#0x008B
C:0x03F4    E0       MOVX     A,@DPTR
C:0x03F5    C4       SWAP     A
C:0x03F6    F8       MOV      R0,A
C:0x03F7    540F     ANL      A,#0x0F
C:0x03F9    C8       XCH      A,R0
C:0x03FA    68       XRL      A,R0
C:0x03FB    FF       MOV      R7,A
C:0x03FC    90008A   MOV      DPTR,#0x008A
C:0x03FF    E0       MOVX     A,@DPTR
C:0x0400    C4       SWAP     A
C:0x0401    54F0     ANL      A,#B(0xF0)
C:0x0403    48       ORL      A,R0
C:0x0404    FE       MOV      R6,A
C:0x0405    F0       MOVX     @DPTR,A
C:0x0406    A3       INC      DPTR
C:0x0407    EF       MOV      A,R7
C:0x0408    F0       MOVX     @DPTR,A
   193:                    ADC0_result = temp1 + temp0;
C:0x0409    900089   MOV      DPTR,#0x0089
C:0x040C    E0       MOVX     A,@DPTR
C:0x040D    2F       ADD      A,R7
C:0x040E    FF       MOV      R7,A
C:0x040F    900088   MOV      DPTR,#0x0088
C:0x0412    E0       MOVX     A,@DPTR
C:0x0413    3E       ADDC     A,R6
C:0x0414    FE       MOV      R6,A
C:0x0415    ED       MOV      A,R5
C:0x0416    25E0     ADD      A,ACC(0xE0)
C:0x0418    2466     ADD      A,#0x66
C:0x041A    F582     MOV      DPL(0x82),A
C:0x041C    E4       CLR      A
C:0x041D    3400     ADDC     A,#0x00
C:0x041F    F583     MOV      DPH(0x83),A
C:0x0421    EE       MOV      A,R6
C:0x0422    F0       MOVX     @DPTR,A
C:0x0423    A3       INC      DPTR
C:0x0424    EF       MOV      A,R7
C:0x0425    F0       MOVX     @DPTR,A

....真没见过这样的情况,真的很奇怪,简直是乱来了
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

9
 
的确是keil的问题,代码换成芯片公司自带的编译器,编译运行没问题。keil 支持的芯片太多了,乱了。。。。我芯片肯定没选错,c8051f020的驱动也安装的

只是不知道在keil重,这个问题如何解决
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

10
 
也是有这种可能的, 有些编译器对16位的CPU超过16位的运算支持做的不是很好.

如果认为是编译器的问题, 写个简单的类似的程序再试试.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/8 下一条
ADI &文晔 探索季第一站,邀您在活动帖跟帖,ADI资深工程师将与您一道寻求解决之道! ...
春晚,最出圈当属穿着棉马甲跳秧歌的机器人”秧Bot”。
转手绢、飞手绢、变换队形,精准度和稳定性甚至超越人类,这背后少不了电机控制技术。

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表