下载

3下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 51单片机教程

51单片机教程.doc

51单片机教程

wflb826
2018-09-06 0人阅读 举报 0 0 暂无简介

简介:本文档为《51单片机教程doc》,可适用于工程科技领域

平凡的单片机教程自学单片机第页共页http:wwwjselecnet江苏电子网rootjselecnet原作:平凡的单片机单片机教程第一课:单片机概述、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片安装一个称之为主板的印刷线路板上。而在单片机中这些部份全部被做到一块集成电路芯片中了所以就称为单片(单芯片)机而且有一些单片机中除了上述部份外还集成了其它部份如ADDA等。天!PC中的CPU一块就要卖几千块钱这么多东西做在一起还不得买个天价!再说这块芯片也得非常大了。不价格并不高从几元人民币到几十元人民币体积也不大一般用脚封装当然功能多一些单片机也有引脚比较多的如引脚功能少的只有多个或多个引脚有的甚至只只引脚。为什么会这样呢?功能有强弱打个比方市场上面有的组合音响一套才卖几百块钱可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大技术也很成熟系列的单片机已经做了十几年所以价格就低了。既然如此单片机的功能肯定不强干吗要学它呢?话不能这样说实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用是否有很好的性能价格比。所以出来十多年依然没有被淘汰还在不断的发展中。、MCS单片机和、、C等的关系我们平常老是讲又有什么现在又有C它们之间究竟是什么关系MCS是指由美国INTEL公司(对了就是大名鼎鼎的INTEL)生产的一系列单片机的总称这一系列单片机包括了好些品种如等其中是最早最典型的产品该系列其它单片机都是在的基础上进行功能的增、减、改变而来的所以人们习惯于用来称呼MCS系列单片机而是前些年在我国最流行的单片机所以很多场合会看到的名称。INTEL公司将MCS的核心技术授权给了很多其它公司所以有很多公司在做以为核心的单片机当然功能或多或少有些改变以满足不同的需求其中C就是这几年在我国非常流行的单片机它是由美国ATMEL公司开发生产的。以后我们将用C来完成一系列的实验。单片机教程第二课:单片机的内部、外部结构(一)一、单片机的外部结构拿到一块芯片想要使用它首先必须要知道怎样连线我们用的一块称之为C的芯片下面我们就看一下如何给它连线。、电源:这当然是必不可少的种如前面例中讲到的生产线上的计数。先看第一种吧。我们的硬件中是这样连线的:构成的振荡器连到定时计数器的外部引脚T上面我们就利用这个来做一个计数实验要将计数的值显示出来当然最好用数码管了可我们还没讲到这一部份为了避免把问题复杂化我们用P口的个LED来显示计到的数据。程序如下:ORGHAJMPSTARTORGHSTART:MOVSP,#FHMOVTMOD,#B定时计数器作计数用,不用全置SETBTR启动计数器开始运行LOOP:MOVA,TLMOVP,AAJMPLOOPEND在硬件上用线将的输出与T连通(印板上有焊盘)运行这种程序注意将板按正确的位置放置(LM放在左手边LED排列是按从高位到低们排列)看到什么?随着后接的LED的闪烁单片机的只LED也在不断变化注意观察是不是按二进制:这样的顺序在变呢?这就对了这就是TL中的数据。程序二:ORGHAJMPSTARTORGBHAJMPTIMER定时器的中断处理ORGHSTART:MOVSP,#FHMOVTMOD,#B定时计数器作计数用,模式,不用全置MOVTH,#FFHMOVTL,#FAH预置值,要求每计到个脉冲即为一个事件SETBEASETBET开总中断和定时器中断允许SETBTR启动计数器开始运行AJMP$TIMER:PUSHACCPUSHPSWCPLP计数值到,即取反PMOVTH,#FFHMOVTL,#FAH重置计数初值POPPSWPOPACCRETIEND上面这个程序完成的工作很简单就是在每个脉冲到来后取反一次P。因此实验的结果应当是:LM后接的LED亮、灭次则P。口所接LED亮或灭一次。这实际就是我们上面讲的计数器的第二种应用。程序三:外部中断实验ORGHAJMPSTARTORGH外部中断地直入口AJMPINTORGHSTART:MOVSP,#FHMOVP,#FFH灯全灭MOVP,#FFHP口置高电平SETBEASETBEXAJMP$INT:PUSHACCPUSHPSWCPLPPOPPSWPOPACCRETIEND本程序的功能很简单按一次按键(接在引脚上的)就引发一次中断取反一次P。因此理论上按一下灯亮按一下灯灭但在实际做实验时可能会发觉有时不“灵”按了它没反应但在大部份时候是对的这是怎么回事呢?我们在讲解键盘时再作解释这个程序本身是没有问题的。单片机教程第二十一课:串行接口概述串行接口的一般概念单片机与外界进行信息交换称之为通讯。单片机的通讯方式有两种:并行通讯:数据的各位同时发送或接收。串行通讯:数据一位一位顺序发送或接收。参看下图:串行通讯的方式:异步通讯:它用一个起始位表示字符的开始用停止位表示字符的结束。其每帧的格式如下:在一帧格式中先是一个起始位然后是个数据位规定低位在前高位在后接下来是奇偶校验位(可以省略)最后是停止位。用这种格式表示字符则字符可以一个接一个地传送。在异步通讯中CPU与外设之间必须有两项规定即字符格式和波特率。字符格式的规定是双方能够在对同一种和的串理解成同一种意义。原则上字符格式可以由通讯的双方自由制定但从通用、方便的角度出发一般还是使用一些标准为好如采用ASCII标准。波特率即数据传送的速率其定义是每秒钟传送的二进制数的位数。例如数据传送的速率是字符s而每个字符如上述规定包含数位则传送波特率为波特。同步通讯:在同步通讯中每个字符要用起始位和停止位作为字符开始和结束的标志占用了时间所以在数据块传递时为了提高速度常去掉这些标志采用同步传送。由于数据块传递开始要用同步字符来指示同时要求由时钟来实现发送端与接收端之间的同步故硬件较复杂。通讯方向:在串行通讯中把通讯接口只能发送或接收的单向传送方法叫单工传送而把数据在甲乙两机之间的双向传递称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收任一时该只能发或者只能收信息。.单片机的串行接口结构串行接口是一个可编程的全双工串行通讯接口。它可用作异步通讯方式(UART)与串行传送信息的外部设备相连接或用于通过标准异步通讯协议进行全双工的多机系统也可以通过同步方式使用TTL或CMOS移位寄存器来扩充IO口。单片机通过引脚RXD(P串行数据接收端)和引脚TXD(P串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器包括发送寄存器和接收寄存器。它们有相同名字和地址空间但不会出现冲突因为它们两个一个只能被CPU读出数据一个只能被CPU写入数据。串行口的控制与状态寄存器串行口控制寄存器SCON它用于定义串行口的工作方式及实施接收和发送控制。字节地址为H其各位定义如下表:DDDDDDDDSMSMSMRENTBRBTIRISM、SM:串行口工作方式选择位其定义如下:SM、SM工作方式功能描述波特率方式位移位寄存器Fosc方式位UART可变方式位UARTFosc或fosc方式位UART可变其中fosc为晶振频率SM:多机通讯控制位。在方式时SM一定要等于。在方式中当(SM)=则只有接收到有效停止位时RI才置。在方式或方式当(SM)=且接收到的第九位数据RB=时RI才置。REN:接收允许控制位。由软件置位以允许接收又由软件清来禁止接收。TB:是要发送数据的第位。在方式或方式中要发送的第位数据根据需要由软件置或清。例如可约定作为奇偶校验位或在多机通讯中作为区别地址帧或数据帧的标志位。RB:接收到的数据的第位。在方式中不使用RB。在方式中若(SM)=RB为接收到的停止位。在方式或方式中RB为接收到的第位数据。TI:发送中断标志。在方式中第位发送结束时由硬件置位。在其它方式的发送停止位前由硬件置位。TI置位既表示一帧信息发送结束同时也是申请中断可根据需要用软件查询的方法获得数据已发送完毕的信息或用中断的方式来发送下一个数据。TI必须用软件清。RI:接收中断标志位。在方式当接收完第位数据后由硬件置位。在其它方式中在接收到停止位的中间时刻由硬件置位(例外情况见于SM的说明)。RI置位表示一帧数据接收完毕可用查询的方法获知或者用中断的方法获知。RI也必须用软件清。特殊功能寄存器PCONPCON是为了在CHMOS的C单片机上实现电源控制而附加的。其中最高位是SMOD。串行口的工作方式单片机的全双工串行口可编程为种工作方式现分述如下:方式为移位寄存器输入输出方式。可外接移位寄存器以扩展IO口也可以外接同步输入输出设备。位串行数据者是从RXD输入或输出TXD用来输出同步脉冲。输出串行数据从RXD引脚输出TXD引脚输出移位脉冲。CPU将数据写入发送寄存器时立即启动发送将位数据以fos的固定波特率从RXD输出低位在前高位在后。发送完一帧数据后发送中断标志TI由硬件置位。输入当串行口以方式接收时先置位允许接收控制位REN。此时RXD为串行数据输入端TXD仍为同步脉冲移位输出端。当(RI)=和(REN)=同时满足时开始接收。当接收到第位数据时将数据移入接收寄存器并由硬件置位RI。下面两图分别是方式扩展输出和输入的接线图。方式为波特率可变的位异步通讯接口方式。发送或接收一帧信息包括个起始位个数据位和个停止位。输出当CPU执行一条指令将数据写入发送缓冲SBUF时就启动发送。串行数据从TXD引脚输出发送完一帧数据后就由硬件置位TI。输入在(REN)=时串行口采样RXD引脚当采样到至的跳变时确认是开始位就开始接收一帧数据。只有当(RI)=且停止位为或者(SM)=时停止位才进入RB位数据才能进入接收寄存器并由硬件置位中断标志RI否则信息丢失。所以在方式接收时应先用软件清零RI和SM标志。方式方式月为固定波特率的位UART方式。它比方式增加了一位可程控为或的第位数据。输出:发送的串行数据由TXD端输出一帧信息为位附加的第位来自SCON寄存器的TB位用软件置位或复位。它可作为多机通讯中地址数据信息的标志位也可以作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时就启动发送器发送。发送一帧信息后置位中断标志TI。输入:在(REN)=时串行口采样RXD引脚当采样到至的跳变时确认是开始位就开始接收一帧数据。在接收到附加的第位数据后当(RI)=或者(SM)=时第位数据才进入RB位数据才能进入接收寄存器并由硬件置位中断标志RI否则信息丢失。且不置位RI。再过一位时间后不管上述条件时否满足接收电路即行复位并重新检测RXD上从到的跳变。工作方式方式为波特率可变的位UART方式。除波特率外其余与方式相同。波特率选择如前所述在串行通讯中收发双方的数据传送率(波特率)要有一定的约定。在串行口的四种工作方式中方式和的波特率是固定的而方式和的波特率是可变的由定时器T的溢出率控制。方式方式的波特率固定为主振频率的。方式方式的波特率由PCON中的选择位SMOD来决定可由下式表示:波特率=的SMOD次方除以再乘一个fosc也就是当SMOD=时波特率为fosc当SMOD=时波特率为fosc.方式和方式定时器T作为波特率发生器其公式如下:波特率=定时器T溢出率T溢出率=T计数率产生溢出所需的周期数式中T计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时T计数率为fosc当工作于计数器状态时T计数率为外部输入频率此频率应小于fosc。产生溢出所需周期与定时器T的工作方式、T的预置值有关。定时器T工作于方式:溢出所需周期数=x定时器T工作于方式:溢出所需周期数=x定时器T工作于方式:溢出所需周期数=x因为方式为自动重装入初值的位定时器计数器模式所以用它来做波特率发生器最恰当。当时钟频率选用MHZ时取易获得标准的波特率所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。下表列出了定时器T工作于方式常用波特率及初值。常用波特率Fosc(MHZ)SMODTH初值FDHFDHFAHFhEh单片机教程第二十二课:串行口应用编程实例.串口方式应用编程单片机串行口方式为移位寄存器方式外接一个串入并出的移位寄存器就可以扩展一个并行口。例:用串行口外接CD扩展位并行输出口如图所示位并行口的各位都接一个发光二极管要求发光管呈流水灯状态。串行口方式的数据传送可采用中断方式也可采用查询方式无论哪种方式都要借助于TI或RI标志。串行发送时可以靠TI置位(发完一帧数据后)引起中断申请在中断服务程序中发送下一帧数据或者通过查询TI的状态只要TI为就继续查询TI为就结束查询发送下一帧数据。在串行接收时则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式在开始通讯之前都要先对控制寄存器SCON进行初始化。在方式中将将H送SCON就可以了。ORGHSTART:MOVSCON,#H置串行口工作方式MOVA,#H最高位灯先亮CLRP关闭并行输出(避象传输过程中各LED的"暗红"现象)OUT:MOVSBUF,A开始串行输出OUT:JNBTI,OUT输出完否CLRTI完了清TI标志以备下次发送SETBP打开并行口输出ACALLDELAY延时一段时间RRA循环右移CLRP关闭并行输出JMPOUT循环说明:DELAY延时子程序可以用前面我们讲P口流水灯时用的延时子程序这里就不给出了。二、异步通讯orgHAJMPSTARTORGHSTART:movSP,#fhmovTMOD,#hT:工作模式movPCON,#hSMOD=movTH,#FDH初始化波特率(参见表)movSCON,#hStandardUARTsettingsMOVR,#AAH准备送出的数SETBREN允许接收SETBTRT开始工作WAIT:MOVA,RCPLAMOVR,AMOVSBUF,ALCALLDELAYJBCTI,WAIT如果TI等于则清TI并转WAITAJMPWAITWAIT:JBCRI,READ如果RI等于则清RI并转READAJMPWAITREAD:MOVA,SBUF将取得的数送P口MOVP,ALJMPWAITDELAY:延时子程序MOVR,#ffHDJNZR,$RETEND将程序编译通过写入芯片插入实验板用通读电缆将实验板与主机的串口相连就可以实验了。上面的程序功能很简单就是每隔一段时间向主机轮流送数H和AAH并把主机送去的数送到P口。可以在PC端用串口精灵来做实验。串口精灵在我主页上有下载。运行串口精灵后按主界面上的“设置参数”按钮进入“设置参数”对话框按下面的参数进行设置。注意我的机器上用的是串口如果你不是串口请自行更改串口的设置。设置完后按确定返回主界面注意右边有一个下拉列表应当选中“按进制”。然后按“开始发送”、“开始接收”就可以了。按此设置实验板上应当有两只灯亮只灯灭。大家可以自行更改设置参数中的发送字符如FF等等观察灯的亮灭并分析原因也可以在主界面上更改下拉列表中的“按进制”为“按进制”或“按ASCII字符”来观察现象并仔细分析。这对于大家理解进制、进制、ASCII字符也是很有好处的。程序本身很简单又有注释这里就不详加说明了。三、上述程序的中断版本orgHAJMPSTARTorghAJMPSERIALORGHSTART:movSP,#fhmovTMOD,#hT:工作模式movPCON,#hSMOD=movTH,#FDH初始化波特率(参见表)movSCON,#hStandardUARTsettingsMOVR,#AAH准备送出的数SETBREN允许接收SETBTRT开始工作SETBEA开总中断SETBES开串口中断SJMP$SERIAL:MOVA,SBUFMOVP,ACLRRIRETIEND本程序没有写入发送程序大家可以自行添加。 单片机教程第二十三课:LED数码显示器的连接与编程在单片机系统中通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点因此使用非常广泛。八段LED显示器引入:还记得我们小时候玩的“火柴棒游戏”吗几根火柴棒组合起来可以拼成各种各样的图形LED显示器实际上也是这么一个东西。八段LED显示器由个发光二极管组成。基中个长条形的发光管排列成“日”字形另一个贺点形的发光管在显示器的右下角作为显示小数点用它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是个发光二极管的阳极都连在一起的称之为共阳极LED显示器另一种是个发光二极管的阴极都连在一起的称之为共阴极LED显示器。如下图所示。`共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时相应的笔划段发亮由发亮的笔划段组合而显示的各种字符。个笔划段hgfedcba对应于一个字节(位)的DDDDDDDD,于是用位二进制码就可以表示欲显示字符的字形代码。例如对于共阴LED显示器当公共阴极接地(为零电平)而阳极hgfedcba各段为时显示器显示"P"字符即对于共阴极LED显示器“P”字符的字形码是H。如果是共阳LED显示器公共阳极接高电平显示“P”字符的字形代码应为(CH)。这里必须注意的是:很多产品为方便接线常不按规则的方法去对应字段与位的关系这时字形码就必须根据接线来自行设计了后面我们会给出一个例子。静态显示接口在单片机应用系统中显示器显示常用两种方法:静态显示和动态扫描显示。所谓静态显示就是每一个显示器都要占用单独的具有锁存功能的IO接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路就不用管它了直到要显示新的数据时再发送新的字形码因此使用这种方法单片机中CPU的开销小。可以提供单独锁存的IO接口电路很多这里以常用的串并转换电路LS为例介绍一种常用静态显示电路以使大家对静态显示有一定的了解。MCS单片机串行口方式押为移们寄存器方式外接片LS作为位LED显示器的静态显示接口把的RXD作为数据输出线TXD作为移位时钟脉冲。LS为TTL单向位移位寄存器可实现串行输入并行输出。其中A、B(第、脚)为串行数据输入端个引脚按逻辑与运算规律输入信号公一个输入信号时可并接。T(第脚)为时钟输入端可连接到串行口的TXD端。每一个时钟信号的上升沿加到T端时移位寄存器移一位个时钟脉冲过后位二进制数全部移入LS中。R(第脚)为复位端当R=时移位寄存器各位复只有当R=时时钟脉冲才起作用。Q…Q(第和引脚)并行输出端分别接LED显示器的hga各段对应的引脚上。关于LS还可以作如下的介绍:所谓时钟脉冲端其实就是需要高、低、高、低的脉冲不管这个脉冲是怎么来的比如我们用根电线一端接T一端用手拿着分别接高电平、低电平那也是给出时钟脉冲在LS获得时钟脉冲的瞬间(再讲清楚点是在脉冲的沿)如果数据输入端(第引脚)是高电平则就会有一个进入到LS的内部如果数据输入端是低电平则就会有一个进入其内部。在给出了个脉冲后最先进入LS的第一个数据到达了最高位然后再来一个脉冲会有什么发生呢?再来一个脉冲第一个脉冲就会从最高位移出就象车站排队买票栏杆就那么长要从后面进去一个人前面必须要从前面走出去一个人才行。搞清了这一点下面让我们来看电路片LS首尾相串而时钟端则接在一起这样当输入个脉冲时从单片机RXD端输出的数据就进入到了第一片LS中了而当第二个个脉冲到来后这个数据就进入了第二片LS而新的数据则进入了第一片LS这样当第六个个脉冲完成后首次送出的数据被送到了最左面的中其他数据依次出现在第一、二、三、四、五片LS中。有个问题在第一个脉冲到来时除了第一片LS中接收数据外其他各片在干吗呢?它们也在接收数据因为它们的时钟端都是被接在一起的可是数据还没有送到其他各片呢它们在接收什么数据呢?。。。。。。其实所谓数据不过是一种说法而已实际就是电平的高低当第一个脉冲到来时第一片固然是从单片机接收数据了而其它各片也接到前一片的Q上而Q是一根电线在数字电路中它只可能有两种状态:低电平或高电平也就是“”和“”。所以它的下一片LS也相当于是在接收数据啊。只是接收的全部是或而已。这个问题放在这儿说明可能有朋友不屑一顾而有的朋友可能还是不清楚这实际上涉及到数的本质的问题如果不懂的请仔细思考并找一些数字电路的数理解的工作原理再来看这个问题或者去看看我的另一篇文章《初学单片机易掌握的概念》。务必搞懂搞懂了这一点你的级别就高过初学者可谓入门者了。入口:把要显示的数分别放在显示缓冲区HH共个单元中并且分别对应各个数码管LEDLED。出口:将预置在显示缓冲区中的个数成相应的显示字形码然后输出到显示器中显示。显示程序如下:DISP:MOVSCON,#H初始化串行口方式MOVR,#H显示位数MOVR,#HHH为显示缓冲区MOVDPTR,#SEGTAB字形表的入口地址LOOP:MOVA,R取最高位的待显示数据MOVCA,ADPTR查表获取字形码MOVSBUF,A送串口显示DELAY:JNBTI,DELAY等待发送完毕CLRTI清发送标志DECR指针下移一位准备取下一个待显示数DJNZR,LOOP直到个数据全显示完。RETSETTAB:字形表前面有介绍以后我们再介绍字形表的制作。DBHFHHDHHHHFHHHFFH消隐码测试用主程序ORGHAJMPSTARTORGHSTART:MOVSP,#FHMOVH,#MOVH,#MOVH,#MOVH,#MOVH,#MOVH,#LCALLDISPSJMP$如果按图示数码管排列则以上主程序将显示的是想想看如果要显示该怎样送数?下面我们来分析一下字形表的制作问题。先就上述“标准”的图形来看吧。写出数据位和字形的对应关系并列一个表如下(设为共阳型也就是相应的输出位为时笔段亮)如何字形表会做了吧就是这样列个表格根据要求(亮或亮)写出相应位的和就成了。做个练习写出AF的字形码吧。如果为了接线方便而打乱了接线的顺序那么字形表又该如何接呢?也很简单一样地列表啊。以新实验板为例共阳型。接线如下:PPPPPPPPCEHDGFAB则字形码如下所示:HEHAHHHHHCHHH作为练习大家写出AF的字形代码。本来这里是讲解显示器的静态接口的到此应当可算结束了但是我还想接着上面讲到的数的本质的问题再谈一点。单片机中有一些术语、名词本来是帮助我们理解事物的但有时我们会被这些术语的相关语义所迷惑以致不能进一步认清他们的本质由此往往陷入困惑的境界。只有深入地了解了LS的工作特性才能真正理解何谓串行的数据。有兴趣的朋友还可以再看看我网站上“其他资料”中的“银行利率屏的设计”一文。单片机教程第二十四课:动态扫描显示接口动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的个笔划段ah同名端连在一起而每一个显示器的公共极COM是各自独立地受IO线控制。CPU向字段输出口送出字形码时所有显示器接收到相同的字形码但究竟是那个显示器亮则取决于COM端而这一端是由IO控制的所以我们就可以自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的方法轮流控制各个显示器的COM端使各个显示器轮流点亮。在轮流点亮扫描过程中每位显示器的点亮时间是极为短暂的(约ms)但由于人的视觉暂留现象及发光二极管的余辉效应尽管实际上各位显示器并非同时点亮但只要扫描的速度足够快给人的印象就是一组稳定的显示数据不会有闪烁感。下图所示就是我们的实验板上的动态扫描接口。由C的P口能灌入较大的电流所以我们采用共阳的数码管并且不用限流电阻而只是用两只N进行降压后给数码管供电这里仅用了两只实际上还可以扩充。它们的公共端则由PNP型三极管控制显然如果导通则相应的数码管就可以亮而如果截止则对应的数码管就不可能亮是由PP控制的。这样我们就可以通过控制P、P达到控制某个数码管亮或灭的目的。下面的这个程序就是用实验板上的数码管显示和。FIRSTEQUP第一位数码管的位控制SECONDEQUP第二位数码管的位控制DISPBUFFEQUAH显示缓冲区为AH和BHORGHAJMPSTARTORGHSTART:MOVSP,#FH设置堆栈MOVP,#FFHMOVP,#FFHMOVP,#FFH初始化所显示器LED灭MOVDISPBUFF,#第一位显示MOVDISPBUFF,#第二握显示LOOP:LCALLDISP调用显示程序AJMPLOOP主程序到此结束DISP:PUSHACCACC入栈PUSHPSWPSW入栈MOVA,DISPBUFF取第一个待显示数MOVDPTR,#DISPTAB字形表首地址MOVCA,ADPTR取字形码MOVP,A将字形码送P位(段口)CLRFIRST开第一位显示器位口LCALLDELAY延时毫秒SETBFIRST关闭第一位显示器(开始准备第二位的数据)MOVA,DISPBUFF取显示缓冲区的第二位MOVDPTR,#DISPTABMOVCA,ADPTRMOVP,A将第二个字形码送P口CLRSECOND开第二位显示器LCALLDELAY延时SETBSECOND关第二位显示POPPSWPOPACCRETDELAY:延时毫秒PUSHPSWSETBRSMOVR,#D:MOVR,#D:DJNZR,$DJNZR,DPOPPSWRETDISPTAB:DBH,EH,aH,H,H,H,H,CH,H,HEND从上面的例子中可以看出动态扫描显示必须由CPU不断地调用显示程序才能保证持续不断的显示。上面的这个程序可以实现数字的显示但不太实用为什么呢?这里仅是显示两个数字并没有做其他的工作因此两个数码管轮流显示毫秒没有问题实际的工作中当然不可能只显示两个数字还是要做其他的事情的这样在二次调用显示程序之间的时间间隔就不一不定了如果时间间隔比较长就会使显示不连续。而实际工作中是很难保证所有工作都能在很短时间内完成的。况且这个显示程序也有点“浪费”每个数码管显示都要占用个毫秒的时间这在很多合是不允许的怎么办呢?我们可以借助于定时器定时时间一到产生中断点亮一个数码管然后马上返回这个数码管就会一直亮到下一次定时时间到而不用调用延时程序了这段时间可以留给主程序干其他的事。到下一次定时时间到则显示下一个数码管这样就很少浪费了。CounterEQUH计数器显示程序通过它得知现正显示哪个数码管FIRSTEQUP第一位数码管的位控制SECONDEQUP第二位数码管的位控制DISPBUFFEQUAH显示缓冲区为AH和BHORGHAJMPSTARTORGBH定时器T的入口AJMPDISP显示程序ORGHSTART:MOVSP,#FH设置堆栈MOVP,#FFHMOVP,#FFHMOVP,#FFH初始化所显示器LED灭MOVTMOD,#B定时器T工作于模式(位定时计数模式)MOVTH,#HIGH()MOVTL,#LOW()SETBTRSETBEASETBETMOVCounter,#计数器初始化MOVDISPBUFF,#第一位始终显示MOVA,#LOOP:MOVDISPBUFF,A第二位轮流显示INCALCALLDELAYCJNEA,#,LOOPMOVA,#AJMPLOOP在此中间可以按排任意程序这里仅作示范。主程序到此结束DISP:定时器T的中断响应程序PUSHACCACC入栈PUSHPSWPSW入栈MOVTH,#HIGH()定时时间为个周期约微秒(M)MOVTL,#LOW()SETBFIRSTSETBSECOND关显示MOVA,#DISPBUFF显示缓冲区首地址ADDA,CounterMOVR,AMOVA,R根据计数器的值取相应的显示缓冲区的值MOVDPTR,#DISPTAB字形表首地址MOVCA,ADPTR取字形码MOVP,A将字形码送P位(段口)MOVA,Counter取计数器的值JZDISPFIRST如果是则显示第一位CLRSECOND否则显示第二位AJMPDISPNEXTDISPFIRST:CLRFIRST显示第一位DISPNEXT:INCCounter计数器加MOVA,CounterDECA如果计数器计到则让它回DECAJZRSTCOUNTAJMPDISPEXITRSTCOUNT:MOVCounter,#计数器的值只能是或DISPEXIT:POPPSWPOPACCRETIDELAY:延时毫秒PUSHPSWSETBRSMOVR,#D:MOVR,#D:NOPNOPNOPNOPDJNZR,DDJNZR,DPOPPSWRETDISPTAB:DBH,EH,aH,H,H,H,H,CH,H,HEND从上面的程序可以看出和静态显示相比动态扫描的程序稍有点复杂不过这是值得的。这个程序有一定的通用性只要改变端口的值及计数器的值就可以显示更多位数了。下面给出显示程序的流程图。单片机教程第二十五课:键盘接口与编程键盘是由若干按键组成的开关矩阵它是微型计算机最常用的输入设备用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘非编码键盘是由软件来识别键盘上的闭合键它具有结构简单使用灵活等特点因此被广泛应用于单片机系统。按键开关的抖动问题组成键盘的按键有触点式和非触点式两种单片机中应用的一般是由机械触点构成的。在下图中当开图图关S未被按下时P。输入为高电平S闭合后P。输入为低电平。由于按键是机械触点当机械触点断开、闭合时会有抖动动P。输入端的波形如图所示。这种抖动对于人来说是感觉不到的但对计算机来说则是完全可以感应到的因为计算机处理的速度是在微秒级而机械抖动的时间至少是毫秒级对计算机而言这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题就是说按键有时灵有时不灵其实就是这个原因你只按了一次按键可是计算机却已执行了多次中断的过程如果执行的次数正好是奇数次那么结果正如你所料如果执行的次数是偶数次那就不对了。为使CPU能正确地读出P口的状态对每一次按键只作一次响应就必须考虑如何去除抖动常用的去抖动的方法有两种:硬件方法和软件方法。单片机中常用软件法因此对于硬件方法我们不介绍。软件法其实很简单就是在单片机获得P。口为低的信息后不是立即认定S已被按下而是延时毫秒或更长一些时间后再次检测P。口如果仍为低说明S的确按下了这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P。为高)再延时个毫秒消除后沿的抖动然后再对键值处理。不过一般情况下我们通常不对按键释放的后沿进行处理实践证明也能满足一定的要求。当然实际应用中对按键的要求也是千差万别要根据不同的需要来编制处理程序但以上是消除键抖动的原则。键盘与单片机的连接图图、通过口连接。将每个按键的一端接到单片机的IO口另一端接地这是最简单的方法如图所示是实验板上按键的接法四个按键分别接到P、P、P和P。对于这种键各程序可以采用不断查询的方法功能就是:检测是否有键闭合如有键闭合则去除键抖动判断键号并转入相应的键处理。下面给出一个例程。其功能很简单四个键定义如下:P:开始按此键则灯开始流动(由上而下)P:停止按此键则停止流动所有灯为暗P:上按此键则灯由上向下流动P:下按此键则灯由下向上流动UpDownEQUH上下行标志StartEndEQUH起动及停止标志LAMPCODEEQUH存放流动的数据代码ORGHAJMPMAINORGHMAIN:MOVSP,#FHMOVP,#FFHCLRUpDown启动时处于向上的状态CLRStartEnd启动时处于停止状态MOVLAMPCODE,#FEH单灯流动的代码LOOP:ACALLKEY调用键盘程序JNBF,LNEXT如果无键按下则继续ACALLKEYPROC否则调用键盘处理程序LNEXT:ACALLLAMP调用灯显示程序AJMPLOOP反复循环主程序到此结束DELAY:MOVR,#D:MOVR,#DJNZR,$DJNZR,DRET延时程序键盘处理中调用KEYPROC:MOVA,B从B寄存器中获取键值JBACC,KeyStart分析键的代码某位被按下则该位为(因为在键盘程序中已取反)JBACC,KeyOverJBACC,KeyUpJBACC,KeyDownAJMPKEYRETKeyStart:SETBStartEnd第一个键按下后的处理AJMPKEYRETKeyOver:CLRStartEnd第二个键按下后的处理AJMPKEYRETKeyUp:SETBUpDown第三个键按下后的处理AJMPKEYRETKeyDown:CLRUpDown第四个键按下后的处理KEYRET:RETKEY:CLRF清F表示无键按下。ORLP,#B将P口的接有键的四位置MOVA,P取P的值ORLA,#B将其余位置CPLA取反JZKRET如果为则一定无键按下ACALLDELAY否则延时去键抖ORLP,#BMOVA,PORLA,#BCPLAJZKRETMOVB,A确实有键按下将键值存入B中SETBF设置有键按下的标志KRET:ORLP,#B此处循环等待键的释放MOVA,PORLA,#BCPLAJZKRET直到读取的数据取反后为说明键释放了才从键盘处理程序中返回AJMPKRETKRET:RETDMS:流水灯的延迟时间PUSHPSWSETBRSMOVR,#D:MOVR,#D:NOPNOPNOPNOPDJNZR,DDJNZR,DPOPPSWRETLAMP:JBStartEnd,LampStart如果StartEnd=则启动MOVP,#FFHAJMPLAMPRET否则关闭所有显示返回LampStart:JBUpDown,LAMPUP如果UpDown=则向上流动MOVA,LAMPCODERLA实际就是左移位而已MOVLAMPCODE,AMOVP,ALCALLDMSAJMPLAMPRETLAMPUP:MOVA,LAMPCODERRA向下流动实际就是右移MOVLAMPCODE,AMOVP,ALCALLDMSLAMPRET:RETEND以上程序功能很简单但它演示了一个键盘处理程序的基本思路程序本身很简单也不很实用实际工作中还会有好多要考虑的因素比如主循环每次都调用灯的循环程序会造成按键反应“迟钝”而如果一直按着键不放则灯不会再流动一直要到松开手为止等等大家可以仔细考虑一下这些问题再想想有什么好的解决办法。、采用中断方式:如图所示。各个按键都接到一个与非上当有任何一个按键按下时都会使与门输出为低电平从而引起单片机的中断它的好处是不用在主程序中不断地循环查询如果有键按下单片机再去做相应的处理。单片机教程第二十六课:矩阵式键盘接口技术及编程在键盘中按键数量较多时为了减少IO口的占用通常将按键排列成矩阵形式如图所示。在矩阵式键盘中每条水平线和垂直线在交叉处不直接连通而是通过一个按键加以连接。这样一个端口(如P口)就可以构成*=个按键比之直接将端口线用于键盘多出了一倍而且线数越多区别越明显比如再多加一条线就可以构成键的键盘而直接用端口线则只能多出一键(键)。由此可见在需要的键数比较多时采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些识别也要复杂一些上图中列线通过电阻接正电源并将行线所接的单片机的IO口作为输出端而列线所接的IO口则作为输入。这样当按键没有按下时所有的输出端都是高电平代表无键按下。行线输出是低电平一旦有键按下则输入线就会被拉低这样通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。矩阵式键盘的按键识别方法确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法是一种最常用的按键识别方法如上图所示键盘介绍过程如下。判断键盘中有无键按下将全部行线YY置低电平然后检测列线的状态。只要有一列的电平为低则表示键盘中有键被按下而且闭合的键位于低电平线与根行线相交叉的个按键之中。若所有列线均为高电平则键盘中无键按下。判断闭合键所在的位置在确认有键按下后即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平即在置某根行线为低电平时其它线为高电平。在确定某根行线位置为低电平后再逐行检测各列线的电平状态。若某列为低则该列线与置为低电平的行线交叉处的按键就是闭合的按键。下面给出一个具体的例子:图仍如上所示。单片机的P口用作键盘IO口键盘的列线接到P口的低位键盘的行线接到P口的高位。列线PP分别接有个上拉电阻到正电源V并把列线PP设置为输入线行线PP设置为输出线。根行线和根列线形成个相交点。检测当前是否有键被按下。检测的方法是PP输出全“”读取PP的状态若PP为全“”则无键闭合否则有键闭合。去除键抖动。当检测到有键按下后延时一段时间再做下一步的检测判断。若有键被按下应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。PP按下述种组合依次输出:PPPP在每组行输出时读取PP若全为“”则表示为“”这一行没有键闭合否则有键闭合。由此得到闭合键的行值和列值然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值为了保证键每闭合一次CPU仅作一次处理必须却除键释放时的抖动。键盘扫描程序:从以上分析得到键盘扫描程序的流程图如图所示。程序如下SCAN:MOVP,#FHMOVA,PANLA,#FHCJNEA,#FH,NEXTSJMPNEXTNEXT:ACALLDMSMOVA,#EFHNEXT:MOVR,AMOVP,AMOVA,PANLA,#FHCJNEA,#FH,KCODEMOVA,RSETBCRLCAJCNEXTNEXT:MOVR,#HRETKCODE:MOVB,#FBHNEXT:RRCAINCBJCNEXTMOVA,RSWAPANEXT:RRCAINCBINCBINCBINCBJCNEXTNEXT:MOVA,PANLA,#FHCJNEA,#FH,NEXTMOVR,#FFHRET键盘处理程序就作这么一个简单的介绍实际上键盘、显示处理是很复杂的它往往占到一个应用程序的大部份代码可见其重要性但说到这种复杂并不来自于单片机的本身而是来自于操作者的习惯等等问题因此在编写键盘处理程序之前最好先把它从逻辑上理清然后用适当的算法表示出来最后再去写代码这样才能快速有效地写好代码。到本课为止本站教程暂告一个段落!感谢大家的关心和支持!单片机教程第二十七课:初学单片机几个不易掌握的概念  随着电子技术的迅速发展计算机已深入地渗透到我们的生活中许多电子爱好者开始学习单片机知识但单片机的内容比较抽象相对电子爱好者已熟悉的模拟电路、数字电路单片机中有一些新的概念这些概念非常基本以至于一般作者不屑去谈教材自然也不会很深入地讲解这些概念但这些内容又是学习中必须要理解的下面就结合本人的学习、教学经验对这些最基本概念作一说明希望对自学者有所帮助。  一、总线:我们知道一个电路总是由元器件通过电线连接而成的在模拟电路中连线并不成为一个问题因为各器件间一般是串行关系各器件之间的连线并不很多但计算机电路却不一样它是以微处理器为核心各器件都要与微处理器相连各器件之间的工作必须相互协调所以就需要的连线就很多了如果仍如同模拟电路一样在各微处理器和各器件间单独连线则线的数量将多得惊人所以在微处理机中引入了总线的概念各个器件共同享用连线所有器件的根数据线全部接到根公用的线上即相当于各个器件并联起来但仅这样还不行如果有两个器件同时送出数据一个为一个为那么接收方接收到的究竟是什么呢?这种情况是不允许的所以要通过控制线进行控制使器件分时工作任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元这些存储单元要被分配地址才能使用分配地址当然也是以电信号的形式给出的由于存储单元比较多所以用于地址分配的线也较多这些线被称为地址总线。  二、数据、地址、指令:之所以将这三者放在一起是因为这三者的本质都是一样的──数字或者说都是一串‘’和‘’组成的序列。换言之地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字它与我们常用的指令助记符有着严格的一一对应关系不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据内部单元的地址值已由芯片设计者规定好不可更改外部的单元可以由单片机开发者自行决定但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象在各种不同的应用电路中各不相同一般而言被处理的数据可能有这么几种情况:·地址(如MOVDPTR#H)即地址H送入DPTR。·方式字或控制字(如MOVTMOD#)即是控制字。·常数(如MOVTH#H)H即定时常数。·实际输出值(如P口接彩灯要灯全亮则执行指令:MOVP#FFH要灯全暗则执行指令:MOVP#H)这里FFH和H都是实际输出值。又如用于LED的字形码也是实际输出的值。理解了地址、指令的本质就不难理解程序运行过程中为什么会跑飞会把数据当成指令来执行了。  三、P口、P口和P的第二功能用法初学时往往对P口、P口和P口的第二功能用法迷惑不解认为第二功能和原功能之间要有一个切换的过程或者说要有一条指令事实上各端口的第二功能完全是自动的不需要用指令来转换。如P、P分别是WR、RD信号当微片理机外接RAM或有外部IO口时它们被用作第二功能不能作为通用IO口使用只要一微处理机一执行到MOVX指令就会有相应的信号从P或P送出不需要事先用指令说明。事实上‘不能作为通用IO口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用IO口使用。你完全可以在指令中按排一条SETBP的指令并且当单片机执行到这条指令时也会使P变为高电平但使用者不会这么去做因为这通常这会导致系统的崩溃(即死机)。  四、程序的执行过程单片机在通电复位后内的程序计数器(PC)中的值为‘’所以程序总是从‘’单元开始执行也就是说:在系统的ROM中一定要存在‘’这个单元并且在‘’单元中存放的一定是一条指令。  五、堆栈堆栈是一个区域是用来存放数据的这个区域本身没有任何特殊之处就是内部RAM的一部份特殊的是它存放和取用数据的方式即所谓的‘先进后出后进先出’并且堆栈有特殊的数据传输指令即‘PUSH’和‘POP’有一个特殊的专为其服务的单元即堆栈指针SP每当执一次PUSH指令时SP就(在原来值的基础上)自动加每当执行一次POP指令SP就(在原来值的基础上)自动减。由于SP中的值可以用指令加以改变所以只要在程序开始阶段更改了SP的值就可以把堆栈设置在规定的内存单元中如在程序开始时用一条MOVSP#FH指令就时把堆栈设置在从内存单元H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令因为开机时SP的初始值为H这样就使堆栈从H单元开始往后而H到FH这个区域正是的第二、三、四工作寄存器区经常要被使用这会造成数据的浑乱。不同作者编写程序时初始化堆栈指令也不完全相同这是作者的习惯问题。当设置好堆栈区后并不意味着该区域成为一种专用内存它还是可以象普通内存区域一样使用只是一般情况下编程者不会把它当成普通内存用了。  六、单片机的开发过程这里所说的开发过程并不是一般书中所说的从任务分析开始我们假设已设计并制作好硬件下面就是编写软件的工作。在编写软件之前首先要确定一些常数、地址事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后其地址也就被确定了当器件的功能被确定下来后其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED等)编写软件编写好后用编译器对源程序文件编译查错直到没有语法错误除了极简单的程序外一般应用仿真机对软件进行调试直到程序运行正确为止。运行正确后就可以写片(将程序固化在EPROM中)。在源程序被编译后生成了扩展名为HEX的目标文件一般编程器能够识别这种格式的文件只要将此文件调入即可写片。在此为使大家对整个过程有个认识举一例说明:ORGHLJMPSTARTORGHSTART:MOVSP#FH设堆栈LOOP:NOPLJMPLOOP循环END结束表:BB:FF表FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF表表为源程序表是汇编后得到的HEX文件表是由HEX文件转换成的目标文件也就是最终写入EPROM的文件它由编程器转换得到也可以由HEXBIN一类的程序转换得到。学过手工汇编者应当不难找出表与表的一一对应关系值得注意的是从后开始的一长串‘FF’直到这是由于伪指令:ORGH造成的结果。  七、仿真、仿真机仿真是单片机开发过程中非常重要的一个环节除了一些极简单的任务一般产品开发过程中都要进行仿真仿真的主要目的是进行软件调试当然借助仿真机也能进行一些硬件排错。一块单片机应用电路板包括单片机部份及为达到使用目的而设计的应用电路仿真就是利用仿真机来代替应用电路板(称目标机)的单片机部份对应用电路部份进行测试、调试。仿真有CPU仿真和ROM仿真两种所谓CPU仿真是指用仿真机代替目标机的CPU由仿真机向目标机的应用电路部份提供各种信号、数据进行调试的方法。这种仿真可以通过单步运行、连续运行等多种方法来运行程序并能观察到单片机内部的变化便于改正程序中的错误。所谓ROM仿真就是用仿真机代替目标机的ROM目标机的CPU工作时从仿真机中读取程序并执行。这种仿真其实就是将仿真机当成一片EPROM只是省去了擦片、写片的麻烦并没有多少调试手段可言。通常这是二种不同类型的仿真机也就是说一台仿真机不能既做CPU仿真又做ROM仿真。可能的情况下当然以CPU仿真好。以上系个人对单片机的理解如有不对之处请诸位大虾多多指点。发表您的高见。单片机教程第二十八课:单片机音乐程序的设计与实验周振安利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发谈谈音乐程序的设计原理并给出具体实例以供参考。单片机的基本发音实验我们知道声音的频谱范围约在几十到几千赫兹若能利用程序来控制单处机某个口线的“高”电平或低电平则在该口线上就能产生一定频率的矩形波接上喇叭就能发出一定频率的声音若再利用延时程序控制“高”“低”电平的持续时间就能改变输出频率从而改变音调。例如要产生HZ的音频信号按图接入喇叭(若属临时实验也可将喇叭直接接在P口线上)实验程序为:其中子程序DEL为延时子程序当R为时延时时间约为usR中存放延时常数对HZ音频其周期为秒即ms。这样当P的高电平或低电平的持续时间为ms即R的时间常数取=(DH)时就能发出HZ的音调。将上述程序键入学习机并不断修改R的常数可以感到音调的变化。乐曲中每一音符对应着确定的频率表给出C调时各音符频率及其相应的时间常数。读者可以根据表所提供的常数将其进制代码送入R反复练习体会。根据表可以奏出音符。仅这还不够要准确奏出一首曲子必须准确地控制乐曲节奏即一音符的持续时间。音符的节拍我们可以用定时器T来控制送入不同的初值就可以产生不同的定时时间。便如某歌曲的节奏为每分钟拍即一拍为秒。其它节拍与时间的对应关系见表。但时由于T的最大定时时间只能为毫秒因此不可能直接用改变T的时间初值来实现不同节拍。我们可以用T来产生毫秒的时间基准然后设置一个中断计数器通过判别中断计数器的值来控制节拍时间的长短。表中也给出了各种节拍所对应的时间常数。例如对拍音符定时时间为秒相应的时间常数为(即H)对拍音符定时时间为秒相应时间长数为(即CH)。我们将每一音符的时间常数和其相应的节拍常数作为一组按顺序将乐曲中的所有常数排列成一个表然后由查表程序依次取出产生音符并控制节奏就可以实现演奏效果。此外结束符和体止符可以分别用代码H和FFH来表示若查表结果为H则表示曲子终了若查表结果为FFH则产生相应的停顿效果。为了产生手弹的节奏感在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。程序框图如图所示。下面给出程序序请单可直接在TDIII型学习机上演奏对其它不同型号的学习机只需相应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”C调节奏为拍分。读者也可以自行找出一首歌按表和表给定的常数将乐曲翻译成码表输入机器而程序不变。本实验方法简便即使不懂音乐的人将一首陌生的曲子翻译成代码也是易事和着机器的演奏学唱一首歌曲其趣味无穷。程序清单(略请参看源程序的说明)。《无线电》年第期。硬件连接说明:随便找一个仿真机或者什么单片机实验板只要能工作的就行将程序输入运行然后找个音箱(你计算机旁边应当就有一对吧)拨出插头插头的前端接在P。上后面部分找根线接单片机的地就应当有声了然后怎么改进硬件连接就是你的事了。。。。《无线电》年第期。PAG

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/60

51单片机教程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利