资讯详情

51单片机学习笔记(郭天祥版)(3)——引脚讲解、数码管静态显示、中断系统(外部中断,定时器中断)...

学习引脚功能

9引脚

  • 复位管脚,平时复位2个机器周期(24个时钟振荡周期)的高电,单片机正常工作时给0.5v的低电平
  • VPD备用电源的输入端是主电源VCC当故障降低到规定的低电平时,故障将降低到规定的低电平时 5V自动接入电源RST端,为内部RAM提供备用电源,以保证片内RAM不丢失信息,保证单片机复位后继续正常运行(暂时不使用第二个功能)

RXD:串行输入口

TXD:串行输出口

单片机通过电脑下载这两个程序IO口,单片机内部有固件程序。上电后,首先与计算机通信一次,以确定计算机是否发送下载命令。如果没有,执行内部程序。如果有,交互并下载要下载的程序。因此,需要冷启动。单片机只有在启动时才能检测是否下载。

INT0、INT1:外部中断0、外部中断1

T0、T1:定时器0外计数输入,定时器1外计数输入(具有定时器和计数器功能),与管脚无关。外部计数器的输入端:在设置内部寄存器为计数器后,在端口添加方波(高低电平变化的波形),它可以计数您输入了多少方波,即总共有多少高低电平变化。制作频率计,测量信号源的频率。如果是正弦波,则通过比较器将其转换为方波,然后输入端口,编写程序,控制单片机进行计数。三角波也可以通过积分变成方波。方波可以直接读取频率。

WR、RD:外部数据存储器的编写和选择,外部数据存储器的读取和选择(暂时不需要,使用片内存储器,加深对单片机的会明白)

P3.0~P3.每个都有相应的寄存器设置,而不是一个寄存器设置7个。

XTAL1.2:晶振输入端,外加晶振时使用


复位电路

按下开关后,VCC将于1K根据分压(1/(10) 1) *5),RST电压接近5V,按下时,复位必须大于24个时钟周期(24个时钟周期很短)。上电时也会自动复位。电容充电时,两个极板会有电压,然后复位。充电后会慢慢放电,10K电阻流到地。放电时间:τ(tao)=根号下(RC)


晶振电路

两个电容器在上电时有助于晶振Y1振动,晶体振动正常工作是输出正弦波,有时不加电容器可能不会起床,电容器充电后,电容器放电有助于振动。一般12MHz左右用30P电容,6MHz一般用20P。


29引脚(PSEN):一般不用,空着就可以了

29-31,9一般都是用于编程的,at公司的的89c51编程时必须有专门的编程器编程VPP要加12V电压可以写程序,PROG(program),ALE:单片机正常工作时,可输出1/6小时周期的脉冲(方波)。如果要检测单片机是否正常工作,这里放一个示波器,检测是否是晶体振动的1/6频率输出方波。

EA:内部程序存储器选择控制端,高电通常访问内部存储器,但程序计数器值超过0xff即51单片机4KB,记值范围0~0xfffh,将自动转换为执行外部程序,即当超过内部程序时,将自动转换为执行外部存储器的程序。低电通常只访问外部存储器程序,无论是否有内部程序存储器,对于8031,由于没有内部存储器,脚必须接地,只能选择外部存储器。现在很少使用外部程序存储器,技术发展迅速,单片机内的存储空间越来越大。所以一般EA接高即可。

单片机这里EA内部执行程序直接高电平。

P0为双向8位三态(高电平、低电平、高电阻)IO口,与P1~P不同的是,它们是8位准双向。P1~三线内有固定的上拉电阻,P0没有,当P1~3.输入使用时,应先写入口1,准双向,即准备成为双向口,输出时可直接使用,准双向IO无高阻浮空状态,即无高阻状态,P0线内无固定上拉电阻,由两个MOS管串联,既可开路输出,又可处于高阻浮空状态,故称双向三态IO口。

到目前为止,管脚介绍已经完成,29PSEN不用记,30ALE正常工作时1/6晶振频率的方波,31EA在哪里执行程序的标志,30和31的第二个功能VPP、PROG编程用的,10~17学习时记住第二个功能,不需要记住一次。学习单片机就是通过学习程序把这32个IO随机控制,设计电路要不断积累经验(网上查资料,找书看),调试。


有特殊功能寄存器P0~P3,PSW、IP、IE,其实对单片机本身是开放的IO口,P0~P三是四个寄存器,它们的操作可以直接反映高低电平的变化,每个寄存器都有一个地址。 (之前已经分散说过)


点阵发光二极管中有一种可以发出三种颜色(三原色),可以控制一种、两种或三种发出不同的颜色。这种不同的颜色变化是由点组成的,会形成真正的颜色,所有的颜色都出现了,电视信号接收信号分析后,送到屏幕变成电视。所有的电子设备都可以做,空调也可以用单片机做,内部有变频器,单片机控制其频率变化,然后运行空气压缩机,空气压缩机运行压缩空气产生空气变化,这是制冷、加热、温度传感器、加热管、温度到一定温度自动停止,用继电器切换加热管是否加热。功能强的单片机也可以直接控制CRT显示器,也是三原色三线控制,只是输出的模拟信号,模拟量不同,输出亮度不同,还有两条数据线X场,Y场,控制在屏幕显示的位置,反复控制颜色,不断扫描图形。(..基本废话,就当理解吧)

数字管使用7或8段LED发光二极管显示七段无点(dp)

共阴极是发光二极管阴极连接在一起,共阳极是发光二极管阳极连接在一起。连接在一起的地方称为公共端。公共端是接地还是电源是高低电平,由单片机组成IO口决定的。

例如,如果显示1,则为数字管bc两个led亮

  • 共阴极:bc两个是1,另一个是0
  • 共阳极:bc两个是0,另一个是1

然后高低位从高位dp到单位a,共阴极就是0x06,共阳极为0xf9

什么是段选,什么是位选?

  • 选择:构成一个数字 一个点的8个led灯是一个,也就是一个数字管。当许多人连接在一起时,他们需要选择哪一个是明亮的,而选择的作用是选择,即公共端。
  • 段选:构成一个数字 一个点的8个led每一盏灯都是一段,控制哪一段亮的是段选,即a~dp。

总线形式画出来的,P20~P23位选,P00~P07段选择,段选加拉电阻,单片机IO口输出的电流很小,可能不到1mA,照亮发光二极管需要5个~10mA电流,所以需要拉电阻。当P00位高,P当20位低时,电流将从IO口和VCC一起流经a然后到P这是最简单的连接方法,我们的电路板不同,但原理相似。疑问:如果P00位低,P如果20位低,电压不会直接从VCC进入IO口和LED了吗?

图中有错误的郭天祥教学实验板,红线划掉,每根管脚控制一段,WE是公共端阴极,所有段选都连在一起,图中每个数字管的e都是1,位选独立。

这里选择的寄存器12是AD芯片的片选chip select,低电平有效,只有在模数转换时才能使用。这里一直给高电平

定器分别控制段选和位。锁存器的输入连接到第一个控制段选择和第二个位选D0~D7,即接在了P0,都有10K上拉电阻,P0位三态状态,无上拉电阻,不能给高低电平操作。加上拉电阻后,一旦上电,就是高电平。这就是为什么记得以后设计电路的时候单片机。P0加拉电阻,大小10K,接法如此。为什么两个锁存器都连接在这里?P0?原因锁定器可以使用11个引脚来控制是否使用,高电平,输入输出直接,低电平,输入输出断开,输出保持原始值(实际上是高电平到低电平的下降)。忘了回去看看。例如,首先让第二个锁定器11高,选择控制数字管,然后11低,保持输出不变,然后打开段选择的锁定器,最后锁定。

这是一组IO口控6个数码管,最多可以放8个,位选(12、13个数码管还没有放)可以放8个,而之前用过12个IO口控制4个数字管,浪费IO占用资源。


编程开始

如何让第一个数字管亮1,其他不亮?

首先,其他无数管不亮,单片机上电后IO口是高电平,所以所有的位选和段选都是高电平,所以所有LED不亮的原因当然是数码管LED阳极和阴极都是高电平的。接下来要让第一个数码管亮起来,首先要打开位选锁存器选择某个数码管,首先让位选锁存器11引脚1(P2^7=1.当然,你不能这样使用它。毕竟,你应该先定义它),这样你就可以控制位置选择锁定器,然后让第一个明亮,而其他的则不用担心。然后第一个数字管的位置是0(位置选择是数字管LED阴极,忘了就看看),其他位置选为1,那么就是0xfe,这样数码管就选完了,那么就要关闭这个锁,11阴极很低。下一步是选择控制段,让数码管亮1,首先打开段选锁存器,让他的11引脚1(P2^6=1),这样打开,亮1,那就是bc为1,其他为0,那就是0x06.控制段选后关闭锁存器,11位低,全部操作完毕。

在这里,我用我的单片机电路图

 1 #include<reg51.h>  2   3 sbit DUAN=P2^6;  4 sbit WEI=P2^7;  5   6 void main()  7 {  8     while(1)  9     { 10         //控制位选 11         WEI=1; 12         P0=0xfe; 13         WEI=0; 14          15         ///控制段选择 16         DUAN=1; 17         P0=0x06; 18         DUAN=0; 19     } 20 

 1 #include<reg51.h>
 2 
 3 sbit DUAN=P2^6;
 4 sbit WEI=P2^7;
 5 
 6 void main()
 7 {
 8     while(1)
 9     {
10         //控制位选
11         WEI=1;
12         P0=0xf0;
13         WEI=0;
14         
15         //控制段选
16         DUAN=1;
17         P0=0x06;
18         DUAN=0;
19         while(1);
20     }
21 }

这样呢就显示了4个1,先看下我代码里最后多了一个while(1),如果没有这条语句,在最外面的while(1)循环中,执行到WEI=0后,P0一开始是有值的,那么在DUAN=1时,P0此时还是0xfe,然后才会变成0x06,同样的在DUAN=0结束后P0=0x06,然后再一次循环开始,WEI=1,这时候P0也是有值的,是0x06,也就是出了第二三两个数码管都亮。这样在这种一直闪烁的情况下,由于执行的很快,会有一些错误,如下:

因此要加上while(1),不知道实体单片机会不会这样。


 接下来让8个数码管从0计数到F

 1 #include<reg51.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 
 5 sbit WEI=P2^7;
 6 sbit DUAN=P2^6;
 7 
 8 void Delay1ms();
 9 void delay(int n);
10 
11 uchar code Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
12 //                    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   无显示
13 //[]括号内可以不写,编译时会自动数元素数然后分配内存
14 
15 uchar num;
16 void main()
17 {
18     while(1)
19     {
20         WEI=1;
21         P0=0x00;
22         WEI=0;
23         
24 //        DUAN=1;
25         for(num=0;num<15;num++)
26         {
27             DUAN=1;
28             P0=Table[num];
29             delay(1000);
30             DUAN=0;
31         }
32 //        DUAN=0;
33     }
34 }
35 
36 void delay(int n)
37 {
38     while(n--)
39     {
40         Delay1ms();
41     }
42 }
43 void Delay1ms()        //@12.000MHz
44 {
45     unsigned char i, j;
46 
47     i = 2;
48     j = 239;
49     do
50     {
51         while (--j);
52     } while (--i);
53 }

code表示编码表,写它编译完会放在程序存储器中,如果不写就放在了随机存储器,随机存储器是有限的,也就是数据存储器,51单片机是128字节,每定义一个char变量,例如char num;,这将占用一个字节,如果没用code那么这个char数组里面有多少个数就占用多少字节,而若是int数组,那么就占用2*元素数的字节。如果程序大了,变量多了,就不够用了,数据存储器很宝贵,要省着用,所以用多大的数据量就用多大的变量,例如能用char就不用int。


 中断系统

所有微处理器最有用的就是中断,而且经常用到

51单片机有5个中断源,可以嵌套,就是A发生中,B事件来了,那么去执行B,结果执行B的时候,C事件发生了,那么就去执行C,当C执行完,接着执行B,执行完B,再去执行A。这里不讲嵌套,之后慢慢就会了,当然51单片机只有两级嵌套,嵌入式系统可以嵌套4、5级。

 

汇编中RETI是中断的返回条件,c语言没有,c语言执行完中断函数就自己回去了。

 

计算机的键盘、鼠标等都是有中断的,键盘通过发送一段扫描码,按一下发送一段,扫描码是有两个8位的数据过去,单片机检测到扫描码再分析判断出按得哪个键。单片机可以驱动键盘,也可以驱动显示器,可以用单片机做一个电脑,当然要求单片机性能高点。

可以看到1(中断号)是键盘,3是红外.....共23个

 

串行输入和串行输出是一个中断源ES,所以是5个中断源(EX0,ET0,EX1,ET1,ES)。串口暂时不用,这一位先不考虑。

下面第二个和第三张图片先不用看。

EA总中断,要想要有中断就要打开EA,EA=0关闭,CPU屏蔽所有中断请求,也称为CPU关中断,所以如果EA=0,那么P3口只能作为普通IO口,EA=1打开总中断,启用了第二功能。

要想启动外部中断0,那么要开启总中断(EA=1)和外部中断源(EX0=1),并且选择电平触发方式(IT0=0,IT0=1为从高到低负跳变沿触发),当P3^2有低电平输入,就去执行中断程序。

 下面第一张图是串口的,先不用看

下面这个也看不懂,可以先不看

嵌套时,高优先级的可以在低优先级中断中继续中断

下面这个必须记住,记住优先级顺序就好,程序入口是汇编用的。

例如当这五个中断同时发生,那么先发生外部中断0,然后定时计数器0,外部中断1,以此类推。

他们的序号分别为0~4,等会写程序会用。

中断允许控制寄存器,字节地址A8H,所有能被8整除的寄存器都可以进行位寻址,就是可以直接操作某一位,例如在操纵P2时,我们就不能P2^3=0,而这里就可以EA(IE寄存器的最高位)=1。

打开头文件REG51.H或者52,可以看到定义了IE,然后又定义了IE的各个位

所有寄存器上电后,默认为0,所有默认为电平触发。(IT0=0)

下面是当P3^2变为低电平时会触发中断函数的代码。

 1 #include<reg51.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 
 5 sbit WEI=P2^7;
 6 sbit DUAN=P2^6;
 7 sbit LED0=P1^0;
 8 
 9 void Delay1ms();
10 void delay(int n);
11 
12 uchar code Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
13 //                    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   无显示
14 //[]括号内可以不写,编译时会自动数元素数然后分配内存
15 
16 uchar num;
17 void main()
18 {
19     EA=1;
20     EX0=1;
21     while(1)
22     {
23         WEI=1;
24         P0=0x00;
25         WEI=0;
26         
27 //        DUAN=1;
28         for(num=0;num<15;num++)
29         {
30             DUAN=1;
31             P0=Table[num];
32             delay(1000);
33             DUAN=0;
34         }
35 //        DUAN=0;
36     }
37 }
38 
39 void exter0() interrupt 0
40 {
41     LED0=~LED0;
42 }
43 
44 void delay(int n)
45 {
46     while(n--)
47     {
48         Delay1ms();
49     }
50 }
51 void Delay1ms()        //@12.000MHz
52 {
53     unsigned char i, j;
54 
55     i = 2;
56     j = 239;
57     do
58     {
59         while (--j);
60     } while (--i);
61 }

可以看到,中断函数不需要声明,中断函数返回值为空(void),中断函数后面有一个interrupt,表示是中断服务程序,还要有一个标号,这里我们用的是外部中断0,所以为interrupt0,上面提到过。上面代码,如果P3^2一直为低电平,将会一直在中断函数中,总程序将不执行了。

若为电平触发方式(就是上面这种),在中断服务返回之前,外部中断请求输入必须无效,即变为高电平,否则CPU返回主程序后就会再次返回中断,就会发生上面总程序不执行的现象。所以电平触发方式适合于外部中断以低电平输入,而且中断服务程序能清除外部中断请求源,即外部中断请求输入变为高电平。

所以我们这里我们该用跳边沿触发方式,也就是在代码EX0=1;后面加上一句IT0=1;或者TCON=0x01;这样中断程序只有在我们将电平从1变为0才会触发(负跳变沿)


 接下来讲定时计数器

两个功能:定时,计数(就是P3^4,P3^5两个IO口,接了东西会自动计数),我们现在只讲定时。

 我们用的delay函数就是软件定时,而定时器是单片机内另一个硬件,和单片机主CPU是隔离开的,设置好自动运行,时间一到只是告诉CPU我触发中断。

 

 TMOD的高四位控制T1定时器的工作方式,第四位控制T2定时器的工作方式。

 作为计数器时,是由T0或T1引脚输入的外部脉冲源,作为定时器,是由时钟周期的输出脉冲经12分频,即12个振荡周期,每12个振荡周期,计数器加1,12个振荡周期就是一个机器周期。

 

我们一般让GATE=0即可,工作方式我们主要讲解方式1,会了这个其它也就会了。GATE=1一般用于方波检测。

TCON的低四位是用于控制外部中断的,忘了就回去看看,TF1一般由硬件自动置1清0,所以不需要控制。

下面两张图是方式0的,方式0是13位计数,所以不看了。

下面讲方式1

一共16位,满的话就是全1,也就是2的16次方,初值可由自己设定,比如全0或其它,设为N,每一个机器周期则+1,那么计数个数就如上所示。

如果我们定时50ms,那么就需要加50000次,那么就不能从0加到65536,初值就需要为15536(65536-50000),但是要把它分给TH0和TL0(高八位和低八位),那么TH0=(65536-50000)/256,TL0=(65536-50000)%256,2的8次方是256,/256,说明有多少个256,那么进位到高位多少,%256就是不能进位的了。

由此可以看出最多定时65ms,要定时1s怎么办?那么可以进入20次中断,每次中断50ms,就达到了1s。每进一次中断就在中断中对一个变量+1,加到20,主程序中判断什么时候到20,到了20就是1s。

方式2用于串口通信,现在不用

 

方式3也不用

  1. TMOD(设置工作方式):现在用T0定时器,所以只对第四位赋值,TMOD是89H内存地址,不能进行位操作(例如GATE=0),所以要整体赋值,方式1则M1M0=01,C/T=0,GATE=0,所以TMOD=0x01,意思为设置定时器0为工作方式1。
  2. 计算初值:一次中断50ms,所以TH0=(65536-50000)/256,TL0=(65536-50000)%256,不用算出来,计算机会算的。
  3. 中断:所以总中断打开,EA=1,然后打开定时器0的中断,ET0=1。
  4. 启动定时器0:TR0=1.

这样就开始定时了,满后就进入定时中断函数(后面是interrupt 1),这时要重新赋值,不然就从0开始定时了,就是65ms了。

下面是用定时器完成的数码管计数。

 1 #include<reg51.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4     
 5 void Delay1ms();
 6 void delay(int n);
 7 
 8 sbit WEI=P2^7;
 9 sbit DUAN=P2^6;
10 sbit LED0=P1^0;
11 
12 void Delay1ms();
13 void delay(int n);
14 
15 uchar code Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
16 //                    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   无显示
17 //[]括号内可以不写,编译时会自动数元素数然后分配内存
18 
19 uchar num,tt;
20 void main()
21 {
22     tt=0,
23     num=0;
24     TMOD=0x01;//设置定时器0为工作方式1
25     TH0=(65536-50000)/256;
26     TL0=(65536-50000)%256;
27     EA=1;//开总中断
28     ET0=1;//开启定时器中断
29     TR0=1;//开启定时器
30     WEI=1;
31     P0=0x00;
32     WEI=0;
33     
34 //    DUAN=1;
35 //    P0=Table[num];
36 //    DUAN=0;
37     while(1)
38     {
39         if(tt==20)
40         {
41             tt=0;
42             num++;
43             if(num==16)
44             {
45                 num=0;
46             }
47             DUAN=1;
48             P0=Table[num];
49 //            delay(1000);
50             DUAN=0;
51         }
52     }
53 }
54 
55 void exter0() interrupt 1
56 {
57     TH0=(65536-50000)/256;
58     TL0=(65536-50000)%256;
59     tt++;
60 }
61 
62 void delay(int n)
63 {
64     while(n--)
65     {
66         Delay1ms();
67     }
68 }
69 void Delay1ms()        //@12.000MHz
70 {
71     unsigned char i, j;
72 
73     i = 2;
74     j = 239;
75     do
76     {
77         while (--j);
78     } while (--i);
79 }

会看到数码管没有从0开始或者第一秒会不是0是一个乱码,因为一开始段选的P0没给0的值,只有到了1s后才会给段选的P0显示1的值,所以需要把注释的给段选P0赋值的语句加上。还有记住绝对不能再加上那句delay,因为当程序进入if开始执行delay后,delay延时执行时,会被中断去执行定时中断程序,因此若加上delay,那么延时的时间会非常长。


 最后再总结一下中断这里

从图中可以看到有这几个寄存器,TCON、IE、IP、SCON还有一个图中没有的IPH,这里我在把图放出来,其中SCON是串口的,这里还不学,所以先不放了。

看出来IP、IPH是管理优先级的,你只需要知道默认的优先级顺序是:外部中断0、定时/计数器0、外部中断1、定时/计数器1、串行口、定时/计数器2   其他的就不用管了。

接下来就是梳理中断了:

  1. 外部中断0(以0为例,1的话就是把0换成1) 使用外部中断的步骤,首先你得写了中断函数(后面加上interrupt 0,若为外中断1就改为2,是按照优先级顺序来的),接下来就是打开中断源,所有的中断源都是由IE寄存器控制的(第三个图可以看到),在第一个图,从右往左看,上面IP不需要看了,接下来就是IE,可以看到要想实现外部中断,要开启的有两个中断源,分别是总中断EA,外部中断中断源EX0,然后就是控制它的触发方式,这样就可以使用外部中断了,这里要用到TCON寄存器,外部中断源的触发方式选择在第二张图看到用TCON的IT0控制,这样就结束了。可以看到还一个和外部中断有关的是TCON的IE0,这个是请求标志位,计算机管的,你不需要管(当然另一个控制外部中断的方式可以用到,但你现在不需要学,那个很少用)。 最后我们再说一遍:中断函数 -> 总中断EA -> 外部中断源EX0 -> 触发方式IT0    (注意,这两个寄存器都是可位寻址的,所以直接EA=1就可以,不需要IE^7这样操作)
  2. 定时器 0 (计数器先不讲,定时器1同0)
    使用定时器的步骤,首先你得写了中断函数(后面加上interrupt1,若为定时器1就改为3),接下来就是打开中断源,总中断源EA,定时器中断源ET0,控制定时器的工作模式和工作方式,它和外部中断不同,外部中断用TCON,这个用的是TMOD,GATE是怎么开启定时器,C/T是工作模式选择,M1M0是工作方式选择,TMOD的高四位是定时器1的,第四位是定时器0的,我们一般是GATE=0,定时器模式C/T=0,工作方式1  M1M0=01,所以TMOD=0x01(注意TMOD是不可位寻址,所以不能在代码里写M1=0这样,必须是TMOD=什么。),设置定时初值,TH0=,TL0=,全部开启后接下来就是让定时器开始定时了,所以用到了TCON的TR0=1。 最后我们再说一遍:中断函数 -> 总中断源EA -> 定时器中断源ET0 ->工作模式TMOD(常为TMOD=1) -> 定时初值TH0=,TL0=  -> 开启定时器TR0

 下一课开始是这节课的作业!!!

动态扫描这里说一下,下节课讲

让分别显示1234(动态扫描)

就要用人眼的视觉暂留效应和数码管的余辉,先让第一个数码管亮,显示1,其它不亮,然后快速的让第二个显示2,其他的不亮,以此类推,这就是动态扫描。(人眼只能分别20ms以内的变化,那么让他20ms以内变化就可以了,这样人就看不出来了,就相当于四个数码管一直亮着1234)

标签: 单片机高低边驱动引脚控制继电器7d计数继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台