找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4904|回复: 7
收起左侧

51单片机开发环境的搭建 由点亮一个LED引入

[复制链接]
ID:105323 发表于 2016-3-4 13:51 | 显示全部楼层 |阅读模式
第一章 51单片机环境的搭建1.1 由点亮一个LED引入用单片机来点亮LED,这几乎是每个同学学习单片机的第一个实验。那么谁来点,怎么亮?注意这里面涉及到两个研究对象,单片机和LED。要想知道单片机如何来点,先要知道LED为什么亮。这种由分析被控制对象来研究控制对象的思路在本教程后面会反复用到,这里先提出来亮个相。我们先来看LED为什么会亮,也就是说先来了解LED的工作原理。当有电流通过时(达到一定值比如5mA),LED便会发光。至于进一步的工作原理我们不去追究,有兴趣的可以自己查查,不属于我们讨论的内容。根据这个原理,我们只需要给LED一端(右边)接在5V电源下,LED左边接地,如图1所示,产生电势差,正向导通,那么LED有电流通过,就发光了。



图1 点亮LED,由于电流过高,LED很快熄灭
但是LED会很快熄灭,为什么?LED正向导通时,电阻几乎为0,根据欧姆定律,电流无穷大,LED很快被烧掉。因此我们需要给这个电路加个限流电阻,这个限流电阻应该取多大,这里我们把LED的电阻当作0,电压为5V,电流设定为5mA(具体的数值需要看你购买的LED厂家提供的参数),根据欧姆定律就能算出限流电阻为1K。这样LED就能持续发光了,如图2所示。



图2 串联一个电阻,LED正常发光
那么LED怎么熄灭呢?没有电流通过就可以了。如何实现没有电流?LED两边等电势就行了。因此只需要在LED左边提供一个高电平5V,LED就熄灭了,如图3所示


?
图3 两边等电势,LED熄灭
以上我们完成了对LED的分析。前面说了,我们要通过分析被控制对象(LED)来操作控制对象(MCU).下面再来分析,如何操作控制对象。首先要知道MCU是什么?根据定义,MCU是具有一定可编程能力的数字电路集合体。那么什么叫做可编程呢?通俗的讲,就是根据人给单片机的不同指令去执行不同的任务。那这样就好办了,如下图所示,LED左边接在了MCU的P1.0引脚。根据前面的分析,只要跟MCU讲:”把你的P1.0引脚输出低电平“,(假设这里我们的单片机输出高电平是5V,低电平是0V。因为有的单片机高电平为3.3V)。这时候LED就点亮了,如果输出高电平,LED就熄灭了,这样就实现了单片机对LED的控制,如图4所示。



图4 单片机实现对LED的控制
你使用人类语言与单片机交流,单片机是听不懂的。因此你对单片机发送的指令无法传送给单片机。单片机只认识0和1.那么我们马上想到用0和1来和单片机对话,这当然可以。其实早期的程序就是直接写0和1的。可以这样做对程序员来说太痛苦了,单片机是认识了,程序员却晕倒了。不信的话,你自己在一张A4的纸上填满0和1,姑且不论什么含义,看着就晕倒了。这样就产生了一个问题,用人类语言,单片机听不懂,用单片机的语言,人类使用不方便。因此就各退一步,来个折中吧。用什么呢,C语言(早期是汇编,我们后面再谈)。把人类语言转成C语言,然后再按照一定的规则把C语言转成机器语言。前者叫开发环境,后者就是我们通常所说的编译。你完全可以理解为翻译。编译出来的结果就是单片机认识的机器指令。那么这个指令如何传送给单片机呢,这个过程就叫程序烧写,或者程序下载,烧写过程中用到的工具就是烧写器。把机器指令输送到单片机,但上电后,单片机就开始执行这个指令,从而到达我们控制器件的目的。
这个例子非常简单,但是给出了单片机开发的基本流程。首先我们要知道工作器件的原理。工作器件是我们最终的目的,比如控制led,用来照明;温度传感器测量温度;液晶显示内容等等。单片机只是达到最终目的的手段或者途径。因此用单片机来控制工作器件,一开始就要理解工作器件是如何工作的。然后在这个基础上,根据工作器件的需要对单片机传递不同的指令(人类语言)。单片机是看不懂人类指令的,因此需要翻译成单片机看得懂的语言。然后把翻译的结构传送给单片机。
前面罗嗦了这么多,主要是为初学者讲解了单片机开发的初步思想以及单片机开发环境的搭建。主要总结如下两点:1.从被控制对象入手来研究如何操作控制对象。所谓被控制对象其实就是我们想要使用的外围工作器件,他可以是LED,也可以是温度传感器,步进电机等等,是我们的最终目的,比如让LED闪烁,测量温度,控制转速等等。如何了解他们的工作原理,最好的方式就是阅读厂家提供的说明资料。对于控制对象(单片机),这个也很多,51,MSP430,AVR,PIC等等,如何与他们对话,同样的道理,查看芯片手册(也是官方资料)。这里反复强调是因为看到很多初学者一碰到问题就去网上论坛发帖求助,殊不知最好的解决问题的方式是去查看官方资料。2.了解这两个对象之间的关系后,我们就开始搭建单片机开发环境,编写指令,编译指令,最后烧写指令。


回复

使用道具 举报

ID:105323 发表于 2016-3-4 13:52 | 显示全部楼层
1. 下载Keil_C51安装文件和破解工具:http://www.51hei.com/keil%E4%B8%8B%E8%BD%BD.html

2. 双击Keil_C51_v9.02a文件

这里可根据个人情况,随便填写


然后点击下一步开始安装,等待安装完成。



Keil破解
3. 右键点击keil软件,选择以管理员身份运行:


点击File->License Management,复制CID内容,比如在本例中为:CBCDR-IXPAG


4. 解压破解器Keil_Lic.rar文件,右键单击Keil_Lic.exe,以管理员身份运行,将刚才复制的CID内容,粘贴到破解器中的CID框中,如下
   

   点击Generate生成序列号,并将该序列号复制
   

5. 回到Keil中的License Management界面,
   找到New License ID(LIC)输入框,并将序列号复制进去,点击Add LIC



执行成功后的界面如下:


这样Keil软件就可以使用了
回复

使用道具 举报

ID:105323 发表于 2016-3-4 13:53 | 显示全部楼层
本帖最后由 51黑黑黑 于 2016-3-4 13:58 编辑

1.3指令下载/烧写程序下载STC-ISP:打开http://www.51hei.com/mcuteach/250.html  在网页底部下载
将STC-ISP-v4.80.rar文件解压,即可使用

回复

使用道具 举报

ID:105323 发表于 2016-3-4 13:54 | 显示全部楼层
51单片机环境的搭建-1.4点亮一个LED

1.4 点亮一个LED
在本教程中,我们使用最常见的STC89C52RC-DIP40单片机作为主控芯片,这也是很多初学者入门的单片机。IDE采用Keil软件,该软件自带编译器,然后通过烧写器将指令下载到单片机。
1.4.1 新建一个keil工程
(1) 双击keil软件


(2) 点击project->New uvision Project,选择保存路径,取一个工程名字LED



(3)在CPU中选择Atmel,找到并选择AT89C52,点击确定



接下来弹出一个对话框,选择"否"



(5) 点击"创建一个空白文件"或者使用ctrl+N(File下面的那个图标)


?然后点击保存(ctrl+s),文件名为led.c
我们发现这个字体比较小,现在我们把它调大一点,
(6) 点击Edit->Configuration->Color&Fonts


在Window中,选中 8051: Editor C Files, Element中选择Text,Font中点击Courier New...



最后把我们新建的这个文档添加到工程中,右键点击SourceGroup,



选择Add Files to Group ''Sources Group...''
找到我们新建的led.c这个文件,点击"add",然后关闭
1.4.2 复制如下代码到led.c文件中(编写指令)

#include
sbit LED = P1^0;
void main(void)
{
       while(1)
       {
               LED=0;
       }
}
至于includereg52.h,sbit等,暂时不要理会,你把它当成固定格式,语法都可以,后面我们会谈到这个问题。我们这章的重点是把单片机的开发环境搭建起来,暂时不要扯远了

1.4.3 编译工程(翻译指令)
(1) 工程设置 project->Options for Target...


(2) 点击target,在Xtal中输入11.0592



(3) 点击target, 选中create HEXfile



(4) 点击编译



1.4.4烧写程序(传送指令到单片机)(后面补充)

回复

使用道具 举报

ID:105323 发表于 2016-3-4 13:56 | 显示全部楼层
                                                                                                     第二章 初步认识51单片机





前面我们学会了如何操作一个MCU的管脚(P1.0),让它设置为低电平(sbit LED= P1^0;LED=0),那么我们很容易的就能想到如何将MCU的管脚设置成高电平.这一讲,我们就来讨论如何控制单片机的IO口,也就是输入输出端口(input and outputport)

2.1单片机IO口操作与延时
既然我们学会了如何控制P1.0,那么同样的方式我们就能控制P1.1,P1.2, ...P1.7了。很奇怪,为什么单片机的引脚从P1.0开始到P1.7,为什么不是从P1.1到P1.8?基本上你所见到的控制芯片都是以0为起始的。我们把P1.0到P1.7叫做P1端口。那么这样的端口有多少个呢,在STC89C52中,一共有4组这样的端口,分别是P0,P1,P2,P3.每个端口都有8个管脚,这样很快,我们应该知道操作这4组共32个管脚了。我相信写到这里,每个人都已经知道了如何使用这32个任意一个管脚来控制LED。
既然我们学会了如何控制一个LED,那么如何控制两个LED?很容易的能猜到代码如下:
#include
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P2^1;
void main(void)
{
    while(1)
        {
           LED1=0;
           LED2=0;
           LED3=0;
        }

}  
通过以上方式我们能用任意的IO端口来点亮LED。这里就不再赘述了。
既然我们学会了如何点亮一个LED,相信熄灭一个LED也会了,并且你能很快的写出代码:
#include
sbit LED = P1^0;
void main(void)
{
        while(1)
        {
           LED = 0;
           LED = 1;
        }
}
这样对不对?是对的。LED=0,灯亮了,LED=1灯灭了。程序确实是没有问题,LED也是这样操作的。问题是人的肉眼分辨不出来,为什么呢?这里就涉及到了单片机的运行速度以及人眼的分辨间隔。下面我们来分析从LED=0(亮)到LED=1(灭),中间的间隔是多长时间?这个涉及到单片机的执行速度与时钟周期,机器周期,指令周期相关,我们暂且不讨论。现在我们通过keil软件调试的方法找到从LED=0到LED=1这个过程花了多长时间。

(1)打开keil软件,新建一个工程,并将以上代码拷入led.c文件



(2) 点击Project->options for TargetTarget1...



(3) 在弹出的对话框中选择target,Xtal选择11.0592,然后点击OK



(4) 点击debug图标,红色方框所示



(5)弹出来的界面比较糟糕,可以自己调节,如何调节?这里举一个例子,比如我想移动Register这个窗口,用鼠标左键点击Register窗口的标题栏(窗口的蓝色部分),按住鼠标不松开并拖动。



此时界面如上图所示,四个红色方框内的方框表示四个方向。此时将鼠标不松开继续拖动到右边红色方框中(注意是要把鼠标放到方框内),结果如下:



此时右边区域会变为蓝色,该区域表示Register即将存放的区域,然后松开鼠标,拖动结束。
    点击Register窗口中Autohide图标,如下图红色方框所示,将Register窗口自动隐藏。


其他窗口的调整方法类似。
(6) 插入断点。如下图所示,在红色方框位置双击鼠标,则自动插入断点,并且出现红色断点标志。


这里我们插入两个断点如图所示



点击红色方框(1)中的RST,然后点击红色方框(2)中的run,此时黄色箭头会跳到红色方框(3)处,记录红色方框(4)中的时间t1=0.00042209s
点击方框(2)中的run,此时黄色箭头会跳到红色方框(5)处,记录红色方框(4)中的时间t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,
表示LED从点亮到熄灭只用了2.17微秒,而人眼的最小分辨时间间隔大约为0.27s(270000微秒),因此感知不到灯的亮灭过程。你可以将这个程序下载到单片机中做做实验,你会发现LED很暗。事实上以上程序将导致LED循环亮灭,由于变化时间太快,几个微秒,我们无法感知,因此给人的感觉就是灯很暗。现在我们如何设置延时,让我们能更清楚的观察灯的亮灭过程?思路很简单,让单片机点亮LED后,去干点别的事情,然后再熄灭LED。这个就好比你坐火车时,提前到了一个小时,你可以看看书,玩玩手机。目的是坐火车,看书,玩手机只起到消磨时间的作用。那么同样,在本例中,我们让单片机干什么事情呢?可以选择休眠(我们后面讲到),或者让它去数数。比如从1数到10000等等。这种方式就叫做软件延时。
#include
sbit LED = P1^0;
void main(void)
{
    unsigned int i;
        while(1)
        {
               LED = 0;              
             for(i=0;i<40000;i++);
              LED =1;
             for(i=0;i<40000;i++);                    
        }                                 
}

将以上代码复制到led.c文件中并保存。该段代码中,通过去做别的事情来达到延时的作用。我们再次调试看看LED熄灭和点亮时间的间隔,设置断点如下:



以上可以看出,1.60636393s-0.00042318s大约1.6s,远远大于人的分辨时间。
既然我们能控制一个LED的亮灭了,那么同理可知,我们当然知道如何控制并延时其他LED了,这样我们就学会如何操作单片机的IO端口以及如何通过软件延时了。
下面我们来看看就这两招能干什么事情?

回复

使用道具 举报

ID:105323 发表于 2016-3-4 13:57 | 显示全部楼层
                                                                                                     第二章 初步认识51单片机-2.2单片机控制LCD1602液晶显示模块





上面学的两招,控制IO和延时,在这里要举的第一个例子就是LCD1602。LCD1602什么意思,表示一行可以显示16个字符,一共有两行。先来个LCD1602的简单介绍,1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:


第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
我们来看看如何使用这两招控制LCD1602液晶模块。既然是用单片机控制LCD1602,那么根据前面的分析思想,首先要搞清楚谁是控制对象,谁是被控制对象。很显然,LCD1602是被控制对象,那么我们就先从LCD1602开始分析。所谓控制也可以理解为沟通,那么如何与LCD1602沟通呢?可以想一想,平时人与人是如何沟通的?沟通之前先要打个招呼吧,比如“你好”之类的,电话里面要先讲个“喂?”,之后才进入沟通正题了。其实单片机与LCD1602的沟通方式也一样,“喂?”在这个例子里面就叫初始化。后面也会经常碰到这个“初始化”的概念。其实器件也是人设计的,所以他的工作方式从某种程度上讲,也是人的沟通方式。打完招呼后,就开始进入真正主题了。什么主题呢?LCD1602是显示模块,主要作用当然是显示了。那么显示什么呢?很明显,显示内容当然来自于单片机了,单片机让它显示什么它就显示什么。这个‘显示什么’就是传送的数据。那么怎么往1602传送数据呢?1602什么意思,表示2行16个字符,也就是有不同的显示地点,那么如何确定显示地点呢?因此前面的分析可以总结为三个问题,如何初始化,如何传送显示的内容(显示什么),在哪里显示。这三个问题如何解答呢?当然要去看芯片手册了。

为了解决这三个问题,我们先来看看人与人之间是如何沟通的,如果当面沟通,你的信号(声音)能够直接传到对方,而且能让对方听懂。如果相距比较远,那么就使用电话等通信工具。前者信号传递载体是空气,后者是电话线。那么我们来看看MCU与LCD1602的信号传递载体是什么样的。查看原理图。因为是MCU与1602之间的沟通,当然这里我们只查看与单片机相连接的部分。



从图中我们看到,单片机通过P2.7,P2.6分别与RS,EN连接,P0端口与D0到D7连接,一共10根线。那么也就是说,单片机的所有指令,数据等都是通过这10根线来完成的。怎么样去控制LCD呢,当然是阅读LCD的说明手册。这里来个比喻,房间内一个人规定,敲三下门,屋内的人才把门打开。如果你要进入屋内,就必须敲三下,如果你不知道这个规则,敲了四下,或者大喊大叫,门也开不了。这个规定可以是多样化,比如一共敲两下,第一下要敲重一点,第二下要敲轻一点。或者重敲三下,轻敲一下,等等。而且这里你不需要问为什么,照着做就行了。其实LCD1602包括后面会讲到的其他模块同样如此,你要与它沟通,当然必须按照它的规则来。下面我们就来解读它的规则,来解决前面提到的三个问题,

LCD1602初始化;在哪里显示;显示什么。
(1)LCD1602初始化
关于这一点,说明手册上已经告诉我们了,这里全盘复制过来。
延时15ms
写指令38H
延时5ms
写指令38H
写指令08H
写指令01H
写指令06H
写指令0CH
以上为初始化过程,延时部分好解决,前面讲过了。这里就看如何写指令了。写指令这个过程肯定是通过上图中10根线来完成的。D0-D7一共八根线应该是用来存放指令的内容。问题来了,1602怎么知道单片机给我的是命令还是数据。(命令是什么,在哪里显示,屏幕清零;数据是什么,显示什么内容,显示A还是B)。LCD1602看到RS为高时,就明白了,哦,你要通过P0端口给我数据了,于是LCD1602就把这些数据拿过来了。看到RS为低时,就知道你要给我指令了。通过这种方式,单片机能准确的传递指令或者数据信息,实现与LCD1602的沟通。是不是这样就能让LCD1602正常执行了。不是的。回到我们前面讲的那个例子,这里加个条件,屋内人听到敲门三下后,判断暗号正确了,但是没有直接开门,而是通知了他的上级,得到上级的授权后,才开门。也就是两个条件,暗号正确和上级授权。LCD1602也一样,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号。此时EN给个一定宽度的脉冲,LCD1602开始执行。




时序图如上图所示,这里少了R/W信号,用于控制从LCD1602读取还是写入的,为了简化过程,在硬件上把R/W接地了,也就是只能写不能读。同时,读忙信号也不能操作,这里采用延时的方法替代。根据前面的分析很容易的写出写指令的代码:
?void write_com(unsigned charmycmd)
{
  delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号
  P0=mycmd;       //准备好指令
  RS=0;        //告诉LCD1602,P0中放的是指令不是数据
  EN=1;
  delayUs(5); //根据时序图,脉冲要有一定宽度
  EN=0;         //使指令有效,开始执行
}
同样的道理,以上代码中,只需改一下RS信号为1,就是写数据的代码了

void write_com(unsigned char mydata)
{
  delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号
  P0=mycmd;       //准备好指令
  RS=1;        //告诉LCD1602,P0中放的是数据不是指令
  EN=1;
  delayUs(5); //根据时序图,脉冲要有一定宽度
  EN=0;         //使指令有效,开始执行
}
讲到这里,LCD1602初始化代码应该能写出了。同时我们也已经写出了传递指令的代码,那么现在我们只要知道指令内容就可以了。
1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表2所示:



1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
你需要给LCD1602什么指令,只需要传递给void write_com(unsignedcharmycmd)函数中的mycmd参数就行了。
(2)在哪里显示
知道了这个,现在我们就能解决前面提到的第二个问题,在哪里显示,


例如第二行第一个字符的地址是40H,那么是不是它的地址就是40H了。注意表2中第8条数据存储地址,D7已经被写死了。最终的显示地址是40H+10000000B,因此我们只要把这个值传给mycom,LCD1602就知道在第二行第一个位置显示了。
(3)显示什么
前面讲了,如果传送数据就是要显示的内容。比如我要显示字母A,怎么操作呢。


以上图中可以知道,如果你要显示A,那么数据的高位为0100,低位为0001,因此为01000001。把这个数据传送给LCD1602,它就知道要显示A了。
现在回过头来看看,我们在使用单片机控制LCD1602这个过程中用到了单片机的哪些知识。回去看看图1,10根连接线,P2.6和P2.7引脚,再加上P0端口,主要是通过P2.6和P2.7高低变化来发出指令或数据,P0的变化反映指令或数据的内容。可见,这个过程中我们只用到了IO口控制和延时。其他很长的部分我们用在理解1602的使用规则了。注意这里是使用规则,谈不上原理。比如你给LCD1602发送清屏指令时,你明白LCD1602收到这个指令是如何操作清屏的吗?不知道,也没有必要知道。液晶模块说明书也不告诉你。好比你使用手机时,你点击一下某个应用程序就打开了,然后按照它的规则去使用就行了,比如听歌,上网等等,你不用关心它们是怎么实现的。其实手机也是个模块,我们只要学会操作就行了,不管它里面发生了什么事情。
附参考代码如下:
#include
void LCD_init(void);
void delayUs(unsigned char t);
void delayMs(unsigned char t);
void write_com(unsigned char mycmd);
void write_data(unsigned char mydata);
sbit RS=P2^7;
sbit EN=P2^6;
void main (void)
{

       LCD_init();      
       write_com(0x0f);
       write_data(0x41);
       while(1);
}
void LCD_init(void)
{
delayMs(15);
write_com(0x38);
delayMs(5);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void delayUs(unsigned char t)
{
       while(--t);
}
void delayMs(unsigned char t)
{
       while(--t)
       {
              delayUs(245);
              delayUs(245);
       }
}
void write_com(unsigned char mycmd)
{
  delayMs(5);//注意这里需要延时5ms比较保险代替判断忙信号
  P0=mycmd;      //准备好指令
  RS=0;       //告诉LCD1602,P0中放的是指令不是数据
  EN=1;
  delayUs(5); //根据时序图,脉冲要有一定宽度
  EN=0;         //使指令有效,开始执行
}              
void write_data(unsigned char mydata)
{
  delayMs(5);//注意这里需要延时5ms比较保险
  P0=mydata;
  RS=1;
  EN=1;
  delayUs(5);
  EN=0;
}

回复

使用道具 举报

ID:279302 发表于 2018-1-26 16:05 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表