单片机qq空间怎么添加音乐

qq空间怎么添加音乐  时间:2021-02-26  阅读:()
芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715372致广大新老朋友应广大朋友的要求这次又对教程做了比较大的改动把大家提出的错误的地方做了修改另外加入了一些新的内容因为现在自己在做产品所以没太多的时间来解释大家学习中的问题请大家自己到电子爱好者网站—www.
entui.
com/bbs/index.
asp或我主持的网站电子爱好者园地www.
fj136.
com/bbs/index.
asp去提问我会经常去那儿看到了会给大家作解释发个广告我们现在生产的产品如果那位有需要可记得一定要来找我哦联系方法在下面够多了吧不要说找不到哦呵呵室内全彩屏室内外条屏芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715373前言基于本人学习单片机的痛苦经历特编写本教程以此献给广大的单片机初学者希望您能从中受益作者提示本教程乃最通俗易懂之单片机教材如果您还是看不懂请千万不要涉足此行以免误入歧途耽误您的前程*^*拿到这本教程您首先就会想什么是IAP教学法是不是一种什么全新的教学方法当然不是我可没有那么大的本事其实这只是我杜撰的一个名词意思就是InApplicationsProgram在应用中编程,当然这只是针对单片机教学说法是否正确还得您说了算至于为什么要提这种说法那我倒想说几句大家都知道学习电子技术是一件非常无聊和枯燥的事情为什么会有这种想法就是因为我们传统的教学方法只重理论而忽略了实践要一个人记住那些空洞而有无聊的理论知识实在不是一件容易的事好在我们总算熬过来了不管如何也多多少少的学习了一些电子基础知识接下来我们应该进一步掌握些什么知识呢凡涉足此行的朋友都知道那就是单片机不过这可不是一件容易的事倒不是因为单片机很难学而实在是我们身边很难找到一本专为单片机入门者而编写的教材翻一下传统的单片机教材都好象是为已经懂单片机的人而写的一般总是以单片机的结构为主线先讲硬件原理然后是指令接着讲软件编程再是系统扩展和外围器件最后举一些实例随便说一点很多书中的实例都是有问题的很少涉及单片机的基础知识如果按照此种学习方法想进行产品开发就必须先把所有的知识全部掌握了才可以进行实际应用孰不知单片机不象模拟电路和数字电路那样只要搞懂了电路原理再按照产品要求设计好相应的电路就可以了它是一种以简单的硬件结构复杂而有灵活的软件系统来完成设计的通用性产品不同的设计者只会使用其不同的功能几乎没有人会把它的全部指令都使用起来所以学习使用单片机只能靠循序渐进的积累而不可能先把它全部掌握了再去做产品开发当然天才就例外了*^*基于以上原因我们尝试了一种全新的单片机教学方法打破传统的循序渐进式的教学方法以单片机的应用为基础结合基本的工业控制系统和实践工作中的具体应用不分先后顺序将各条指令贯串于一个又一个的实验中通过所见即所得的实验来讲解各种指令的编程方法顺便讲解相关的基本概念使您尽快地熟悉单片机应用的基本步骤掌握软件编程的基本方法本教程分为上下两册上册部分主要教您掌握单片机开发的基本步骤和软硬件的编程与设计如果您学完了上册部分就能成为单片机的入门者完全可以进行一般产品的开发下册部分是单片机应用的提高部分主要学习单片机的系统扩展比如ROM和RAM存储器的扩展并行口的扩展串行口的扩展A/D和D/A与单片机的接口以及相关开发工具和软件的使用包括KELLC51的应用与调试技巧硬件仿真器的使用等等如果您学完了下册部分那就得恭喜您成为了单片机开发的高手了不过单片机的技术是在不断的发展和提高的您也不要太骄傲哦为了尽量把最新的单片机知识和应用成果收录进我们的教程希望您能不吝赐教共同来努力把我们的教程不断的改进和完善还是那句题外话技术是靠不断的积累和交流才会进步的固封自守只会更加落后由于时间和精力的限制我还是希望在您学习本教程之前自己先熟悉一点相关的电子技术知识特别是数字电路基础这对您学习中碰到的相关概念会有很大的帮助芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715374目录上册第一课单片机的概述6第二课单片机的硬件结构与开发过程9第三课单片机的内部结构一半导体存储器11第四课单片机的内部结构二工作寄存器15第五课单片机的内部结构三时序与时钟18第六课单片机的内部结构四并行口20第七课单片机的内部结构五数据与地址24第八课单片机的内部结构六特殊功能存储器27第九课单片机的工作方式29第十课单片机的寻址32第十一课单片机的指令一数据传递类指令35第十二课单片机的指令二数据传递类指令38第十三课单片机的指令三算术逻辑运算类指令42第十四课单片机的指令四控制转移类指令47第十五课单片机的指令五位及位操作指令51第十六课单片机的程序设计方法55第十七课单片机的定时计数器64第十八课单片机的中断系统68第十九课单片机的定时/中断实验一73第二十课单片机的定时/中断实验二78第二十一课键盘接口及编程方法一独立式按键81第二十二课键盘接口及编程方法二矩阵式按键87第二十三课单片机显示器接口及编程方法90第二十四课数码管的静态扫描与编程方法94芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715375下册第二十五课程序存储器的扩展及编程方法一2第二十六课程序存储器的扩展及编程方法二6第二十七课数据存储器的扩展及编程方法一8第二十八课数据存储器的扩展及编程方法二12第二十九课I2C总线原理及编程方法16第三十课串行接口的原理及编程方法一20第三十一课串行接口的原理及编程方法二25第三十二课多机通讯的原理及编程方法一28第三十三课多机通讯的原理及编程方法二32第三十四课定时/计数器的扩展及编程方法36第三十五课中断的扩展及编程方法41第三十六课D/A转换的原理及编程方法一45第三十七课D/A转换的原理及编程方法二50第三十八课A/D转换的原理及编程方法一54第三十八课A/D转换的原理及编程方法二58第三十九课看门狗原理和单片机的可靠性设计62第四十课键盘的扩展及编程方法66第四十一课显示器的扩展及编程方法70第四十二课单片机专用键显芯片的设计方法及编程原理75第四十三课实时时钟的原理及编程方法一79第四十四课实时时钟的原理及编程方法二83第四十五课单片机汉字显示系统的原理86第四十六课单片机汉字点阵屏的实验91第四十七课液晶显示器的原理和编程方法一94第四十八课液晶显示器的原理和编程方法二96芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715376第一课单片机的概述因为我们的主要课程是单片机的应用本来不想讲解单片机的历史与发展这话说现状更确切些但为了兼顾大多数朋友我还是简单的介绍一下这方面的相关知识一单片机的由来单片机专业名称—MicroControllerUnit(微控制器件)它是由大名鼎鼎的INTEL公司发明的最早的系列是MCS-48后来有了MCS-51我们经常说的51系列单片机就是MCS-51microcontrollersystem它是一种8位的单片机8位是什么意思我们以后再讲后来INTEL公司把它的核心技术转让给了世界上很多的小公司不过再小也有几个亿的销售/年哦所以世界上就有许多公司生产51系列兼容单片机比如飞利浦的87LPC系列华邦的W78系列达拉斯的DS87系列现代的GSM97系列等等目前在我国比较流行的就是美国ATMEL公司的89C51它是一种带FlashROM的单片机至于什么是FlashROM我在这儿先不作介绍等以后大家学到相关的知识时自然就会明白我们的讲座就是以该型号的单片机来作实验的讲到这里也许有的人会问我平时在各种书上看到全是讲解80318051等型号的单片机它们又有什么不同呢其实它们同属于一个系列只是89C51的单片机更新型一点(事实上,89C51目前正在用89S51代替我们的实验系统采用就是89S52的兼容89C52)这里随便说一下目前国内的单片机教材都是以8051为蓝本的尽管其内核也是51系列的但毕竟8051的单片机已经属于淘汰产品在市场上也很少见到了所以由此感叹国内的高等教育是如此的跟不上时代的发展需要这话可能会引起很多人的不满,所以大家别说是我讲的哦二主要单片机的分类接着上面的话题再给大家介绍一下我们经常在各种刊物上看到的AVR系列和PIC系列单片机是怎么回事以便让大家对单片机的发展有一个较全面的认识在没有学习单片机之前这是一个令很多初学者非常困惑的问题这么多的单片机我该先学哪一种呢AVR系列单片机也是ATMEL公司生产的一种8位单片机它采用的是一种叫RISC精简指令集单片机的结构所以它的技术和51系列有所不同开发设备也和51系列是不通用的它的一条指令的运行速度可以达到纳秒级即每秒1000000000次是8位单片机中的高端产品由于它的出色性能目前应用范围越来越广大有取代51系列的趋势所以学完了51系列的看来必须学会AVR的才行可叹知识爆炸人生苦短说完了AVR的再来说说另一种--PIC系列单片机它是美国MICROCHIP公司唉又是老美叫微芯公司的生产的另一种8位单片机它采用的也是RISC的指令集它的指令系统和开发工具与51系列更是不同但由于它的低价格和出色性能目前国内使用的人越来越多国内也有很多的公司在推广它不过它的影响力远没有51系列的大所以作为初学者51系列当然是首选以上几种只是比较多见的系列其实世界上还有许多的公司生产各种各样的单片机比如MOTOROLA的MC68H系列老牌的单片机TI的MSP430C系列极低功耗的单片机德国的西门子SIEMENS等等它们都有各自的结构体系并不与51系列兼容为了不搞大家的脑筋这里就不介绍了等大家入了门以后自己去研究它吧我们还是回来了解一下51系列单片机到底是个什么东西它有那些部分组成请接着往下看三单片机的结构及组成单片机到底是一种什么DD它究竟能做什么呢其实它就是一种能进行数学和逻辑运算根据不同使用对象完成不同控制任务的面向控制而设计的集成电路此话好象有点绕口没关系大家都应该知道我们经常使用的电脑吧在电脑上我们可以用不同的软件在相同的硬件上实现不同的工作比如我们用WORD可以打字用PROTEL可以设计图纸等等单片机其实也是如此同样的芯片可以根据我们不同的要求做出截然不同的产品只不过电脑是面向应用的而单片机是面向控制的比如控制一个指芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715377示灯的亮和灭控制一台电机的启动和停止等等那么它的内部究竟由哪些部件组成的呢大家都知道我们的电脑有很多的零件比如CPU中央处理器RAM内存条ROM程序存储器有点象硬盘输入输出设备并行口串行口等等在单片机中这些部件都有而且还把它们全部做到了一块芯片上这就是单片机名称的由来讲到这里您一定会想这么多零件集成在一块芯片上那为什么单片机的价格会这么便宜89S51每块才10元不到其实原因很简单----功能有强弱就象我们平时用的PLC控制一台数控机床要用128点的而控制一台电机有几点的就足够了另外这种芯片的产量很大技术也非常的成熟自然价格也就很低了说到这里你是不是有点心痒了也想学习学习那么学习单片机究竟需要些什么设备又要做哪些准备呢对于一个初学者来说了解这些真的是很有必要哦尽量化最少的钱毕竟是大家的想法嘛四学习单片机的准备工作首先您需要一台电脑这是最基本的配置嘛P2以上的就可以了然后您需要一套开发单片机的软件这个软件叫KEILC51它是美国KeilSoftware公司专门为MCS-51系列单片机开发的第三方软件它的免费测试版可在www.
keil.
com上下载也可以在各种单片机网站上下载最新版本是V6.
23安装时选择Uvision2虽然有2K代码的限制但足以满足我们学习的需要其次您还需要一台编程器它是一种把程序写进单片机芯片的设备这种设备品种很多操作也很简单大家既可以买现成的产品价格从200多元到2000多元的都有也可以自己制作有了这两样东西还不行为了看到程序执行的结果我们还需要一块实验板因为现在没时间学习系统我也不做了以前做的还有一些零件大家如果有需要我可以送给大家具体的说明在电子爱好者园地上有时间自己去看一下网址www.
fj136.
com/bbs/index.
asp实验系统的介绍看下面的内容传统的单片机实验过程都是先用KEILC51或其他的单片机开发软件把源代码汇编成HEX或BIN文件然后用编程器把汇编文件烧写入单片机中再把单片机插入实验板中才能看到软件的执行结果对于一个单片机初学者来说不仅非常的麻烦而且必须配置一套编程器和实验板就目前市场上最便宜的编程器来说投资也要300多元如此一来使得很多想学单片机但又不想花太多钱的爱好者忘而却步好在现在出现了一种支持在线下载的单片机只要满足一定的外部条件就能够直接把汇编的程序下载到目标单片机中经过实验我们开发设计了这样的一套实验系统它采用了一套集源代码编辑软件汇编程序下载于一体的专业软件采用具有在线下载功能的FLASHROM单片机89S52配合芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715378本教程可以完成教程中的每一个实验这样既免去了您添置编程器和仿真器等设备的昂贵费用又可以直接在实验板上看到程序执行的结果更由于采用的是FLASHROM的存储器烧写次数可以达到1000次以上产品具体电路图在教程的最后面附录中为了尽量降低大家的学习费用我们采用了模块化的设计方法在您学习上册时只需购买实验系统的主机部分包括了8个发光二极管2个数码管4个功能按键1个蜂鸣器一个串行芯片和成品外客完全可以做上册中的每一个实验当您开始学习下册时可以再购买扩展模块现在开发的扩展模块包括A/DTLC0831和D/AMAX517转换外部RAM6264和外部ROM29F020存储器16*16汉字显示点阵I2C总线24C01和温度转换DS18B20日历时钟DS1302和液晶字符模块T6963驱动的240*128中文图形点阵等如果你把这些都学会了那就得恭喜您因为您已经基本学会了使用MCS-51系列单片机四第1课习题1单片机的分类有几种2单片机与计算机有什么区别芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通715379第二课单片机硬件结构和开发过程从这一课开始我们就要正式开始学习MCS-51单片机了前面我们曾经提到过单片机的内部结构是由CPUROMRAM等等组成它们的内部结构我们以后再讲这一课让我们先来看看它的外部引脚即硬件结构看下面的图这就是我们要实验用的89C51单片机的外部引脚图给大家简单介绍一下一单片机的引脚功能1VCC40脚接电源+5V2VSS20脚接地也就是GND3XTAL119脚和XATL218脚接振荡电路单片机是一种时序电路必须有脉冲信号才能工作在它的内部有一个时钟产生电路有两种振荡方式一种是内部振荡方式只要接上两个电容和一个晶振即可另一种是外部振荡方式采用外部振荡方式时需在XTL2上加外部时钟信号详细的内容将在以后的课程中专门介绍4PSEN29脚片外ROM选通信号低电平有效5ALE/PROG30脚地址锁存信号输出端/EPROM编程脉冲输入端至于它们的作用我们暂时不去管它等以后学到相关的知识时再来研究它这也许就是本教程区别于其他教材的最大特点----先实践后理论尽量用实验结果来总结理论知识因为单片机是一种通用的产品它的功能设计是为了满足大多数使用者的要求换句话说不同的使用者只会使用其相关的功能几乎不可能把全部的功能都用起来因此我们完全不必象学习其他电子技术那样把单片机的全部知识都搞懂了再去开发产品这话前面好象说过了打住6RST/VPD9脚复位信号输入端/备用电源输入端什么是复位信号为什么要加复位信号当然也暂时不去管它7EA/VPP31内/外部ROM选择端在30脚9脚的功能上不知大家注意没有都有一个/什么意思呢这是引脚的第二功能也就是说该引脚既可以作前面的功能也可以作后面的功能至于它是如何工作的我们暂时也别去研究它芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537108P0口39-32脚双向I/O口9P1口1-8脚准双向通用I/0口10P2口21-28脚准双向I/0口11P3口10-17脚多用途口I/O就是英文IN/OUT的缩写这些引脚的功能想必大家也都明白了就是输入/输出的意思这32个I/O口就是留给我们作连接外围电路用的那么它们之间有些什么不同呢这个问题稍微有点复杂我们将在稍后再来专门学习现在我们先来往下看二单片机的电路连接和开发过程看最后面的附图这就是我们做实验用的电路图想必大家都能看得懂吧接下来就让我们通过一个实验来看看单片机是如何工作的我们的实验是让一个LED灯亮起来亮哪一个这就随便你了比如我们就让LED1亮起来吧仔细看一下电路图LED1接在什么地方呢接在单片机的P1.
0的引脚也就是1脚上那么按照该电路图的连接方法当1脚为高电平时LED1是不亮的只有当1脚为低电平时LED1才会亮起来怎样才能让1脚由高电平变为低电平呢我们让人做事就必须对她说一声也就是发布命令想让单片机工作也得发布命令不过在计算机中那叫指令我们要让1脚变为低电平的指令是CLRP1.
0让1脚变为高电平的指令是SETBP1.
0这就是我们通常所说的源代码这是我们实验的第一步—源代码编辑怎么做呢我们首先得打开实验软件屏幕出现一个浏览器的软件窗口点击左边的扩展实验选中实验16—自动温度控制器再点击工具栏里的调试按钮弹出一个记事本对话框写入CLRP1.
0;(注意分号必须在英文状态下输入)输入完毕后选择文件保存即可那么单片机能读懂这条指令吗当然不能接下来我们还有一件事情要做就是把这句指令翻译成单片机能读懂的东西单片机能读懂什么呢它其实只懂一样--就是数字因此我们就把CLRP1.
0翻译成C2H,90H至于为什么要翻译成这样这当然是INTEL公司规定好的我们就不需要去研究它了这个过程我们叫作编译这是我们实验的第二步那么指令是怎么编译过来的呢这就得靠专业的软件了我们做实验使用的软件就有此功能只要点击工具栏上的编译按钮稍等片刻即出现一个编译信息窗口如果编译通过就会有编译完成结果如下0个警告0个错误的编译信息如果编译错误则会出现编译错误的信息并提示错误的行号编译完了之后通常要进行程序仿真这是第三步当然我们的实验程序很简单是不需要仿真的接下来怎么才能把编译通过的指令写入单片机中呢这通常需要借助于一种硬件工具叫编程器也叫烧录器不过我们的实验板采用的是具有串行下载功能的单片机所以您只要直接点击快捷工具栏上的下载按钮程序就进入了实验板这是第四步—编程自此就完成了单片机实验的全过程全部工作结束后我们看到了什么接P1.
01脚的LED1亮了起来改变源代码变成SETBP1.
0;进行编译下载看看结果是不是LED1不亮了怎么样不难吧最后让我们来思考一个问题当我们用编程器把编译后的指令写入单片机时单片机就开始执行这条指令那么这条指令就一定在单片机内部的某个地方它究竟在哪里呢单片机的内部结构又是怎么样的呢这将是我们第三课要讨论的内容—单片机的内部结构一半导体存储器三本课总结本课主要讲述了单片机实验的整个过程这个过程包括第一步—编辑源代码第二步—编译源代码第三步—程序仿真第四步—芯片烧写亦称编程希望大家记住这四步这是非常关键的哦单片机的硬件原理其实并不复杂本来嘛单片机的设计就是为了通用和灵活所以开发单片机最重要的就是软件的编写以后我会慢慢地教大家学习更多的软件知识四第2课习题189C51的电源电压是多少伏2熟练掌握编译软件的使用方法芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153711第三课单片机的内部结构一单片机的内部究竟有哪些部分组成的它们都有些什么作用呢让我们看下面的图这就是单片机的内部方框图我们先来了解其中的ROM存储器吧一半导体存储器ROM1几个基本概念上一课我们讲到了把编译后的指令下载到单片机后这条指令一定在单片机内的某个地方那么它究竟在哪里呢原来它就放在一个叫程序存储器的地方英文名称ROM全称为ReadOnlyMemory叫只读存储器它是一个什么东西呢在讨论这个问题之前让我们先来看几个物理现象1数和物理现象的关系不知大家是否还记得在学习数字电路时我们曾用一盏灯的亮和灭来表示电平的高和低即用1来表示高电平用0来表示低电平如果现在有两盏灯那它会有几种状态呢请看下面的表00011011两盏灯的组合就是四种状态00011011这样看来灯的亮和灭这种物理现象同数字确实有着某种联系如果我们把它们按一定的规律排好那么电平的高或低就可以用数字来表示了换句话说不同的数字可以代表不同数量灯的电平高或低比如0000000100100011010001010110011110001001101010111100110111101111这十六种组合就可以代表四盏灯的状态能理解吗2位及字节的含义芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153712在单片机中一盏灯实际上是一根线我们称它为一位它有两种状态0或1分别对应电平的高或低它是单片机最基本的数量单位用BIT来表示8盏灯八根线有256种状态这8盏灯也就是8位我们把它称为一个字节用BYTE表示至于为什么要怎么规定这就不需要你我操心了我们只要记住就可以了那么单片机是如何来储存这些数字所代表的字节的状态的呢接着往下看2半导体存储器的工作原理1存储器的内部构造看下面的图这就是半导体存储器的结构简图(图中有4个字节)2存储器的工作原理存储器就是用来存放数据的地方它其实是利用电平的高或低来存放数据的也就是说它实际上存放的是电平的高或低的状态而不是我们所习惯上认为的1234这样的数字那它是如何工作的呢看上面的图这就是存储器的内部结构示意图一个存储器就象一个小抽屉一个小抽屉里有8个也就是单片机的8位小盒子每个小盒子用来存放1位电荷电荷通过与它相连的电线传进来或释放掉至于电荷在小盒子里是怎样存放的这就不用我们操心了您可以把电线想象成水管小盒子里的电荷就象是水那就好理解了存储器中的1个小抽屉我们把它称之为1个单元相当于1个字节而1个小盒子就相当于1位有了这么一个构造我们就可以开始存放数据了比如我们要放进一个数据00011010我们只要把第2号第4号和第5号小盒子里存满电荷而其它小盒子里的电荷给放掉就行了可是问题又出来了一个存储器有好多相同的单元线是并联着的看D7-D0在放入电荷的时候会将电荷放入所有的字节单元中而释放电荷的时候会把每个单元中的电荷都放掉这样的话不管存储器有多少个字节单元都只能放同一个数这当然不是我们所希望的因此我们要在结构上稍作变化看上面的图在每个单元上有根线与译码器相连我想要把数据放进哪个单元就通过译码器给哪个单元发一芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153713个信号由译码器通过这根线把相应的开关打开这样电荷就可以自由地进出了那么这样是不是就能随意地向存储器写入或者读出数据了呢其实还不能继续看上面的图与D7-D0相连的还有一个控制器它是用来干什么的呢这根线叫写入/读出控制线当我们向存储器写入数据时必须先把这个开关切换到写入端而要读出数据时就得先把开关切换到读出端而片选端则是为了区分不同的存储器设置的这里没搞明白没关系后面还有介绍先让我们来看看译码器是如何工作的3半导体存储器的译码简单介绍一下我们知道1根线可以代表2种状态2根线可以代表4种状态3根线可以代表8种256种状态又需要几根线代表自己想一下是不是8根线4存储器的选片及总线的概念至此译码的问题解决了让我们再来关注另外一个问题送入每个字节的8根线又是从什么地方来的呢它就是从单片机的外部引脚上接过来的一般这8根线除了接一个存储器之外还要接其它的器件这样问题又来了这8根线既然不是存储器和单片机之间专用的如果总是将某个单元接在这8根线上就不行了比如这个存储器单元中的数值是11111111另一个存储器的单元是00000000那么这根线到底是处于高电平还是低电平所以我们必须让它们分离办法当然也简单当外面的线接到集成电路的引脚上来后不直接接到各单元去而是在中间加一组开关这组开关就是前面提到的控制器看前面的图平时我们让开关打开着如果确实是要向这个存储器中写入数据或要从存储器中读出数据再让开关切换到相应的位置就行了这组开关由三根引线选择读控制端写控制端和片选端要将数据写入先由控制器选中该片然后发出相应的写信号开关切换到相应的位置并将传过来的数据电荷写入片中如果要读信号先选中该片然后发出读信号开关也切换到相应的位置上数据就被送出去了另外读和写信号还同时受到译码器的控制由于片选端的不同所以虽有读或写信号但没有片选信号所以另一个存储器就不会误会而开门造成冲突那么会不会同时选中两个存储器呢只要是设计好的系统就不会如果真的出现同时选中两个存储器的话那就是电路出故障了如此看来存储器要想写入或者读出数据还真是不容易不过好在这些都是由计算机自动完成的不需要我们去操心从上面的介绍中我们已经看到用来传递数据的8根线并不是专用的而是很多器件大家共用的所以我们把它们称之为数据总线总线英文名为BUS即公交车道谁都可以走而16根地址线51单片机共有16根地址线这些以后会讲解这里不必死记硬背也是连在一起的我们把它们称之为地址总线看上面的图对于本小节的内容如果您一时还无法理解没有关系继续往下看好了我们会在以后的课程中再来详细的介绍这里你只要稍微的了解一下就可以了芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537145半导体存储器的分类第一课中我们提到过89C51是一种带FlashROM的单片机什么是FlashROM它到底是一种什么东西呢ROM我们已经知道是只读存储器所谓只读从字面上理解那就是只可以从里面读出数据而不能写进去它类似于我们的书本发到我们手里之后我们只能读里面的内容不可以随意更改书本上的内容ROM就是单片机中用来存放程序的地方前面我们下载到单片机的指令就放在这个地方讲到这里大家也许会感到困惑既然ROM是只读存储器那么指令又是如何进入其中的呢其实所谓的只读只是针对工作情况下而言也就是在使用这块存储器的时候而不是指制造这块芯片的时候只要让存储器满足一定的条件就能把数据预先写进去这个道理也很好理解书本拿到我们手里是不能改了但当它还是原材料--白纸的时候我们完全可以由印刷厂把内容印上去嘛前面的编程就是这么回事FlashROM是一种快速存储式只读存储器这种程序存储器的特点是既可以电擦写而且掉电后程序还能保存编程寿命可以达到一千次左右所以我们的实验系统是可以反复烧写的你尽管使用目前新型的单片机都采用这种程序存储器当然除了这种程序存储器外还有两种早期的程序存储器产品简单介绍一下PROMEPROM和EEPROMPROM称之为可编程只读存储器就象我们的练习本买来的时候是空白的可以写东西上去可一旦写上去就擦不掉了所以它只能写一次要是写错了就报废了习惯上我们把带这种程序存储器的单片机称为OTP型单片机如果您的产品批量生产又要求价格比较低的话带这种程序存储器的单片机是非常合适的EPROM称之为紫外线擦除的可编程只读存储器它里面的内容写上去之后如果觉得不满意可以用一种特殊的方法去掉后重写就是用紫外线照射紫外线就象消字灵可以把字去掉然后再重写当然消的次数多了也就不灵光了所以这种芯片可以擦除的次数也是有限的—几十次吧电脑上的BIOS芯片采用的就是这种结构的存储器EEPROM前一种存储器的擦写要用紫外线而这种存储器可以直接用电擦写比较方便数据的改写它有点类似于FLASH存储器但比FLASH存储器速度要慢现在新型的外部扩展存储器都是这种结构的有关这几种程序存储器的使用和原理我们将在下册中详细的介绍这里就不多讲了总之一句不管哪种程序存储器它们的作用都只有一个----就是用来存放程序也就是我们为单片机编写的指令了解了ROM让我们再来简单讲讲另一种存储器叫随机存取存储器也叫内存英文缩写为RAMRandomAccessMemory它是一种既可以随时改写也可以随时读出里面数据的存储器类似于我们上课用的黑板可以随时写东西上去也可以用黑板擦随时擦掉重写它也是单片机中重要的组成部分单片机中有很多的功能寄存器都与它有关详细内容后面再讲二本课总结本课主要讲述了单片机的两种半导体存储器—只读存储器ROM和随机存储器RAM的工作原理它们是单片机的重要组成部分了解它的内部结构对我们学习单片机是很有帮助的不过如果您一时对本课的内容还无法搞得很明白也没有关系随着学习的深入我们还会慢慢地讲解相应的基础知识可千万不要放弃哦我在没有学会单片机之前也是如此囫囵吞枣的三第3课习题1半导体存储器分为几大类2ROM存储器的作用是什么3什么是位什么是字节4为什么8根线在单片机中会有256种状态它是如何出来的589C51的ROM有多少字节的容量芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153715第四课单片机的内部结构二上一节课我们讲了半导体存储器ROM和RAM的内部结构大家是不是觉得有些枯燥了这一课让我们先来做一个实验一LED灯闪烁的实验程序还记得第二课中的实验吗这个实验在实际应用中太没有意义了接下来我们要让LED1不断的闪烁就象高楼上或者大海中用的航标灯这个实验可是非常经典的几乎所有的单片机实验都要提到那么怎样才能让LED1不断的闪烁呢实际上就是让它亮几秒再灭几秒也就是让P1.
0交替地输出高电平和低电平怎样来实现这个功能按照前面所学的知识我们写出下面的程序CLRP1.
0SETBP1.
0编译后下载到单片机结果不行为什么这里有两个问题首先计算机执行指令的速度很快执行完第1条指令后LED1是灭了但在极短的时间内又去执行了第2条指令LED1又亮了我们根本无法看到灯曾经灭过第二个问题是当执行完第2条指令后不会再去执行第1条指令了因为单片机执行指令的过程是一条一条地顺序执行的如何解决这两个问题呢我们可以作如下的设想第一执行完第1条指令后让单片机延时一段时间几秒或零点几秒然后再去执行第2条指令这样就可以看到LED1曾经灭过了第二让单片机执行完全部指令后再返回去执行第1条指令如此不断的循环就可以达到我们的要求了实验程序如下主程序MAIN:SETBP1.
0;LCALLDELAY;CLRP1.
0;LCALLDELAY;LJMPMAIN;子程序DELAY:MOVR7,#250;D1:MOVR6,#250;D2:DJNZR6,D2;DJNZR7,D1;RET;END.
发现许多朋友很聪明喜欢把这里的内容复制了直接粘贴到实验系统中这对你的学习很不利所以现在的PDF文档我把它加密了看你再偷懒呵呵别怪我我也是为了你好*^*还记得软件的使用方法吗调试写入源代码编译下载到单片机看看是不是我们想要的结果在分析这段程序之前先来说明几个标点符号的意义1.
分号在这里起一个分隔符的作用表示这条指令到此为止2.
括号内的数字在这里是为了解释程序用的实际的编译过程中是没有意义的也就是说没有也是一样的只是为了程序的可读性更强我们一般会在分号的后面加上程序的注释文字后面我们会用到3.
特别程序中的标点符号只能在英文状态下输入当使用中文输入时必须切换到半角状态不然编译软件会出错接下来我们分析一下这段程序按照我们的要求第1条让灯灭第2条应该是延时第3条是让灯亮第4条和第2条一样也应该是延时第5条应当返回去执行第1条指令看一下上面的程序第1条我们已经懂了是让LED1灭第2条和第4条我们等一下讨论第5条是LJMPMAINLJMP是芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153716一条指令意思是转移转移到什么地方去呢看一下LJMP后面跟着什么是MAIN什么地方有MAIN在第1条指令的开头就是MAIN所以第5条指令的意思就是跳转到MAIN即第1条指令处继续执行如此一来就不断地重复执行这些指令那么MAIN又是什么意思呢它实际上是我们为这段程序起的一个名称专业术语叫标号既然是一个名称那可不可以用JIGUOCHINA等等的其他名字呢当然可以这完全取决于您的需要不过也有一些是不能采用的我们以后会讲再来分析第2条和第4条指令看看它们是如何实现延时的LCALLDELAYLCALL也是一条指令这条指令叫做调用子程序指令看看LCALL后面跟着的是什么--DELAY哪里有DELAY在第6条指令的开头很显然这也是一个标号这条指令的作用就是当执行到这条指令时就转去执行LCALL后面标号所在处的程序如果在执行程序时遇到RET指令RET叫返回指令就返回到LCALL指令的下面一条即第3条指令处继续执行在第9条指令后确实有RET指令那么在执行完第2条指令后就应该去执行第6.
7.
8.
9条指令之后遇到第10条指令RET执行完这条指令后就回去执行第3条指令将P1.
0清零也就是让LED1亮然后再去执行第4条指令执行完后又回到6.
7.
8.
9.
10条指令最后执行第5条指令LJMPMAIN也就是我们刚才说的跳转到第1条将P1.
0置位就是让LED1灭掉如此周而复始LED1就不断的闪烁好好理解这段文字务必把它搞清楚从标号DELAY处即第6条开始到RET的这一段指令我们称之为子程序它是一段延时程序至于延时多长时间我们会在下一课中学习程序的最后一条是END它不是指令它只是告诉编译软件整个程序到此结束了它叫伪指令在大家以后的编程中写完程序都要加上这一条在上面的程序中我们知道了从标号DELAY开始的子程序是一段延时程序那么它又是如何工作的呢在了解它的工作过程之前我们必须先知道其中的一些符号就从R7开始吧它是单片机内部的一个重要组成部分叫工作寄存器什么是工作寄存器下面我们就来讲解这个问题二工作寄存器上一课我们已经讲过在单片机中有许多的功能寄存器和半导体存储器RAM有关那么工作寄存器又属于哪一部分呢它是用来干什么的呢要搞清楚这个问题让我们先从日常生活中的一个例子说起比如我们要做一道数学题123+456您会马上得出答案579接下来再看一道题123+456+789要你马上得出答案就不那么容易了通常我们会怎么做呢一般总是先把123+456的结果579写在一张纸上然后再算579+789=1368这1368就是我们想要的最终结果而579只是为了得到最终结果而暂时记下来的中间结果单片机中做运算和我们生活中做运算一样也需要把中间结果放在某个地方那么计算机把它放在哪儿呢前面我们提到的ROM只读存储器中不行因为ROM是用来放程序的它只能写进去不能读出来再次提醒一下这只是相对而已所以只能放在单片机的另一个区域—RAM中即随机存取存储器中R7就是RAM区域中划出的一部分知道了R7接下来让我们来分析一下这段子程序延时程序三LED灯闪烁程序子程序的分析首先看第6条MOVR7#250这也是一条指令意思是传递数据我们知道在日常生活中要传递一件东西就必须要有一个传递者一个接受者和被传递的东西那么在单片机中是怎么区分它们的呢在这条指令中R7是接受者250就是要传递的东西单片机中要传递的东西当然是数字了这里传递者被省略了顺便提一下并不是每条指令都能省略的事实上大部分的指令都要有传递者这样一来这条指令的意思也很清楚了就是把250这个数传递给R7这个工作寄存器也就是把250这个数送入R7中这样执行完这条指令后R7中的值就应该是250我们可以用DBG8051这个软件来验证一下看是不是符合这个软件的使用很简单大家可以预先学一下比如我们写下面的指令MOVR7#01MOVR6#02输入后按F8看看右边的特殊/工作寄存器窗口中R6R7的值是不是01H02H注意实际显示的值是十六进制数由于我们输入的十进制数为了直观的看到执行结果所以数值不要太大了这里还有一个问题不知大家注意没有在250这个数的前面有个#它是什么意思呢这个#就说明250是一个被传递的数的本身而不是传递者这里面是有区别的我们以后会讲到看懂了MOV芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153717R7#250那么MOVR6#250也应该很清楚了接着看第8条DJNZR6D2这又是另一条指令我们来看一下DJNZ后面跟着什么一个是R6一个是D2R6我们已经知道了再找一下D2D2在本行的开头我们已经学过它是标号那么这条指令是怎么执行的呢它的执行过程是这样的它将后面的值即工作寄存器R6中的值减1然后查一下这个值是否等于0如果等于0就往下执行如果不等于0就转移转移到什么地方去呢大家应该明白了实际上这条指令的执行结果就是在原地转250次当R6中的值等于0之后程序就去执行第9条指令也就是DJNZR7D1大家自行分析一下这条指令的结果是不是转去执行MOVR6#250同时R7中的值减1这段子程序的最终执行结果就是DJNZR6#250这条指令被执行了250*250=62500次执行这么多次干吗就是为了延时四本课总结大家可以改变一下MOVR6#250这条指令中的值注意不能大于255为什么以后会讲到或者改变一下标号的名称看是不是符合上面的分析接下来提一个问题通过实验我们看到了LED1在闪烁是因为DJNZR6#250这条指令被执行了250*250=62500次执行那么多次究竟需要多长时间呢下一课我们再来专门讨论这个问题这里有必要介绍一下DBG8051这个软件它是一个专为8051单片机设计的仿真软件配合MON51仿真机能进行51单片机的仿真拥有这样一套设备在过去可是非常奢侈的不过现在已经很少有人使用它了原因是目前市场出现了许多兼容KEILC51的仿真器它们的功能更先进MON51只能属于淘汰产品不过作为单片机初学者使用DBG8051还是很有意义的相比其他的开发工具它的使用比较简单我们可以用它来理解单片机的内部结构和程序的执行结果在我们实验套件的随机光盘中有这个软件希望大家有时间好好的看一看五第4课习题1什么是主程序什么是子程序2标号的含义是什么3单片机是如何执行程序的4工作寄存器属于ROM单元还是RAM单元5在实验中如果没有RET指令会出现什么情况6理解指令LCALLLJMPDJNZ的意义7掌握DBG8051软件的使用方法芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153718第五课单片机的内部结构三上一课中我们提到了DJNZR6#250这条指令被执行了250*250=62500次就产生了延时那么这个时间是多少呢它又是如何计算出来的呢这一课就来讨论这个问题一单片机的时序1时序的由来我们已经知道单片机执行指令的过程就是顺序地从ROM程序存储器中取出指令一条一条的顺序执行然后进行一系列的微操作控制来完成各种指定的动作它在协调内部的各种动作时必须要有一定的顺序换句话说就是这一系列微操作控制信号在时间上要有一个严格的先后次序这种次序就是单片机的时序这就好比我们学校上课时用的电铃为了保证课堂秩序学校就必须在铃声的统一协调下安排各个课程和活动那么单片机的时序是如何规定的呢接着往下看2时序的周期计算机每访问一次存储器的时间我们把它称为一个机器周期它是一个时间基准就象我们日常生活中使用的秒一样计算机中一个机器周期包括12个振荡周期什么是振荡周期一个振荡周期是多少时间振荡周期就是振荡源的周期也就是我们使用的晶振的时间周期一个12M的晶振它的时间周期是多少呢电子技术过的朋友应该不难算出T=1/f也就是1/12微秒那么使用12M晶振的单片机它的一个机器周期就应该等于12*1/12微秒也就是1S在89C51单片机中有些指令只要一个机器周期而有些指令则需要两个或三个机器周期另外还有两条指令需要4个机器周期这也不难理解你在家擦地板的话总比擦桌子的时间要长不过我可是大男子主义从来不做家务的开句玩笑如何衡量指令执行时间的长短我们就要用到一个新的概念指令周期—即执行一条指令所需的机器周期INTEL公司规定了每一条指令执行的机器周期当然这不需要我们非把它记住不过在这里DJNZ指令我们是要记住的它是双周期指令执行一次需要两个机器周期即2S12M晶振的话回到我们上一课的实验延时的时间就应该算出来了吧是62500*2S=125000S也就是125mS这么大的数字也就0.
125S怪不得LED1闪烁的这么快这里给大家出个题目在上一课的实验中如何延长闪烁的时间想想看怎么做当然不会也没关系二单片机的时钟电路大家已经知道单片机是在一定的时序控制下工作的那么时序和时钟又有什么关系呢时钟是时序的基础单片机本身就如同一个复杂的同步时序电路为了保证同步工作方式的实现电路就要在唯一的时钟信号控制下按时序进行工作那么单片机内的时钟是如何产生的呢1内部时钟电路芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153719在MCS-51单片机的内部有一个高增益的反相放大器其输入端为引脚XTAL119脚输出端为XTAL218脚我们只要在外部接上两个电容和一个晶振就能构成一个稳定的自激振荡器它的内部电路的工作原理就不介绍了这里主要讲一下电容和晶振的选择看上面的图晶振的大小与单片机的振荡频率有关我们到串行接口时再详细讲解电容的大小影响着振荡器振荡的稳定性和起振的快速性通常选择10-30P的瓷片电容或校正电容另外在设计电路时晶振和电容应尽可能的靠近芯片以减少PCB板的分布电容保证振荡器工作的稳定性提高系统的抗干扰能力2外部时钟电路除了内部时钟方式外单片机还可以采用引入外部时钟的振荡方式什么时候需要采用外部时钟方式呢当我们的系统由多片单片机组成时为了保证各单片机之间时钟信号的同步就应当引入唯一的公用的外部脉冲信号作为各单片机的振荡脉冲此时应将XTAL2悬空不用外部脉冲信号由XTAL1引入如上右图所示这是大虾们的作品在此就不介绍了三本课总结本课的内容比较少我就罗嗦一下讲几句题外话我是一个只有初中毕业没有读过多少书的人从小就爱好无线电记得很小的时候当通讯兵的父亲带回来几本电子方面的书籍从此就迷上了无线电那种痴迷程度决不亚于现在的小孩迷恋游戏机至今仍然清楚的记得曾经因为装成功一台6管收音机而兴奋的几天几夜没睡好觉那个时候我国的电子工业还刚刚起步买一个3AX31的三极管都要特地跑到市区而且价格奇贵几乎要用去一个月的零化钱当时最愿意去的地方就是上海的虬江路电子旧货市场因为在那里可以淘到好多旧的电子元件初中毕业以后在当地根本就找不到一家电子企业只好在镇上开了一家电器修理店也就是这几年边干边做地学了不少在今天已根本无法再学得进去的电子啊空穴啊移位啊寄存啊等等理论知识由于身边没有一个可以请教的老师为了加深学习的印象所以只好一边做实验一边学理论尽管进度很慢但效果竟然还不错好在当时搞家电修理的收入还可以加上没有家庭负担也就这么过来了随后的几年做过工人也当过老师但更多的时间是在搞技术开发这些年来看到很多的昔日同学靠导腾房地产或者做生意发了财可自己依然还在这个领域默默无闻的钻研着但我还是没有后悔也从来没有想过改行因为电子技术那众多迷人而未知的领域常常会使我深深地陷入其中以至无法自拔也感叹自己搞了这么多年还只是一个入门者现在老是听到有些年轻的朋友说我要速成单片机速成C语言速成什么什么的每当我看到或听到这些话的时候总有一种说不出的滋味现在的社会什么都讲究个效率这本来没有错但学一项技术也能速成实在让人有点不知道说什么好就单片机而言即使你现在只有156岁也很有天赋想把现在的几种主流单片机都搞懂并很好的应用到实践中去没有个几年恐怕也难更何况单片机的技术是在不断发展的你想跟也来不及不过话又说回来我不是要打击大家的学习积极性单片机是一种非常宽泛的技术它的设计是为了满足大多数的需要换言之即使你并没有把全部的知识都理解得很深透或者说没有把每种单片机都搞懂也没关系你一样可以在实际的产品开发中应用它因为几乎没有一个产品会把全部的指令都用起来好了废话讲了半天还是言归正传吧希望大家课后多进行交流因为在我看来技术只有不断的交流才会有进步闭门造车只有S路一条四第5课习题1什么是单片机的机器周期什么是振荡周期什么是指令周期它们之间的关系是怎么样的2什么是单片机的时序3单片机有几种振荡方式4简述单片机内部时钟的产生过程芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153720第六课单片机的内部结构四在前一课中我们讲述了单片机的时序和时钟大家是不是又觉得有些头疼了下面让我们再来做两个实验放松一下一单片机I/O口的输出实验1实验程序程序如下LOOP:MOVP1,#0FFH;LCALLDELAY;MOVP1,#00H;LCALLDELAY;LJMPLOOP;DELAY:MOVR7,#250;D1:MOVR6,#250;D2:DJNZR6,D2;DJNZR7,D1;RET;END还是老规矩调试写入源代码编译下载看到了什么8只LED灯都在闪烁注意前面的实验是让一个LED灯闪烁分析一下程序2程序分析这段程序和前面的程序比较有两处不同第1条原来是SETBP1.
0现在改为MOVP1#0FFH第3条原来是CLRP1现在改为MOVP1#00H为什么这样改了之后就变成了8只LED灯同时闪烁了原来P1代表了P1.
7-P1.
0的全部我们把它当作一个存储器单元即一个字节不过对一个存储器单元送数就应该用MOV指令了在这里P1P1.
7-P1.
0接的是LED灯也就是负载它起到了一个输出端的作用那如果把P1改为P0或P2或P3行不行呢答案是肯定的为什么我们稍后再谈接着看第2个实验二单片机I/O口的输入实验1实验程序程序如下MAIN:MOVP3,#0FFH;LOOP:MOVA,P3;MOVP1,A;LJMPLOOP;END.
同样的方法把程序下载到单片机按下第1个按钮第1个LED灯亮了按下第2个按钮第2个LED灯亮了松开按钮相应的灯就灭了是不是有点象工业控制中的点动控制原理分析一下这个程序2程序分析看附图的实验系统硬件接线图有4个按钮分别接到了P3.
2P3.
3P3.
4P3.
5引脚上再来分析一下程序第1条使P3口包括P3.
7-P3.
0全部为高电平为什么MOVP3#0FFH能使P3口全部为高电平我们在下一课中讨论第2条MOVAP3MOV我们已经知道是送数的意思这条指令的意思就是把P3口的数送到A中去A是什么呢我们也可以把它看成一个中间单元就象R7寄存器一样第3条指令就是把A中的数送到P1口去第4条是循环这些我们都已经见过当我们按下芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153721P3.
2所连接的按钮时#0FFH这个数就被送到了A中通过程序又送到了P1使P1.
2输出低电平LED3就亮了按下P3.
3-P3.
5连接的按钮对应的LED4-LED6也亮了松开按钮相应的LED灯就灭了如果把按钮接到P2.
0-P2.
7或P0.
0-P0.
7可不可以呢当然可以所以在这里P3口又起到了一个输入端的作用由上面两个实验我们得出结论凡是以P开头的管脚都可以用作输入输出口在89C51中这32个管脚我们就称之为并行口它们实际上就是特殊功能存储器SFR什么是特殊功能寄存器我们后面再讲中的四个记作P0P1P2P3它们都是双向通道即既可以作为输出口也可以作为输入口作输出时数据可以锁存作输入时数据可以缓冲锁存和缓冲是什么意思忘了我也不告诉你自己回去看数字电路基础呵呵不是我不肯讲只是自己看可以加深印象那么它们是怎么实现输入输出功能的呢继续往下看三单片机并行口的结构分析先来看看输入结构1输入结构I/O口作为输入口时有两种工作方式即所谓的读端口与读引脚读端口时实际上并不从外部读入数据而是把端口锁存器的内容读入到内部总线经过某种运算或变换后再写回到端口锁存器只有读端口时才真正地把外部的数据读入到内部总线上面图中的两个三角形表示的就是输入缓冲器CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作这是由硬件自动完成的不需要我们操心读引脚时也就是把端口作为外部输入线时首先要通过外部指令把端口锁存器置1然后再实行读引脚操作否则就可能读入出错为什么看上面的图如果不对端口置1端口锁存器原来的状态有可能为0Q端为0Q^为1加到场效应管栅极的信号为1该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1也会因端口的低阻抗而使信号变低使得外加的1信号读入后不一定是1若先执行置1操作则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入由于在输入操作时还必须附加一个准备动作所以这类I/O口被称为准双向口89C51的P0P1P2P3口作为输入时都是准双向口接下来让我们再看另一个问题从图中可以看出这四个端口还有一个差别除了P1口外P0P2P3口都还有其他的功能这些功芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153722能又是作什么用的呢下面我们就来详细讲解这个问题2端口的工作原理1P0口先来看P0口从图中可以看到P0口的内部有一个2选1的选择器它受内部信号的控制如果在图中的位置则处在I/O口工作方式此时相当于一个准双向口输入时须先将口置1每根口线可以独立定义为输入或输出但是须在口线上加上拉电阻如果将开关往另一个方向则就是另一个功能—作为地址/数据复用总线用此时不能逐位定义为输入/输出它有两种用法当作数据总线用时输入8位数据而当作地址总线用时则输出低8位地址再强调一点当P0口作为地址/数据复用总线用之后就再也不能作I/O口使用了讲到这里也许大家会感到困惑什么叫作地址/数据复用这其实是当单片机的并行口不够用时需要扩展输入输出口时的一种用法具体如何使用这就比较复杂了我们只能留到下册课程中再来给大家讲解这里大家只要知道一下就可以了了解了P0口再来看P1口2P1口同P0不同P1口只能作为I/O口使用但它的内部有一个上拉电阻所以连接外围负载时不需要外接上拉电阻这一点P1P2P3都一样务必请大家记住3P2口P2口作为I/O口线用时与P0口一样当内部开关向另一个方向时即作地址输出时可以输出程序存储器或外部数据存储器的高8位地址并与P0口输出的低地址一起构成16位的地址线(注意和数据总线的区别数据总线是8位的很多书上都会提到51单片机是8位数据总线16位地址总线但都不会解释有什么不同看到这里你应该明白了吧)16位的地址可以寻址64K的程序存储器或外部数据存储器为什么下一课我们再给大家解释这里要注意的是当P2口作为地址总线时这高8位地址线是8位一起输出的不能象I/O口线那样逐位定义这和P0口是一样的4P3口P3口作为I/O口线用时同其他的端口相同也是准双向口不同的是P3口的每一位都有另一种功能也叫第二功能各位的功能如下它们的具体作用我们用到时再详细解释端口位第二功能注释P3.
0RXD串行口输入P3.
1TXD串行口输出P3.
2INTO外部中断0P3.
3INT1外部中断1P3.
4T0计数器0计数输入P3.
5T1计数器1计数输入P3.
6WR外部RAM写入选通信号P3.
7RD外部RAM读出选通信号讲到这里也许您会问既然单片机的引脚有第二功能那么CPU是如何来识别的呢这是一个令许多初学者困惑的问题几乎没有一本教科书提到过这个问题其实单片机的第二功能是不需要人工干预的也就是说只要CPU执行到相应的指令就自动转成了第二功能了解了各个I/O口的功能和作用后再来给大家讲解一下单片机I/O与外围电路的连接方法这可是蛮重要的哦四单片机I/O口的连接方法当单片机的I/O口作输出时可以直接与外部设备连接不过由于在实际的应用中由于其驱动电流是有限的DATASHEET上说是20mA所以我们常常需要通过接口电路来扩展它的驱动能力在单片机的后向通道控制系统中常用的功率控制器件有机械继电器晶闸管固态继电器等等下面我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法1单片机与机械继电器的接口我们知道单片机的一个I/O口只能灌入20mA的电流所以往往不足以驱动一些功率开关比如芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发六上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153723稍大一点的机械继电器等此时就应该采用必要的扩展电路如何来实现单片机与机械继电器的接口呢其实很简单我们通常采用下面的接法如图为了防止前向通道信号的干扰常采用一些光电隔离器件比如光电耦合器4N25PC814等当单片机的P1.
0脚输出为低电平时光藕受电导通Q1饱和开通继电器吸合负载电路接通另外为了防止电压间的互相干扰继电器的工作电压VDD与单片机的工作电压VCC不要使用同一个电源接地端也不要连在一起即所谓的模拟地与数字地分开驱动管的电流要大于继电器的工作电流,其他的元件就不讲了大家自行分析一下讲了单片机与继电器的接口再来介绍与固态继电器的接口方法接着往下看2单片机与固态继电器的接口普通继电器由于开关速度慢易跳火易机械磨损通常用于要求不高的场合在某些特殊应用场合比如防火防爆等系统中则应采用固态继电器固态继电器是一种无触点的电子继电器它的输入端只要很小的控制电流可以与单片机的I/O口直接连接输出则采用双向晶闸管控制其输入输出间均通过内部光电耦合器隔离可以防止信号间的干扰是单片机接口的理想器件随着其技术的成熟应用的广泛价格也已经非常的便宜1A/250V的目前在10元左右它与单片机的连接方法如图所示当-端所接的P1.
0为低电平时SSR导通负载工作除了以上两种连接方法外单片机与TTLCMOS管等都可以连接具体的方法这里就不介绍了大家可以自行找一下相关的资料五本课总结输入和输出口简称I/O口是单片机与外部电路接口的唯一途径四个并行口的结构是有一定区别的如何根据系统的设计要求和产品用途来正确灵活地使用是初学者必须掌握的基本功我们必须好好搞清楚它的功能和用途第6课习题1P0P1P2P3口的驱动电流分别是多少2什么是输入什么是输出3找本数字电路的书了解一下D触发器的原理芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153724第七课单片机的内部结构五在上一课中我们讲到了指令MOVP3#0FFH能使P3口全部为高电平而在第四课中LED灯闪烁程序中给R7送数用的指令是MOVR7#250那么这#250和#0FFH到底有什么不同它们又代表什么意思呢这一课就来讨论这个问题在讲解之前让我们先来复习一下数字电路中学过的数制概念一数制1十进制数DecimalNumber在日常生活中我们表示数的多少用的是十进制数即0123456789它遵循逢十进一借一当十的原则通常我们把计数符号的个数叫做基数十进制的基数就是十比如一个十进制数5847=5*1000+8*100+4*10+7*1它的每一个数码都有一个系数1000100101这个系数叫做权或位权十进制数虽然非常符合我们的使用习惯但计算机中却无法采用因为计算机只能有两种状态0和1所以我们还得应用二进制数2二进制数BinaryNumber二进制的基数为二0和1它遵循的是逢二进一借一当二的进借位原则也就是当某位计数到两个数时就向高位进同时本位变为比如二进制数1100=1*23+1*22+0*21+0*20二进制数只有0和1两个数正好代表了计算机中电路的两种工作状态所以它在计算机中被广泛应用下面是二进制的加法和乘法运算规则加法0+0=01+0=0+1=11+1=10乘法0*0=01*0=0*1=01*1=1二进制数虽然在计算机中处理很方便但当位数较多时就不容易记忆和书写了所以计算机中又有了十六进制数3十六进制数HexadecimalNumber十六进制也遵循两个规则一是有十六个基数即0123456789ABCDEF另一个规则是逢十六进一借一当十六比如我们前面提到的#0FFH就是一个十六进制数#--我们已经明白了它表示的是传递数的本身H叫数制简码它表示这个数是十六进制数为什么前面我在标题后面都加了英文注释相信大家也应该明白了吧这里随便提一下二进制简码B和十进制简码D通常是可以省略的我们以后的课程中用到的数都是这样写的那么0FFH这个十六进制数的表示方法是怎么样的呢用十进制就是表示0FFH=F*161+F*160即等于255大家也许会疑问这里的0到哪里去了呢原来在单片机中当我们用十六进制格式表示一个数时如果高位的数字为A-F时高位前面就得加上个0不然编译软件会出错就象#0FFH二进制之间的转换十进制有使用比较习惯的特点二进制有易于表示和运算方便的特点十六进制又有表示位数较多的特点但有时我们常常要把十进制数转换成二进制数或十六进制数来处理把二进制数逆转换成十六进制数如何进行这种转换呢下面就举几个例子1十进制数与非十进制数之间的转换1非十进制数转换为十进制数具体做法是将一个非十进制数按权展开成一个多项式每项是该位数码与相应权值之积把多项式按十进制的规则进行计算求和所得的结果就是该数的十进制形式比如二进制数1011B转换成十进制为1*23+0*22+1*21+1*20=8+2+1=11D再比如十六进制数FFH转换成十进制为255D2十进制数转换为非十进制数十进制数转换为非十进制数时可将其分为整数部分和小数部分分别进行转换最后将结果合并芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153725为目的数为了简单我这里只讲整数部分的转换这种转换叫做除基取余法具体做法是用欲转换数制的基数去除十进制数的整数部分第一次除所得余数为目的数的最低位把得到的商再除以该基数所得余数为目的数的次低位依次类推继续上面的过程直至商位为0此时所得余数为目的数的最高位比如将十进制数53D转换成二进制数为53D=110101B25322612130261230211012二进制数与十六进制数之间的转换四位二进制共有16种组合而这16种组合正好与十六进制数的16个基数一致所以每4位二进制数对应一位十六进制数我们只要把二进制数的整数部分自右向左每4位一组最后不足4位的用0补足小数部分自左向右每4位一组最后不足4位的在右面补0再将每4位二进制数对应的十六进制数写出即可相反如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4位二进制数即可比如将1101011B转换成十六进制数为D6H再比如将F0FH转换成二进制数为111100001111B十进制数二进制数十六进制数000000100011200102300113401004501015601106701117810008910019101010A111011B121100C131101D141110E151111F161000010上面的表格就是二进制数十进制数和十六进制数之间的对应关系三立即数的写法通过前面一小节的讲解我们已经懂了MOVR7#250和MOVR7#OFFH中#250和#0FFH原来是十进制数250D和十六进制数FFH的区别在单片机中通常我们把这个数称之为立即数那么如果我在编写指令时把立即数#0FFH写成二进制数即11111111或用十进制写法255是不是可以呢当然可以立即数既可以是二进制数也可以是十进制数或十六进制数讲到这里你应该明白了为什么我们前面的实验把#0FFH送到P3口会使P3.
7-P3.
0变为高电平这里再重复一遍那就是当用十六进制格式表示一个立即数时如果高位的数字为A-F时高位前面要加上个0请大家务必记住了这是一个常识问题可很多书上都不提所以很多人在做实验时往往会编译出错这里简单地讲了一下关于数制以及二进制十进制和十六进制数的关系大家可以在以后的实践芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153726中慢慢去理解和掌握如果您一时记不住千万不要刻意地去死记硬背下面让我们来讨论另一个问题四存储器的地址什么是存储器的地址地址和数据又有什么关系呢这个问题往往让初学者非常的难以理解既然单片机存储器内存放的是数据为什么还要有地址的概念让我们从生活中的一个例子谈起大家都知道寄信是怎么回事吧我们要寄一封信就必须写好信的内容然后在信的封面写上详细地址邮局才能按地址把它寄出去我们给单片机送数也一样除了要给出立即数犹如信的内容还必须知道这个数送达的地址犹如信的地址或邮政编码所以就必须给每个寄存器即半导体存储器都规定不同的地址只不过在单片机中地址的编码也是用数字来表示的那么单片机中有多少个寄存器呢它们的地址又是如何规定的呢前面我们学过单片机有两种存储器即只读存储器ROM和随机存储器RAM它们都被规定了各自的地址我们把它称做寻址空间既然是空间就必然有一个范围的概念接下来就让我们先看看89C51单片机内部程序存储器的寻址范围1内部R0M的寻址范围89C51的内部有4K的FLASHROM空间其寻址范围为000H-FFFH15162*15161*15160=0-4095这4K的ROM空间就是用来存放我们为单片机编写的程序用的单片机执行指令时就是一条一条顺序地从ROM中寻找指令进行执行了解了ROM的寻址范围让我们接着来看另一种存储器RAM的寻址范围2内部RAM的寻址范围89C51内部共有128个字节的RAM空间其寻址范围为00H-7FH怎么算出来的大家结合前面所学的知识自己理解一下它被分成三个区域第一个区域00H-1FH安排了4组工作寄存器每组用8个字节共32个字节分别为R0-R7当然在同一时刻只能用其中的一组工作寄存器怎么来控制它就要用到程序状态字PWS中的RS0RS1两位这我们后面再讲第二个区域20H-2FH共16个字节除了可以作为一般的RAM单元读写外还可以对每个字节的每一位即每一个抽屉中的每一个小盒子进行操作并且对这些位都规定了固定的位地址从20H单元的第0位开始到2FH单元的第7位结束共128位第三个区域就是一般的RAM单元地址为30H-7FH共80个字节实际上在89C51单片机的内部还有一个部分从80H-FFH是专门用于特殊功能寄存器SFR的89C51共用21个特殊功能寄存器这些我们都将在下一课中讲解它们每个也都有8位的这些特殊功能寄存器的使用和前面的128个字节RAM不同所以很多书上的解释都是89C51有128个字节的内部RAM实际上它们也属于内部RAM一部分为了加深印象大家可以打开DUG8051软件看一下它们的内部组成五本课总结本课主要讲述了数据与地址两个概念其中第一部分的内容在学习数字电路时大家应该学过我这里把与单片机有关的内容再讲解一下目的是希望各位能掌握这些知识因为它们对我们学习单片机是非常有用的数据和地址是单片机中一个非常重要的概念也是比较难以理解在我们以后的学习中大家会发现我还会更加详细的讲解这方面的相关知识六第7课习题1二进制十进制十六进制的规则分别是什么2什么叫立即数3单片机RAM的寻址空间为多少它包括哪两个部分4单片机ROM的寻址空间为多少5把下面的立即数转换成二进制100250100H4AHFFH6把下面的立即数转换成十进制000100111111A0HFFH7把下面的立即数转换成十六进制1002550011110011110101芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153727第八课单片机的内部结构六前面我们已经讲过R7R6是工作寄存器P0P1P2P3是并行口那么单片机中还有些什么东西它们的结构又是怎么样的呢这就是本课要讨论的问题一单片机的特殊功能寄存器看第三课的单片机内部结构图在单片机中除了前面介绍的RAMROMP0-P3和CPU外方框内的还有许多其他的东西它们被称为特殊功能寄存器英文简写SFR下表例出的就是MCS-51单片机中几个常用的特殊功能寄存器这一课我们先来介绍几个二几个常用的特殊功能寄存器1.
累加器ACC通常用A表示它是一个什么东西呢我们知道单片机在做运算时它的中间结果需要放在某个地方这个地方就是累加器它的名字很特殊功能也很特殊几乎所有的运算类指令都离不开它2.
寄存器BB寄存器在做乘法时用来存放一个乘数在做除法时用来存放一个除数不做乘除法时随你怎么用3.
程序状态字PSW它是一个很重要的东西里面放了CPU工作时的很多状态知道它就可以了解CPU当前的工作状态它有点象平时看书用的目录我们浏览它就可以了解一本书的内容它是一个8位的寄存器用到了其中的7位其格式如下D7D6D5D4D3D2D1D0CYACF0RS1RS00VP下面来逐位介绍它的功能1CY进位标志位MCS-51是一种8位的单片机它的运算结果只能表示到28即0-255但我们有时候的运算结果要超过255怎么办呢就要用CY位例如79H+87H01111001+01010111=100000000这里的1就进到了CY中去了2AC半进位标志位当D3位向D4位进位/借位时AC=1通常用于十进制调整运算中3F0用户自定义标志位由编程人员自行决定什么时候用什么时候不用4RS1RS0工作寄存器组选择位RS1RS0工作寄存器组000组00H-07H011组08H-0FH102组10H-17H113组18H-1FH前面讲到单片机共有四个工作寄存器组0组-3组它们就是由RS1RS0来控制这两位就在这里它共有四种组合状态看上面的表格每个工作寄存器组有8个字节分别记为R0-R7当然在某一时刻CPU只使用其中的一组假设PSW为11H即00010001那么RS1=1RS0=0则用到了第2组寄存器组地址10H-17HRO-R7即为10H-17H用DBG8051软件输入数值看看内部RAM中地址为10H-17H中的值是不是为输入值50V溢出标志位什么时候溢出我们讲到定时器时再研究芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537286P奇偶检验位每次运算结束后若A中二进制数1"的个数为奇数则P=1否则P=0例某运算结果是58H01011000显然1的个数为奇数所以P=14DPTRDPHDPL数据指针数据指针是一个16位的寄存器我们可以用它来访问外部RAM也可以访问外部ROM中的表格具体应用以后再讲5SP堆栈指针让我们先来理解一下堆栈是什么意思你在家洗碗吗我们洗好碗之后是怎么放的呢一般总是先洗的放在下面晚洗的放在上面然后用的时候呢总是晚放上去的先用先放上去的后用如果你不洗碗不要紧知道码头上仓库里堆的货物吗一般也是先进去的后出来而后进去的先出来这种符合先进后出后进先出存放规则的现象我们就把它叫做堆栈其实栈在中文中的意思就是码头在单片机中我们可以在内部RAM中构造出注意是可以构造这样一个区域这个区域存放数据的规则就符合堆栈中先进后出后进先出的原则为什么要有这样一个区域呢存储器本身不也同样可以存放数据吗是的知道了存储器地址确实可以读出它里面的内容但如果我们要读出的是一批数据每一个数据都要给出一个地址就会很麻烦为了简化操作就可以利用堆栈的存放方法来读取数据具体的应用我们将在十五课中结合具体实验来讲这里只是让大家先了解一下那么堆栈在单片机的什么地方也就是说把RAM空间的哪一块区域作为堆栈呢这就不好定了因为单片机是一种通用的产品每个人的实际需要各不相同有人需要多一些堆栈而有人则不需要那么多堆栈所以INTEL公司就干脆不分了把分的权利让给用户编程者也就是说我们可以根据自已的需要来决定所以单片机中堆栈的位置是可以变化的而这种变化就体现在SP中值的变化看下面的图SP中的值等于27H不就相当于是一个指针指向27H单元吗这就是堆栈指针的由来31H31H30H30H29H29H28H28H27H27H26H26H25H25H24HSP24H第一个数据当然在MCS-51单片机中指针开始所指的位置并非就是数据存放的实际位置而是数据存放的前一个位置例如一开始堆栈指针是指向27H单元的那么第一个数据的存放位置就在28H单元中而不是27H单元中这一点请大家注意6电源控制寄存器PCON单片机在以电池供电的系统中有时为了节电我们需要让它尽量降低电源的消耗所以单片机就有多种的工作方式其中一种就是低功耗方式PCON寄存器就是用来控制单片机进入低功耗方式的有关这方面的知识我们将在下一课的课程中详细介绍三本课总结以上几个寄存器只是单片机中最常用的几个SFR其他的特殊功能寄存器我们将在具体应用时再作详细的介绍四第8课习题1累加器A的作用是什么2什么是堆栈堆栈存放数据的规则是什么3单片机中有几组工作寄存器它们的字节地址是什么4简述PSW各位的作用芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153729第九课单片机的工作方式上一课中我们提到了单片机的工作方式单片机究竟有几种工作方式它们又是如何工作的呢这一课就来讨论这个问题一单片机的工作方式单片机共有复位程序执行低功耗和编程与加密四种工作方式下面分别加以介绍1复位方式1为什么要复位大家知道单片机执行程序时总是从地址0000H开始的所以在进入系统时必须对CPU进行复位也叫初始化另外由于程序运行中的错误或操作失误使系统处于死锁状态时为了摆脱这种状态也需要进行复位就象电脑死机了要重新启动一样2复位的原理单片机复位的方法其实很简单只要在RST引脚9脚上加一个持续时间为24个振荡周期即两个机器周期的高电平就可以了如果晶振为12M计算一下这个持续脉冲需要多长时间3如何进行复位复位操作有上电自动复位按键复位和外部脉冲复位3种方法它们的电路分别如下上电自动复位是通过外部复位电路的电容充电来实现的看图1当电源刚接通时电容C对下拉电阻开始充电由于电容两边的电压不能突变所以RTS端维持高电平只要这个充电时间不超过1ms一般都就可以实现对单片机的自动上电复位即接通电源就完成了系统的初始化在实际的工程应用中如果没有特殊要求一般都采用这种复位方式按键复位的电路如图2所示它其实就是在上电复位的基础上加了R1和SA这种电路一般用在需要经常复位的系统中外部脉冲复位的电路如图3所示外部复位通常用于要求比较高的系统比如希望系统死锁后能自动复位外部复位是由专门的集成电路来实现的也就是我们通常俗称的看门狗电路这种电路有很多它们不但能完成对单片机的自动复位功能而且还有管理电源用作外部存储器等功能比如X25045,MAX813L等等就是比较常用的此类芯片关于这方面的内容我们将留到下册的教程中再来给大家详细讲解现在让我们先来看看单片机复位后它的内部会有些什么变化呢看下面的表芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537304复位后的状态这就是单片机复位后内部系统的状态上面的有些符号我们暂时还看不懂不过没关系等以后学到了相关的知识后您自然就会明白了单片机的初始化状态寄存器复位时的内容PC0000HACC00HB00HPSW00HSP07HDPTR0000HP0-P3FFHTMOD00000000BTCON0X000000BTL000HTH000HTL100HTH100HSCON00HSBUF不定PCON0XXX0000B2程序执行方式程序执行是单片机的基本工作方式由于复位后PC=0000所以程序就从地址0000H开始执行此时单片机就根据指令的要求完成一系列的操作控制比如前面讲的让LED灯闪烁起来不过在实际使用中程序并不会从0000H开始执行而总是安排一条跳转指令比如LJMPSTART为什么要这样安排我们讲到中断时再来解释3低功耗操作方式在以电池供电的系统中有时为了降低电池的功耗在程序不运行时就要采用低功耗方式低功耗方式有两种—待机方式和掉电方式低功耗方式是由电源控制寄存器PCON上一课我们提到过的来控制的电源控制寄存器是一个逐位定义的8位寄存器其格式如下MSBSBSMODGF1GF0PDIDL其中SMOD为波特率倍增位在串行通讯时用GF1为通用标志位1GF0为通用标志位0PD为掉电方式位PD=1进入掉电方式IDL为待机方式位IDL=1进入待机方式也就是说只要执行一条指令让PD位或IDL位为1就可以了那么单片机是如何进入或退出掉电工作方式和待机工作方式的我们来介绍一下1待机方式进入待机方式当使用指令使PCON寄存器的IDL=1则进入待机工作方式此时CPU停止工作但时钟信号仍提供给RAM定时器中断系统和串行口同时堆栈指针SP程序计数器PC程序状态字PSW累加器ACC以及全部的通用寄存器都被冻结起来单片机的消耗电流从24mA降为3.
7mA这样就可以节省电源的消耗退出待机方式退出待机方式可以采用引入中断的方法在中断程序中安排一条RETI的指令就可以了什么是中断我们现在还不知道当然这没关系其实待机方式和我们使用电脑时的睡眠方式有异曲同工之妙2掉电方式芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153731进入待机方式当使用指令使PCON寄存器的PD=1则进入掉电工作方式此时单片机的一切工作都停止只有内部RAM的数据被保持下来掉电方式下电源可以降到2V耗电仅50uA此时就相当于把显示器和硬盘也关闭了退出待机方式退出掉电工作方式的唯一方法是复位不过应在电源电压恢复到正常值后再进行复位复位时间要大于1mS在进入掉电方式前电源电压是不能降下来的因此可靠的单片机电路最好要有电源检测电路显然掉电方式和待机方式是两种不同的低功耗工作方式前者可以在无外部事件触发时降低电源的消耗而后者则在程序停止运行时才使用关于单片机的低功耗的方式就简单的讲这些更详细的内容也留到下册再讲解4编程和加密方式单片机的编程与加密是由专门的设备来完成的这种设备称为编程器或烧录器类似的产品有很多功能也不尽相同如果您有兴趣我将在以后给您介绍一款51系列单片机编程器的自制方法这里给大家简单介绍一下单片机的加密加密是为了保护编程者的劳动成果而设计的一种工作方式不过有矛必然有盾现在的高手实在是很多听说即使用OTP特种加密方式也能解密不过能加密总比不加密的好所以大家在编程时应尽量采用加密功能二本课总结这一课我们讲述了单片机的工作方式对于初学者来说除了复位方式外其他的只要稍微有点了解就可以了三第9课习题1单片机有几种工作方式2为什么要进行复位复位后的状态是什么3如何对单片机进行复位4找一套编程器的软件自己先熟悉一下芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153732第十课单片机的寻址这一课让我们来了解一下单片机的寻址方式这对大家掌握指令会有很大的帮助什么是单片机的寻址单片机有几种寻址方式请往下看我们已经知道单片机的工作过程就是一条一条地从ROM存储器中取出指令然后执行相关的操作那么一条指令究竟有哪几部分组成它又包括哪些内容一般来说一条指令总是有操作码字段和操作数字段两部分组成看下面两条指令MOVR7#250MOVP1#0FFH这是我们以前学过的指令在这两条指令中MOV就是操作码字段R7和P1就是操作数地址字段而#0FFH我们称为常数(也就是立即数)单片机执行指令时就根据指令中给出的地址寻找实际的操作数不能理解没关系继续往下看一单片机的寻址先来看下面的实验程序一程序二MAINSETBP1.
0MAINSETBP1.
01MOV30H#255LCALLDELAYLCALLDELAY2CLRP1.
0CLRP1.
0MOV30H,#200LCALLDELAYLCALLDELAYAJMPMAINAJMPMAINDELAYMOVR7#250DELAYMOVR730HD1MOVR6#250D1MOVR6#250D2DJNZR6D2D2DJNZR6D2DJNZR7D1DJNZR7D1RETRETENDEND程序一就是我们以前做过的LED灯闪烁的实验我们已经知道每次调用延时程序的时间都是相同的125mS)如果现在提出这样的要求灯亮后延时时间为125mS灯灭灯灭后又延时100mS秒灯亮如此循环这样的程序还能满足要求吗显然不能怎么办我们可以把它改成程序二也就是先把一个数送入30H在子程序中R7中的值并不固定而是根据30H单元中传过来的数来确定这样就可以满足要求大家自行分析一下这个程序从这里我们可以得出结论在数据传递中要找到被传递的数很多时候这个数并不能直接给出而是需要变化这就引出了一个概念如何寻找操作数我们把寻找操作数所在单元地址的过程称之为寻址在实验一中我们直接使用数所在单元的地址找到了操作数所以称之为直接寻址而在实验二中我们是把数先放在工作寄存器30H中再把30H中的数送到R7看实验二的第6条指令这种方式则称之为寄存器寻址讲到这里大家有没有看出来这里的30H前面是没有#的而象MOVR7#250这样的指令在250前是有#的为什么我前面提到过大家好好回顾一下接下来提一个问题我们知道工作寄存器就是内存单元的一部份如果我们选择工作寄存器组0则R0就是RAM的00H单元那么这样一来MOVA00H和MOVAR0不就没什么区别了吗为什么要加以区分呢的确这两条指令执行的结果是完全相同的都是将00H单元中的内容送到A中去但是执行的过程不同执行第1条指令需要2个周期而执行第2条则只需要1个周期第1条指令变成最终的目标码要两个字节E5H00H而第2条则只要一个字节E8h就可以了也许有朋友会问不就差了一个周期吗为什么怎么斤斤计较如果是12M晶振的话也就1个微秒一个字节又能有多少呢当然如果这条指令只执行一次也许无所谓但一条指令如果执行上1000次就是1毫秒如果要执行1000000次就是1S的差别这就很可观了单片机要做的就是实时控制所以必须如此斤斤计较芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153733接下来再看另一个问题现在我们已经知道寻找操作数可以通过直接给的方式立即寻址和直接给出数所在单元地址的方式叫间接寻址有这两中方式这就够了吗看下面的问题要求从30H单元开始取20个数分别送入累加器A中就我们目前掌握的办法要从30H单元取数就用MOVA30H那么下一个数呢是31H单元的怎么取呢还是只能用MOVA31H那么20个数不是得20条指令才能写完吗这里只有20个数如果要送200个或2000个数那岂不要写上200条或2000条命令这未免也太笨了吧为什么会出现这样的状况因为我们现在只会把地址写在指令中所以就没办法了如果我们不是把地址直接写在指令中而是把地址放在另外一个寄存器单元中根据这个寄存器单元中的数值决定该到哪个单元中取数那就没问题了比如当前这个寄存器中的值是30H那么就到30H单元中去取如果是31H就到31H单元中去取就可以解决这个问题了怎么做呢既然看的是寄存器中的值那么我们就可以通过一定的方法让这里面的值发生变化比如取完一个数后将这个寄存器单元中的值加1还是执行同一条指令可是取数的对象却不一样了看下面的例子MOVR7#201MOVR0#30H2LOOPMOVA@R03INCR04DJNZR7,LOOP5这个例子中的大部份指令我们是能看懂的第1条是将立即数20送到R7单元中执行完后R7中的值应当是20第2条是将立即数30H送入R0工作寄存器中所以执行完后R0工作寄存器中的值是30H第3条是看一下R0单元中是什么值把这个值作为地址取这个地址单元的内容送入A中此时执行这条指令的结果就相当于执行MOVA30H第4条没学过就是把R0中的值加1因此执行完后R0中的值就是31H了第5条学过将R7中的值减1看是否等于0不等于0则转到标号LOOP处继续执行因此执行完这句后将转去执行MOVA@R0这一条此时相当于执行了MOVA31H因为此时的R0中的值已是31H了如此直到R7中的值逐次相减等于0也就是循环20次为止就实现了我们的要求从30H单元开始将20个数据送入A中这是另一种寻找数据的方法由于数据是间接被找到的所以把这种寻址方式称之为寄存器间址寻址注意在寄存器间址寻址中只能用R0或R1来存放等待寻找的数据当然还可以用DPTR或PC访问外部存储器的数据只不过在这里我们讨论的是寄存器间接寻址所以这两个就不在讨论范围之内除了以上几种寻址方法外单片机还有变址寻址相对寻址和位寻址共七种寻址方式这些您暂时可以不去深究它我们以后会结合具体的实验再来详细介绍这里只是为了归类所以才把它们例举在一起下面举几个例子说明一下二寻址方式举例1直接寻址直接寻址时指令中的地址码部分直接给出了操作数的有效地址例如MOVA4FHA4FH可用于直接寻址的空间有内部RAM的低128字节包括其中的位寻址区与特殊功能寄存器2寄存器直接寻址寄存器寻址时指令中地址码给出的是某一通用寄存器的编号寄存器的内容为操作数例如MOVAR7AR7可用于寄存器寻址的空间有R0-R7ACCCY位DPTRB等3寄存器间接寻址寄存器间接寻址时指令中给出的寄存器的内容为操作数的地址而不是操作数本身例如MOVA@R0A(R1)可用于寄存器间接寻址的空间只能是R0和R1,用DPTR或PC可间接寻址64K字节外部的RAM或ROM.
4立即寻址立即寻址时指令中地址码部分给出的就是操作数本身芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153734例如MOVA#0FFHA0FFH可用于立即寻址的空间有内部5变址寻址变址寻址时用指定变址寄存器的内容与指令中给出的偏移量相加DPTR所得的结果作为操作数的地址例如MOVCA@A+DPTR;A(A)+(DPTR)无论用DPTR或PC作为基准指针,变址寻址只适用于程序存储器即ROM通常用于读取数据表6相对寻址相对寻址时由程序计数器PC提供的基准地址与指令中提供的偏移量rel相加得到操作数的地址例如SJMPrelPCPC+2+rel7位寻址位寻址时操作数是二进制数的某一位其位地址出现在指令中例如SETBbitbit1可用于位寻址的空间有内部RAM的可位寻址区和SFR特殊功能寄存器中的字节地址可以被8整除即地址以08F结尾的寄存器空间三本课总结这一课主要讲述了单片机的寻址方式寻址是单片机中一个非常重要的概念单片机执行指令实际上就是到不同的地址空间寻找操作数的过程请大家务必搞清寻址的概念和寻址的方法到本课为止我们已经连续讲了很多单片机的基本概念可能有些朋友会觉得很难我这里可以告诉大家如果您有这种感觉那绝对是好事因为学习使用单片机本来就不是一朝一夕的事需要长期的结累和实践只有持之以恒才能取得最后的胜利其实世上很多事都是如此不过话又说回来当碰到一时无法理解的概念和知识时如何来搞懂它呢对于单片机学习来说我可以给大家介绍一个简单的好方法那就是先放着再说继续往下学等学会了后面的概念时你会突然发现有很多原来的不懂的东西会变得非常的简单试试看不要停留继续往下看四第10课习题1什么是单片机的寻址单片机有几种寻址方式2单片机的指令有几部分组成3直接寻址和间接寻址的区别在哪里4写一段从0AH单元开始把20个数送入A中的程序芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153735第十一课单片机的指令一指令就是编程者给单片机下的命令也就是我们平常所说的单片机软件前面我们已经陆续地讲到了一些指令但还远远不够从这一课开始就要全面的讲解指令了希望大家多动手实验巩固所学的知识说实在的其实单片机并不难学为了让大家比较容易记忆按照常规分类我把单片机的111条指令分成了五类—即数据传递类指令算术运算类指令逻辑运算类指令控制转移类指令和位操作指令这一课先来看数据传递类指令一数据传递类指令数据传递类指令是单片机中用的最多的指令在51系列单片机的111条指令中共有28条是数据传递类指令前面我们已经学到了几条比如MOVR7#250MOVAR6等那么它们是怎么分类的呢请往下看1以累加器为目的操作数的指令1MOVARn2MOVRnA3MOVAdirect4MOVA@Ri5MOVA#data指令1把Rn中的数送入累加器ARn代表工作寄存器R0-R7以后我们只要写到Rn都代表R0-R7这一点请大家记住了指令2则相反把累加器A中的数送入工作寄存器中指令3是把直接地址中的数送入累加器A中driect就代表直接地址以后也相同而指令4就是上一课我们讲的寄存器间接寻址什么意思这里再重复一遍就是看一下工作寄存器中是什么值把这个值作为地址把这个地址中的数送入累加器A中Ri代表什么意思呢就是工作寄存器R0或者R1以后如果写Ri都代表R0或R1第5条指令就是把立即数也叫常数直接送入累加器A中很显然data就代表立即数以后也相同其实这个我们以前提到过加#的数就代表送入的是这个数的本身接下来举几个实例加以说明大家可以用DUG8051这个软件验证一下AMOVR7#20HMOVAR7将工作寄存器R7中的值20H送入AR7中的值保持不变BMOVA#250MOVR7A将A中的值250送入工作寄存器R7A中的值保持不变CMOV30H#20HMOVA,30H将内存30H单元中的值20H送入A30H单元中的值保持不变DMOV20H#250MOVR0#20HMOVA,@R0先看R0中是什么值把这个值作为地址并将这个地址单元中的值送入A中执行命令前R0中的值为20H则是将20H单元中的值250送入A中最终送到A中的值是250EMOVA,#20H将立即数20H送入A中执行完本条指令后A中的值是20H这里有一点要解释一下在实例D中MOV20H#250中的20H是一个地址而MOV@R0,#20H中的20H却是一个地址为什么大家结合前面的知识好好想想如果不明白说明你对地址和数据的概念还没有搞清楚呵呵那就有点麻烦了*^*2以寄存器Rn为目的操作数的指令1MOVRnA2MOVRndirect芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537363MOVRn#data举几个实例大家自行分析一下这个应该不难吧AMOVR7ABMOVR730HCMOVR7#20这组指令功能是把源地址单元中的内容送入工作寄存器源操作数不变3以直接地址为目的操作数的指令1MOVdirectA例如MOV30HA将累加器A中的数送入内存单元30H2MOVdirectRn例如MOV30HR7将寄存器R7中的数送入内存单元30H3MOVdirectdirect例如MOV30H20H将内存单元20H中的数送入内存单元30H4MOVdirect@Ri例如MOV30H@R0看一下R0中是什么值把这个值作为地址并将这个地址单元中的值送入30H中如执行指令前R0中的值为20H则是将20H单元中的值送入30H中5MOVdirect#data例如MOV30H#20H将立即数20H送入内存单元30H注意和第三条指令的区别MOV30H20H这里的20H是一个16进制数为什么结合前面的知识自己想一下4以间接地址为目的操作数的指令1MOV@Ri,A2MOV@Ri,direct3MOV@Ri,#data16这三条指令就不介绍了,大家自行分析一下,不过有一点希望大家记住,在这里Ri只能用工作寄存器R0或者R15十六位数的传递指令MOVDPTR#data16指令说明这是51单片机中唯一的一条16位立即数传递指令大家知道51系列单片机是一种8位单片机8位单片机所能表示的最大数只能是28=0-255讲到这里大家应该明白了为什么我们前面的实验中立即数不能大于255如果现在有个数是1234H我们要把它送入DPTR该怎么办呢当然有办法INTEL公司已经把DPTR分成了两个寄存器DPH和DPL看一下前面的特殊功能寄存器介绍我们只要把12H(高8位)送入DPH把34H(低8位)送入DPL中去就可以了所以执行指令MOVDPTR#1234H和执行指令MOVDPH#12H1MOVDPL#34H2是一样的二指令练习请写出下列每条指令的执行结果并用DBG8051软件进行验证看结果是否正确1.
MOV12H,#34H2.
MOVR0,#23H3.
MOVR7,#22H4.
MOVR1,12H5.
MOVA,@R06.
MOV34H,@R17.
MOV45H,34H8.
MOV12H,DPH9.
MOVR0,DPL三本课总结芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153737本课主要讲述了以累加器为目的操作数的指令以寄存器为目的操作数的指令以直接地址为目的操作数的指令以间接地址为目的操作数的指令和一个十六位数的数据传递类指令这些指令有的我们前面已经学到过希望大家用DBG8051软件多练习以加强对数据及指令的认识四第11课习题1RnRidirectdata分别代表什么举例说明2地址30H和数据30H有什么区别3DPTR是什么#data16代表什么芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153738第十二课单片机的指令二接着上一课的数据传递类指令这一课继续讲解其他的数据类指令提示下面的内容我们下册中才会用到这里只是为了把数据传递类指令讲完才提前把它们讲一下您不知道也没关系一数据传递类指令6累加器A与片外RAM之间的数据传递类指令什么是片外RAM即片外数据存储器呢单片机不是有内部RAM吗为什么还要片外RAM呢难道单片机的内部RAM还不够用吗的确如此当单片机的内部RAM不够时我们就要扩充RAM空间那么单片机能扩充多少的外部RAM空间呢89C51单片机的片外RAM可以扩展到64K即从0000H-FFFFH那么它是怎样和累加器A进行数据传递的随便说一下与外部RAM进行数据传递必须通过累加器A它们之间的传递指令共有以下四条1MOVXA@Ri2MOVX@RiA3MOVXA@DPTR4MOVX@DPTRA指令说明A在51系列单片机中所有要送入或读出外部RAM的数据必须先送到A中去由此我们可以看出内外部RAM的区别内部RAM间可以直接进行数据的传递而外部RAM则不行比如要将外部RAM中某一单元假设为100H单元的数据送入另一个单元假设为200H单元就必须先将100H单元中的内容读入A中然后再送到200H单元中去在这里有一个问题CPU是如何区分内外部RAM的大家看这里的四条指令其操作码都是MOVX而内部RAM的操作码则是MOVCPU就是根据不同的指令来自动区分读写内外部RAM的B要读出或写入外部的RAM当然还必须知道外部RAM的地址在后两条指令中地址是被直接放在DPTR中的而前两条指令由于Ri即R0或R1只是一个8位的工作寄存器所以只能提供低8位的地址所以不同的应用场合就要使用不同的读写指令C使用时应当首先将要读出或写入的地址送入DPTR或Ri中然后再用读写指令举例说明将外部RAM中100H单元中的内容送入外部RAM中200H单元中MOVDPTR#100HMOVXA@DPTRMOVDPTR,#200HMOVX@DPTR,A7累加器A与片外ROM之间的数据传递类指令MOVCAA+@DPTR前一小节讲了累加器A与外部RAM之间的数据传递类指令接下来再来讲讲片外ROM与累加器A之间的数据传递类指令在讲解之前先来了解一下内部ROM和外部ROM的组成89C51的内部有4K的FLASHROM空间其地址为000H-FFFH片外可以扩展到64KOOOOH-FFFFH在这64K的ROM空间中有4K字节的地址是片内和片外公用的即000H-FFFH而1000H-FFFFH的空间是片外ROM专用的讲到这里大家就会问既然有4K的地址是公用的那么CPU是如何区分的呢不知大家是否还记得在第二讲单片机的硬件电路中有一个引脚EA即31脚当EA=1CPU从片内ROM的4K字节中取指令如果地址超过了4KFFFH单片机就自动转向片外ROM取指令大家注意这个过程是自动完成的不需要人工干预而当EA=0时CPU只从片外ROM取指令所以在实际的应用中如果只使用内部ROM一般总是把EA脚接电源我们的实验板就是这么做的讲到这里细心的朋友还会有一个问题当使用外部ROM和外部RAM时它们的寻址范围都是芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537390000H-FFFFH也就是说它们在地址上是重叠的那么CPU在读取指令时又是如何来区分当前是从ROM取指令还是从RAM取指令呢请大家来看第二课的89C51单片机硬件电路图29脚是PSEN当我们置位PSEN时即PSEN=1CPU就读取外部ROM指令而要从外部RAM读取指令时就要置位WR即16脚或RD即17脚这样即使ROM地址和RAM地址是重叠的也不会出现混乱这里又有一个问题了16脚和17脚不是并行口P3.
6和P3.
7吗如果我们把它当作第二功能WR和RD来使用CPU又是如何来区分的呢这个问题我们前面已经讲过了这里再重复一遍单片机引脚的第二功能是不需要人工干预的也就是说只要CPU执行到相应的指令就自动转成了第二功能了解了片外ROM的读取指令原理再来看片外ROM与累加器A之间的数据传递指令注意ROM只能读取指令而不能写入数据这一点和RAM是不同的不需要解释了吧MOVCAA+@DPTR指令说明A本条指令是将ROM中的数送入A中通常称其为查表指令我们常用此指令来查一个已做好在ROM中的表格B此条指令引出一个新的寻址方法变址寻址本指令是要在ROM的一个地址单元中找出数据显然必须知道这个单元的地址这个单元的地址是这样确定的在执行本指令前DPTR中有一个数A中也有一个数执行指令时将A和DPTR中的数加起来就成为要查找的数的单元地址把查找到的结果放在A中因此本条指令执行前后A中的值不一定相同举个例子有一个数在R0中要求用查表的方法确定它的平方值此数取值范围是0-5MOVDPTR#TABMOVAR0MOVCA@A+DPTR.
.
TAB:DB0,1,4,9,16,25假设R0中的值为2送入A中而DPTR中的值则为TAB则最终确定的ROM单元的地址就是TAB+2也就是到TAB+2这个单元中去取数取到的是4(DB后面的第三个数)其它数据也可以次类推从这里可以看出我们使用了标号象TAB等来代替具体的ROM单元地址事实上标号的真实含义就是地址的数值在这里它就代表了TAB+0TAB+1TAB+25这几个数据在ROM中的存放位置而我们以前学过的如LCALLDELAY指令DELAY代表的是以DELAY为标号的那段程序在ROM中存放的起始地址CPU就是根据这个起始地址才找到指令的无法理解是吗没关系让我们先来看几个符号的含义就会明白了二单片机的伪指令我们前面简单提到过END是伪指令那么到底什么是伪指令它在单片机中有什么作用呢接下来我们就来讨论这个问题伪指令是单片机中用来给寄存器定义或者赋值的特殊指令为什么要用伪指令呢让我们先来看下面的实验1DB—定义字节伪指令它的功能是从程序存储器ROM单元的某个地址开始存入一组规定好的8位二进制常数例如ORG2000HTABDB4548H1034H解释一下ORG—程序开始地址伪指令什么意思呢就是说本条指令的下一条从该地址开始存放数据比如上面的指令经汇编后将从地址2000H开始给若干个ROM单元赋值即2000H=452001H=48H2002H=0AH2003H=34H讲到这里有的人会问在这些指令中我直接用MOV2000H45HMOV2001H48H不就得了干吗要用DB指令呢是的从理论上讲两者的效果是一样的只是因为我们现在的程序都很短单片机不可能只做这些简单的工作当程序比较长时这些指令的意义就不一样了芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153740除了刚刚提到的ORG和DB伪指令外单片机中还有那些伪指令呢下面简单讲解一下2DW—定义字伪指令在单片机中一个字由两个字节组成也就是说如果一个字节可以表示一个8位数的话那么一个字就可以表示一个十六位的数关于这方面的问题我们留到下册中再来讨论这里就不讲了以免增加大家的学习难度如此一来这条伪指令的功能也就清楚了就是从指定的ROM单元开始定义若干个16位常数上一课我们已经讲过51系列单片机要存放一个16位的常数就必须把这个数分成两个8位数据来存放通常我们把一个16位数的高8位放入低地址而把低8位放入高地址注意这两个地址必须是紧挨着的例如ORG3000HABCDW2345H0A859H程序经汇编后3000H=23H3001H=45H3002H=A83003H=59H3DS—保留空间伪指令它的功能是从指定的地址开始保留若干个字节的ROM空间留作它用例如ORG2000HABCDS08HLOOPMOVA30H汇编以后从2000H开始将保留8个ROM单元留作它用那么以LOOP为标号的指令就存放在2008H单元中这里有一点请大家注意这几条伪指令都只能对程序存储器ROM起作用而不能用它们来对数据存储器RAM进行赋值或做其他的工作至于它们到底有什么作用我们什么时候才需要用到它们我们将在下册的实验中再作讲解现在让我们通过一段程序来重点解释一下查表程序的使用方法这可是一定要学会的哦例如MOVDPTR#100HMOVAR0MOVCA@A+DPTR.
.
ORG0100HDB0,1,4,9,16,25如果R0中的值为2则最终地址为100H+2即102H到102H单元中找到的是4这个可以看懂了吧那么103H中的数是多少呢104H呢大家思考一下8堆栈的操作指令什么是堆栈我们前面已经介绍过了那么堆栈是如何进行数据传递的呢对堆栈的操作指令有2条1PUSHdirect2POPdirect第1条指令称之为推入就是将direct中的内容送入到堆栈中第2条指令称之为弹出就是将堆栈中的内容送回到direct中这不难理解我重点解释一下推入和弹出的执行过程首先将SP中的值加1然后把SP中的值当作地址将direct中的值送进以SP中的值为地址的RAM单元中例如MOVSP#5FHMOVA#100MOVB#20PUSHACCPUSHB这段指令的执行过程是这样的将SP中的值加1即变为60H然后将A中的值#100送到60H单元中因此执行完PUSHACC这条指令后内存60H单元的值就是100同样执行PUSHB时是芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153741将SP+1即变为61H然后将B中的值送入到61H单元中即执行完本条指令后61H单元中的值变为20这是推入那么弹出又是怎么样的呢继续看下面的例子MOVSP#5FHMOVA#100MOVB#20PUSHACCPUSHBPOPBPOPACCPOP指令的执行是这样的首先将SP中的值作为地址并将此地址中的数送到POP指令后面的那个direct中然后SP减1上面程序的执行过程是将SP中的值现在是61H作为地址取61H单元中的数值现在是20送到B中所以执行完POPB指令后B中的值是20然后将SP减1那么此时SP的值就变为60H然后执行POPACC将SP中的值60H作为地址从该地址中取数现在是100并送到ACC中所以执行完本条指令后ACC中的值是100这有什么意义呢ACC中的值本来就是100B中的值本来就是20啊是的在本例中的确没有意义但在实际工作中推入堆栈结束后即执行指令PUSHB后往往要执行其他的指令而且这些指令会把A中的值和B中的值改掉所以在程序执行结束后如果我们要把A和B中的值恢复到原来的值那么这些指令就有意义了具体应用我们将在以后的课程中讲到这里还有一个问题如果不用堆栈比如说在PUSHACC指令处用MOV60HA在PUSHB处用指令MOV61HB然后用MOVA60HMOVB61H来替代两条POP指令不也一样吗是的从结果上看是一样的但是从过程看是不一样的PUSH和POP指令都是单字节单周期指令而MOV指令则是双字节双周期指令更何况堆栈的作用不止于此所以一般的单片机上都设有堆栈而我们在编写子程序需要保存数据时通常也采用堆栈的方法来实现9其他的数据传递类指令1XCHARn2XCHAdirect3XCHA@Ri4XCHDA,@Ri5MOVCAA+PC前面的4条指令是进行数据交换用的第1条寄存器与累加器交换第2条直接地址与累加器交换第3条间接RAM与累加器交换第4条间接RAM与累加器的低4位交换第5条是累加器与代码字节之间的数据传递类指令这些指令作为初学者可能暂时还用不上所以就不介绍了大家只要了解一下就可以了等下册中我们再来详细的讨论三本课总结到本课为止数据传递类指令全部讲解完了在单片机的指令中数据传递类指令是使用最多的指令因此这部分的内容是必须掌握的如何来使用这些指令我们将在以后的课程中结合具体的实验加以介绍为了加深印象大家可以用DBG8051软件对上述指令进行反复练习用实验结果来加深课堂知识四第12课习题1单片机是如何区分片外RAM和片外ROM的又是如何区分片外ROM和片内ROM的2简述推入堆栈和弹出堆栈的操作过程芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153742第十三课单片机的指令三算术逻辑运算类指令也是单片机中极为重要的指令系统在很多教科书中都把它们归为一类实际上它们还是有区别的为了让大家便于记忆这里把它们分了开来在51单片机中算术运算类指令有24条逻辑运算类指令有25条这一课我们先来讲解算术运算类指令下面我们分别加以讲解一算术运算类指令1不带进位的加法指令1ADDARn例ADDAR72ADDA@Ri例ADDA@R1(3)ADDAdirect例ADDA30H4ADDA#data例ADDA#30H指令说明这些指令的意思就是把后面的值与A中的值相加结果送到A中去举例MOVA30HADDA10H执行结果A=40H2带进位的加法指令1ADDCARn例ADDCAR72ADDCA@Ri例ADDCA@R13ADDCAdirect例ADDCA30H4ADDCA#data例ADDCA#30H指令说明这些指令的作用都是将A中的值和其后面的值相加并且加上进位位CY中的值为什么要这样做呢我们知道51单片机是一种8位单片机所以只能做8位的数学运算也就是说最大运算的范围只能是0-255这在实际工作中肯定是不够的因此就要进行扩展怎么扩展就是将2个8位的数学运算合起来成为一个16位的运算这样可以表达的数的范围就能达到0-65535如何合并呢其实很简单让我们看一个十进制数的加法例子66+78这两个数相加我们根本不会在意它的过程但事实上我们是这样做的先做6+8低位然后再做6+7这是高位做了两次加法只是我们做的时候并没有刻意分成两次加法来做罢了或者说我们并没有意识到我们做了两次加法之所以要分成两次来做是因为这两个数超过了一位数所能表达的范围0-9在做低位时产生了进位我们通常的办法是在适当的位置点一下然后在做高位加法时将这一点加进去其实计算机中做16位加法时同样如此先做低8位的如果两数相加产生了进位也要点一下做个标记这个标记就是进位位CY在PSW中我们前面已经讲过在进行高位加法时将这个CY加进去例如做2个16进制数相加1067H+10A0H先做67H+A0H=107H而107H显然超过了0FFH因此最终保存在A中的是7而1则进到了PSW中的CY位去了换言之CY位就相当于是100H然后再做10H+10H+CY结果是21H所以最终的结果是2107H3带借位的减法指令1SUBBARn2SUBBA@Rn3SUBBAdirect4SUBBA#data指令说明没有不带借位的减法指令如果需要做不带借位的减法指令在做第一次相减时只要将CY清零即可4乘法指令1MULAB芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153743指令说明此指令的功能是将A和B中的两个8位无符号数相乘两数相乘结果一般比较大因此最终结果用1个16位数来表达其中高8位放在B中低8位放在A中在乘积大于FFFFFH65535时PSW的0V位置1溢出否则OV为0而CY位总是为0例A=4EHB=5DHMULAB乘积是1C56H所以在B中放的是1CH而A中放的则是56H5除法指令1DIVABA/B指令说明此指令的功能是将A中的8位无符号数除以B中的8位无符号数什么是无符号数简单的说就是没有负数的数也就是整数比如1231.
2,4.
5等等这样的数除法一般会出现小数但计算机中可没法直接表达小数它用的是我们小学生用的商和余数的概念如13/5其商是2余数是3除了以后商放在A中余数放在B中CY位和OV位都是0如果在做除法前B中的值是00H也就是除数为0那么0V=16加1指令1INCA例如A=20HINCAA=21H2INCRn例如R7=20HINCAR7=21H3INCdirect例如30H=20HINC30H30H=21H4INC@Ri例如5INCDPTR例如DPTR=20HINCDPTRDPTR=21H指令说明从结果上看INCA和ADDA#1差不多但INCA是单字节单周期指令而ADDA#1则是双字节双周期指令而且INCA不会影响PSW位如A=0FFHINCA后A=00H而CY依然保持不变如果是ADDA#1则A=00H而CY一定是1因此加1指令并不适合做加法事实上它主要是用来做计数地址增加等用途另外加法类指令都是以A为核心的其中一个数必须放在A中而运算结果也必须放在A中而加1类指令的对象则广泛得多可以是寄存器内存地址间址寻址的地址等等7减1指令1DECA例如A=20HDECAA=19H2DECRn例如R7=20HDECAR7=19H3DECdirect例如30H=20HDEC30H30H=19H4DEC@Ri例如指令说明既然加1指令可以用于计数定时地址等加1那么有加也必然有减所以减1指令的功能与加1指令类似这里就不多说了8十进制加法调整指令DAA这是一条对十进制加法进行调整的指令等下册用到时再介绍另外需要了解的是在算术运算类指令中除了加1和减1指令外其他的算术运算类指令都要把结果放到累加器A中这与数据传递类指令有所不同二逻辑运算类指令什么是逻辑运算相信大家不会陌生在数字电路中我们学过与门或门非门等在单片机中也有类似的运算那么它们是如何分类的呢接下来我们就来一一讲解先来看对累加器A的逻辑运算指令1对累加器A的逻辑运算指令1CLRA指令说明累加器A清零效果同MOVA#00H是一样的只不过它是单周期指令而MOVA#00H是双周期指令2CPLA芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153744指令说明将累加器A逐位取反相当于数字电路的非逻辑例如A=12HCPLA12H化为二进制是00010010逻辑取反后为11101101即A=EDH(3)RLA指令说明将累加器A的值逻辑左移例如A=12HRLA化为二进制为00010010逐位左移后为0010100即24H这里把第7位移到了第0第0位移到了第1位第1位移到了第2位其余的依次类推4RLCA指令说明加上进位位CY并逻辑左移例如CY=1A=12HRLCA加上进位位CY后100010010逻辑左移变为000100101即CY=0A=25H5RRA指令说明将累加器A中的值逻辑右移同RLA类似6RRCA指令说明加上进位位CY并逻辑右移同RLCA类似7SWAPA指令说明将A中的值的高低4位进行交换例如A=39HSWAPA之后A中的值就是93H怎么正好是这么前后交换呢因为这是一个十六进制数每1个十六进位数代表4个二进制数注意如果是这样的A=39D后面没加H执行SWAPA之后可不是A=93要将它化成二进制数再算39D化为二进制是10111也就是00010111高4位是0001低4位是0111交换后是01110001也就是71H即113D2两个寄存器之间的逻辑运算指令上面的指令都是针对累加器A的逻辑运算指令也就是说对一个寄存器的逻辑运算那么如果两个寄存器之间的逻辑运算又是怎么样的呢接着往下看1ANLA,RnA与Rn中的值按位与'结果送入A中ANLA,directA与direct中的值按位与'结果送入A中ANLA,@RiA与间址寻址单元@Ri中的值按位与'结果送入A中ANLA,#dataA与立即数data按位与'结果送入A中ANLdirect,Adirect中值与A中的值按位与'结果送入direct中ANLdirect,#datadirect中的值与立即数data按位与'结果送入direct中指令说明什么是逻辑与数字电路中我们已经学过就是F=A*B简记为全1出1有0出0如果忘了没关系找本书再看一下这里就不详细的阐述了例如71H和56H相与将两数写成二进制形式71H01110001和56H00100110逐位相与结果就是00100000即20H从上面的例子可以看出两个参与运算的值只要其中有一个位上是0则这位的结果就是0两个同是1结果才是1是不是符合逻辑与的结果知道了逻辑与指令的功能后逻辑或和逻辑异或的功能就很简单了逻辑或是逐位相或即有1出1全0出0例71H和56H相或结果就是77H而异或则是逐位异或即相同出0相异出1仍旧71H和56H相异或结果是57H两个寄存器之间的逻辑或以及逻辑异或的指令如下2ORLA,RnA与Rn中的值按位或'结果送入A中ORLA,directA与direct中的值按位或'结果送入A中ORLA,@RiA与间址寻址单元@Ri中的值按位或'结果送入A中ORLA,#dataA与立即数data按位或'结果送入A中ORLdirect,Adirect中值与A中的值按位或'结果送入direct中ORLdirect,#datadirect中的值与立即数data按位或'结果送入direct中3XRLA,RnA与Rn中的值按位异或'结果送入A中XRLA,directA与direct中的值按位异或'结果送入A中芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153745XRLA,@RiA与间址寻址单元@Ri中的值按位异或'结果送入A中XRLA,#dataA与立即数data按位异或'结果送入A中XRLdirect,Adirect中值与A中的值按位异或'结果送入direct中XRLdirect,#datadirect中的值与立即数data按位异或'结果送direct中连续好几节课将讲了许多的基本知识大家是不是又觉得有些枯燥和无聊了别急,接下来让我们轻松一下做一个实验来证明一下几节课所学的内容三LED灯流动的实验这是很经典的哦1实验程序ORG0000H;LJMPSTART;ORG30H;START:MOVSP,#5FH;MOVA,#80H;LOOP:MOVP1,A;RLA;LCALLDELAY;LJMPLOOP;DELAY:MOVR7,#255;D1:MOVR6,#255;D2:NOPNOPNOPNOPDJNZR6,D2;DJNZR7,D1;RET;END好久没做实验了大家还记得实验的步骤吗调试编译下载看到了什么有一个暗点在流动想象一下如果我们把P1.
0-1.
7的LED换成8只可控硅来控制霓虹灯是不是就有点实用价值了2程序分析前面的ORG0000HLJMPSTARTORG30H我们都讲过了从START开始MOVSP#5FH这叫初始化堆栈在本程序中有无此句无关紧要不过我们慢慢开始接触正规的编程我也就慢慢地给大家培养习惯吧MOVA#80H将80H这个数送到A中去干什么呢不知道往下看MOVP1A将A中的值送到P1端口去此时A中的值是80H所以送出去的也就是80H因此P1口的值是80H也就是二进制10000000对应P1.
7-P1.
0这8位我们应当知道此时P1.
7接的LED8是不亮的而其它的LED都是亮的所以就形成了一个暗点继续往下看RLA将A中的值进行左移算一下移之后的结果是什么对了是01H也就是二进制00000001这样应当是接在P1.
0上的LED1不亮了而其它的都亮了从现象上看就是暗点移到了后面然后是调用延时程序这里有一条指令NOP它是空操作指令也就是什么都不做用于短暂的延时其他的指令我们很熟悉了就是让这个暗点暗一会儿然后又跳转到LOOP处LJMPLOOP请大家计算一下下面该哪个灯不亮了对了应当是接在P1.
1上灯不亮了这样依次不断的循环就形成了暗点流动的现象3提几个要求继续实验1如何实现亮点流动2如何改变流动的方向芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537463如何实现几个灯的同时流动四指令练习结合前面所学习的知识自己进行练习请写出下列每条指令的执行结果并用DUG8051软件进行验证看结果是否正确MOVA#24HMOVR0#37HORLAR0XRLA#29HMOV35H#10HORL35H#29HMOVR0#35HANLA@R0五本课总结本课的主要内容是算术运算类指令和逻辑运算类指令在很多的教科书中都把它们归为一类可见它们之间还是有一定联系的大家可以自行找一下其中的规律这里再罗嗦一句学习单片机重在实践希望大家多多动手哦只有通过动手才能掌握课堂知识六第13课习题1算术运算类指令和逻辑运算类指令的区别在哪里2逻辑与逻辑或逻辑异或的运算结果是什么3什么是有符号数无符号数什么是整数什么是浮点数4计算一下68H+ADH的加法结果芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153747第十四课单片机的指令四一控制转移类指令控制转移类指令共有17条分为无条件转移指令条件转移指令和返回及调用指令三大类下面我们分别加以学习1无条件转移类指令1无条件绝对转移指令AJMPaddr112无条件长转移指令LJMPaddr163无条件相对转移指令SJMPrel在讲解上面这三条指令之前先来认识一下三个符号add11add16rel其中add11和add16表示外部ROM的16位和11位地址前面我们已经讲过单片机的外部ROM可以扩展到64Kadd16就表示64K程序存储器的任何地址换句话说LJMP指令可以跳转到程序的任何地方而add11则表示下一条指令的2K页面也就是说SJMP指令只能跳转到程序的2K范围之内rel表示8位的偏移量其范围是下一条指令第一字节的前128到后127个字节(即-128-+127)介绍完了三个符号再看上面的三条转移类指令如果要仔细分析的话它们之间其实区别很大但在初学时我们可以不理会这么多统统把它们理解成*JMP标号比如SJMPLOOP就是跳转到有LOOP标号处原则上所有用SJMP或AJMP的地方都可以用LJMP来替代因此在初学时需要跳转时可以全不采用LJMP代替下面再来看第4条跳转指令4无条件间接转移指令JMP@A+DPTR这条指令的用途也是跳转跳转到什么地方去呢这可不能由标号简单地决定了让我们从一个实际的例子入手吧MOVDPTR#TAB将TAB所代表的地址送入DPTRMOVAR0从R0中取数详见下面说明MOVB#2MULABA中的值乘2详见下面的说明JMPA@A+DPTR跳转TAB:AJMPS1跳转表格AJMPS2AJMPS3应用背景介绍在单片机开发中经常要用到键盘见下面的9个按键的键盘图我们的要求是当按下功能键AG时去完成不同的功能这用程序设计语言来表达的话就是按下不同的键去执行不同的程序段以完成不同的功能怎么样来实现这个功能呢看图前面的程序读入的是按键的值如按下A'键后获得的键值是0按下B'键后获得的值是1等等然后根据不同的值进行跳转如键值为0就转到S1处执行如键值为1就转到S2处执行到底如何来实现这一功能呢先从程序的下面看起是若干条AJMP语句这若干条AJMP语句最后在存储器中是这样存放的见图也就是每个AJMP语句都占用了两个存储器的空间并且是连续存放的而AJMPS1存放的地址是芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153748TAB到底TAB等于多少我们不需要知道把它留给汇编程序来算好了下面我们来看这段程序的执行过程第1条MOVDPTR#TAB执行完了之后DPTR中的值就是TAB第2条是MOVAR0我们假设R0是由按键处理程序获得的键值比如按下A键R0中的值是0按下B键R0中的值是1以此类推现在我们假设按下的是B键则执行完第2条指令后A中的值就是1并且按照我们的分析按下B后应当执行S2这段程序让我们来看一看是否是这样呢第3条第4条指令是将A中的值乘2即执行完第4条指令后A中的值是2下面就执行JMP@A+DPTR了现在DPTR中的值是TAB而A+DPTR后就是TAB+2因此执行完这条程序后将会跳到TAB+2这个地址处继续执行看一看在TAB+2这个地址里面放的是什么就是AJMPS2这条指令因此马上又执行AJMPS2这条指令程序将跳到S2处往下执行这与我们的要求相符合请大家自行分析按下键ACD之后的情况这样我们用JMP@A+DPTR这条指令就实现了按下一个键跳转到相应程序段去执行的这样一个要求再提一个问题为什么取得键值后要乘2呢如果例程下面的所有指令换成LJMP即LJMPS1,LJMPS2这段程序还能正确地执行吗如果不能应该怎么改条件转移类指令条件转移类指令就是在满足一定的条件后进行相对转移累加器为0转移指令JZrel累加器非0转移指令JNZrel第条指令的功能是如果(A)=0则转移否则顺序执行执行本指令的下一条指令转移到什么地方去呢如果按照传统的方法就要算偏移量很麻烦好在现在我们可以借助于机器汇编了因此这条指令我们可以这样理解JZ标号即转移到标号处下面举一个例子来加以说明MOVAR0JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFHL2:SJMPL2END在执行上面这段程序前如果R0中的值是0的话就转移到L1标号处执行因此最终的执行结果是R1中的值为0FFH而如果R0中的值不等于0则顺序执行也就是执行MOVR1#00H指令芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153749最终的执行结果是R1中的值等于0把这个例子中的JZ改成JNZ试试吧看看程序执行的结果是什么这里注意一点L1MOVR1#0FFH这条指令的位置不能大于-128到+127为什么我好象刚才讲过了比较转移指令ACJNEA#data,relBCJNEA,direct,relCCJNERn,#data,relDCJNE@Ri,#data,rel指令说明第1条指令的功能是将A中的值和立即数data比较如果两者相等就顺序执行如果不相等就转移同样地我们可以将rel理解成标号即CJNEA#data,标号这样利用这条指令我们就可以判断两数是否相等这在很多场合是非常有用的但有时还想知道两数比较之后哪个大哪个小本条指令也具有这样的功能如果两数不相等则CPU还会反映出哪个数大哪个数小这是用CY进位位来实现的如果前面的数A中的大则CY=0否则CY=1因此在程序转移后再次利用CY就可判断出A中的数比data大还是小了例如MOVA,R0CJNEA,#10H,L1MOVR1,#0FFHAJMPL3L1:JCL2MOVR1,#0AAHAJMPL3L2:MOVR1,#0FFHL3:SJMPL3上面的程序中有一条指令我们还没学过即JC这条指令的原型是JCrel,作用和上面的JZ类似但是它是判CY是0还是1进行转移如果CY=1则转移到JC后面的标号处执行如果CY=0则顺序执行分析一下上面的程序如果A=10H则顺序执行即R1=0如果A不等于10H则转到L1处继续执行在L1处再次进行判断如果A>10H则CY=1将顺序执行即执行MOVR1#0AAH指令而如果A10H则R1=0AAH如果R0<10H则R1=0FFH弄懂了这条指令其它的几条就类似了第2条是把A当中的值和直接地址中的值比较第3条则是将直接地址中的值和立即数比较第4条是将间址寻址得到的数和立即数比较这里就不解释了请大家自行分析一下下面给出几个相应的例子CJNEA,10H把A中的值和10H中的值比较注意和上题的区别CJNE10H#35H把10H中的值和35H中的值比较CJNE@R0,#35H把R0中的值作为地址从此地址中取数并和35H比较循环转移指令ADJNZRn,relBDJNZdirect,rel第条指令在前面的实验中已经有详细的分析这里就不解释了第条指令只是将Rn改成direct其它的也一样调用及返回指令在前面的实验中我们已用过了子程序只是我们并没有明确地介绍子程序是干什么用的为什么要用子程序呢举个例子我们数学老师布置了10道算术题经过观察每一道题中都包含一个5+2芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153750*3的运算我们可以有两种选择第一种选择每做一道题都把这个算式算一遍第二种选择我们可以先把这个结果算出来也就是21放在一边然后要用到这个算式时就将21代进去这两种方法哪种更好呢那就不必多言了吧设计程序时也是这样有时候一个功能会在程序的不同地方反复使用我们就可以把这个功能设计成一段程序每次需要用到这个功能时就调用一下这就是子程序的用途所在当然实际上子程序的作用还远不止这些后面我们还会更详细地讲解子程序的用法主程序调用了子程序子程序执行完之后必须再返回到主程序继续执行不能一去不回头那么回到什么地方呢就是回到调用子程序的下面一条指令处继续执行大家可以回去看一下前面的实验是不是这样做的1调用指令A长调用指令LCALLaddr16B短调用指令ACALLaddr11上面两条指令都是在主程序中调用子程序两者的区别大家结合前面的知识可以自己分析一下同样作为初学者我们可以不必加以区分也就是说可以用LCALL指令代替ACALL2返回指令A子程序返回RETB中断返回RETIRET用于子程序返回RETI用于中断程序返回这是有区别的可不能用错了至于什么是中断我们讲到中断时再来解释如何从子程序返回呢很简单就是执行RET指令看一下前面的实验4空操作指令所谓空操作就是什么事也不干停一个机器周期一般用作短时间的延时不要以为它没用其实作用还是不小的等你入门了就知道了二本课总结本课的内容是控制转移类指令这些指令在单片机中起着非常重要的作用请大家务必搞清楚它们的作用和功能三第14课习题1控制转移类指令分为几大类AJMPLJMPSJMP的区别是什么2什么是子程序3用实验仪编一段程序要求按一个键盘时LED1闪一秒按另一个按键后LED1闪0.
5秒芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153751第十五课单片机的指令五一位及位操作指令位操作指令也叫布尔操作指令什么是布尔指令它有什么用呢这个问题稍微有点复杂我只能给大家简单的介绍一下在MCS-51系列单片机中有一个功能很强的布尔处理器它实际上是一个独立的一位处理器它有一套专门处理布尔变量布尔变量也叫开关变量就是以位作为单位的运算和操作的指令子集以完成对布尔变量的传送运算转移控制等操作这个子集的指令就是布尔操作指令那么为什么要有这样的一套的指令系统它是如何操作的呢大家接着往下看1位寻址的概念为什么要位寻址呢单片机不是可以有多种寻址方式吗大家是否还记得我们第十三课做的那个流水灯实验用的就是位操作也就是对一盏灯的亮和灭进行控制而之前我们学的指令却全都是用字节来介绍的字节的移动加减法逻辑运算移位等等用字节来处理一些数学问题比如控制空调的温度电视机的音量等等非常直观可以直接用数值来表示可是如果用它来控制一个开关的打开或者合上一个灯的亮或者灭就有些不直接了比如我们前面课上的那个流水灯的实验我们把数值送往P1口之后并不能马上知道是哪个LED灭了而是要化成二进制后才能知道在工业控制中有很多场合需要处理这类单个的开关输出比如一个继电器的吸合或者释放一个指示灯的亮或者灭用字节来处理就显得有些麻烦了所以在51系列单片机中就特意引入了一个位处理机制那么位处理器有多少地址空间哪些特殊功能寄存器可以直接进行位寻址呢2可位寻址的特殊功能寄存器在89C51单片机中内部RAM的范围是00H-7FH之间其中可位寻址的低128位处于内部RAM的20H-2FH字节单元其位地址从00H-7FH看下面的表字节地址位地址2FH7FH7EH7DH7CH7BH7AH79H78H2EF77H76H75H74H73H72H71H70H2DH6FH6EH6DH6CH6BH6AH69H68H2CH67H66H65H64H63H62H61H60H2BH5FH5EH5DH5CH5BH5AH59H58H2AH57H56H55H54H53H52H51H50H29H4FH4EH4DH4CH4BH4AH49H48H28H47H46H45H44H43H42H41H40H27H3FH3EH3DH3CH3BH3AH39H38H26H37H36H35H34H33H32H31H30H25H2FH2EH2DH2CH2BH2AH29H28H24H27H26H25H24H23H22H21H20H23H1FH1EH1DH1CH1BH1AH19H18H22H17H16H15H14H13H12H11H10H21H0FH0EH0DH0CH0BH0AH09H08H20H07H06H05H04H03H02H01H00H在物理实体上它们与原来的以字节寻址的RAM及端口是完全一样的换句话说这些RAM单元及端口都可以有两种用法比如用28H.
5和45H是一样的除此之外从80H单元开始除了程序计数器PC和4个工作寄存器区外每8个字节还安排了21个特殊功能寄存器89C52有26个这些SFR都有一个共同的特点就是其字节地址均可被8整除大家回到前面看一下第九课的表格这些SFR都是具有位寻址功能的也就是说这些RAM单元的每一个位都可以直接用这个地址来对其直接进行操作了解了位操作的原理再来看位操作的指令芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537524位操作指令1位传送指令AMOVCbitBMOVbitC指令说明这两条指令的功能是实现进位位和其它位地址之间的数据传递这里bit就是位的意思例如MOVP1.
0,CY将CY中的状态送到P1.
0引脚上去如果是做算术运算我们就可以通过观察P1.
0端口知道现在CY是多少了再如MOVP1.
0,CY将P1.
0的状态送给CY2位清零指令ACLRCBCLRbit指令说明第1条指令使CY=0第2条指令使指定的位地址等于0例如CLRP1.
0使P1.
0为03位置1指令ASETBCBSETBbit指令说明第1条使CY=1第2条使指定的位地址等于1例如SETBP1.
0使P1.
0为14取反指令ACPLCBCPLbit指令说明第1条使CY等于原来的相反的值即由1变为0由0变为1第2条使指定位的值等于原来相反的值相当于做非运算例如CPLP1.
0以我们做过的实验为例如果原来灯是亮的则执行本指令后灯就灭了反之就是灯亮5位逻辑与指令AANLC,bitBANLC,/bit指令说明第1条CY位与指定的位地址的值相与结果送回CY第2条先将指定的位地址中的值取出后取反再和CY相与结果送回CY但需注意指定的位地址中的值本身并不发生变化例如ANLC,/P1.
0设执行本指令前CY=1P1.
0等于1灯灭则执行完本指令后CY=0而P1.
0仍等于1可用下列程序进行验证ORG0000HAJMPSTARTORG30HSTARTMOVSP#5FHMOVP1#0FFHSETBCANLC/P1.
0MOVP1.
1,C将做完的结果送P1.
1,结果应当是P1.
1上的灯亮而P1.
0上的灯还是亮6位逻辑或指令AORLCbitBORLbitC这两条指令的功能大家自行分析吧然后对照上面的例程自己编一个验证程序看看自己想得对不对7判CY条件转移指令AJCrel芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153753BJNCrel指令说明这两条指令叫做判CY转移指令第1条指令的功能是如果CY等于1就转移如果不等于1就顺序执行那么转移到什么地方去呢我们可以这样理解JC标号即如果等于1就转到标号处执行第2条指令则和第1条指令正好相反即如果CY=0就转移不等于0则顺序执行转移到什么地方我们同样可以这样理解JNC标号8判位变量转移指令AJBbit,relBJNBbit,rel指令说明第1条指令是如果指定的bit位中的值是1则转移否则就顺序执行转移到什么地方同样我们可以这样理解JBbit,标号第2条指令请大家自行分析一下9判位变量转移并将该位清零JBCbitrel指令说明这条指令同JBbitrel的区别在于判1转移的同时清除该位为什么要这样做呢以后我们会讲到接下来我们做一个这方面的实验二位操作指令实验1实验程序ORG0000H;LJMPSTART;ORG30H;START:MOVSP,#5FH;MOVP1,#0FFH;MOVP3,#0FFH;L1:JNBP3.
4,L2;P3.
4上接有一只按键它按下时P3.
4=0JNBP3.
5,L3;P3.
5上接有一只按键它按下时P3.
5=0LJMPL1;L2:MOVP1,#00H;LJMPL1;L3:MOVP1,#0FFH;LJMPL1;END.
2程序分析把上面的程序下载到实验板上看看有什么现象按下接在P3.
4上的按键P1口的灯全亮了松开或再按灯并不熄灭然后按下接在P3.
5上的按键灯就全灭了这像什么这不就是工业控制中经常用到的启动停止功能吗怎么做到的呢一开始将0FFH送入P3口这样P3口所有的引线都处于高电平然后执行L1如果P3.
4是高电平键没有按下则顺序执行JNBP3.
5,L3语句同样如果P3.
5是高电平键没有按下则顺序执行LJMPL1语句这样就不停地检测P3.
4和P3.
5如果有一次P3.
4上的按键按下去了则转移到L2执行MOVP1#00H使灯全亮然后又转去L1再次循环直到检测到P3.
5为0就转去L3执行MOVP1#0FFH使灯全灭再转去L1如此不断地循环就可以了这里提一个问题我们这个实验中控制的是一个字节既整个P1口如何来实现一位比如P1.
0的控制呢其实很简单只要把程序改一下就可以了程序如下ORG0000H;LJMPSTART;ORG30H;START:MOVSP,#5FH;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153754MOVP1,#0FFH;MOVP3,#0FFH;L1:JNBP3.
4,L2;P3.
4上接有一只按键它按下时P3.
4=0JNBP3.
5,L3;P3.
5上接有一只按键它按下时P3.
5=0LJMPL1;L2:CLRP1.
0;亮LED1LJMPL1;L3:SETBP1.
0;暗LED1LJMPL1;END尽管实际的程序还要考虑按键的去抖动问题但程序的基本结构和流程是实用的这样的程序就能完成我们对工业控制中一个继电器的控制目的怎么样如果现在让您用单片机控制一台电机的正反转应该没有问题了吧试试看最后提个问题能不能把本程序改用JB指令来写如果行的话该怎么写呢既然讲到了位操作指令就一定要讲讲位操作指令的写法在很多的程序中常常这样写程序CLR20H.
02CLRPSW.
7什么意思以PSW.
7为例大家还记得PSW是什么对了是程序状态字寄存器那么PSW.
7是什么意思呢其实说穿了很简单就是把PSW的第7位清零第7位是什么忘了也太没记性了是CY位回去翻翻这样一来CLR20H.
02也应该懂了吧三本课总结这一课我们讲述了位操作指令的编程方法事实上正是由于单片机有了位操作机制才使得其编程变得十分的简单和方便希望大家把这部分的内容搞清楚到本课为止单片机的指令已经全部讲完也许有些您已经记住了而有些可能还记不住或者说还不会使用没关系我们以后还会在具体的实验中再来讲解它们下一课我将向大家讲解单片机程序的设计方法这可是蛮重要的哦四第15课习题1位寻址与字节寻址的区别在哪里2单片机中哪些RAM和SFR是可以位寻址的3写一段程序使两个LED灯交替地亮或灭类似于工业控制中的正反转功能芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153755第十六课单片机程序设计方法程序设计是单片机开发最重要的工作程序设计就是利用单片机的指令系统根据应用系统即目标产品的要求编写单片机的应用程序其实我们前面已经开始这样做过了这一课我们不是讲如何来设计具体的程序而是教您设计单片机程序的基本方法不过在讲解之前还是有必要先了解一下单片机的程序设计语言一程序设计语言这里的语言与我们通常理解的语言是有区别的它指的是为开发单片机而设计的程序语言如果您没有学过程序设计可能不太明白我给大家简单解释一下您知道微软的VBVC吗VBVC就是为某些工程应用而设计的计算机程序语言通俗地讲它是一种设计工具只不过这种工具是用来设计计算机程序的要想设计单片机的程序当然也要有这样一种工具说设计语言更确切些单片机的设计语言基本上有三类1完全面向机器的机器语言机器语言就是能被单片机直接识别和执行的语言计算机能识别什么以前我们讲过--是数字0或1所以机器语言就是用一连串的0或1来表示的数字比如MOVA40H用机器语言来表示就是111001010100000很显然用机器语言来编写单片机的程序不太方便也不好记忆我们必须想办法用更好的语言来编写单片机的程序于是就有了专门为单片机开发而设计的语言2汇编语言汇编语言也叫符号化语言它使用助记符来代替二进制的0和1比如刚才的MOVA40H就是汇编语言指令显然用汇编语言写成的程序比机器语言好学也好记所以单片机的指令普遍采用汇编指令来编写用汇编语言写成的程序我们就叫它源程序或源代码可是计算机不能识别和执行用汇编语言写成的程序啊怎么办当然有办法我们可以通过翻译把源代码译成机器语言这个过程就叫做汇编汇编工作现在都是由计算机借助汇编程序自动完成的不过在很早以前它是靠手工来做的道听途说我也没经历过呵呵值得注意的是汇编语言也是面向机器的它仍是一种低级语言每一类计算机都有它自己的汇编语言比如51系列有它的汇编语言PIC系列也有它的汇编语言微机也有它自己的汇编语言它们的指令系统是各不相同的也就是说不同的单片机有不同的指令系统它们之间是不通用的这就是为什么世界上有很多单片机类型的缘故了为了解决这个问题人们想了很多的办法设计了许多的高级计算机语言而现在最适合单片机编程的要数C语言3C语言—高级单片机语言C语言是一种通用的计算机程序设计语言它既可以用来编写通用计算机的系统程序也可以用来编写一般的应用程序由于它具有直接操作计算机硬件的功能所以非常适合用来编写单片机的程序与其他的计算机高级程序设计语言相比它具有以下的特点1语言规模小使用简单在现有的计算机设计程序中C语言的规模是最小的ANSIC标准的C语言一共只有32个关键字9种控制语句然而它的书写形式却比较灵活表达方式简洁使用简单的方法就可以构造出相当复杂的数据类型和程序结构2可以直接操作计算机硬件C语言能够直接访问单片机的物理空间地址KEILC51软件中的C51编译器更具有直接操作51单片机内部存储器和I/O口的能力亦可直接访问片内或片外存储器还可以进行各种位操作3表达能力强表达方式灵活C语言有丰富的数据结构类型可以采用整型实型字符型数组类型指针类型结构类型联合类型枚举类型等多种数据类型来实现各种复杂数据结构的运算利用C语言提供的多种运算符我们可以组成各种表达式还可以采用多种方法来获得表达式的值从而使程序设计具有更大的灵活性芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537564可进行结构化设计结构化程序是单片机程序设计的组成部分C语言中的函数相当于汇编语言中的子程序KEILC51的编译器提供了一个函数库其中包含有许多标准函数如各种数学函数标准输入输出函数等此外还可以根据用户需要编制满足某种特殊需要的自定义函数C语言程序就是由许多个函数组成的一个函数即相当于一个程序模块所以C语言可以很容易地进行结构化程序设计5可移植性前面我们讲过由于单片机的结构不同所以不同类型的单片机就要用不同的汇编语言来编写程序而C语言则不同它是通过汇编来得到可执行代码的所以不同的机器上有80%的代码是公用的一般只要对程序稍加修改甚至不加修改就可以方便地把代码移植到另一种单片机中这对于已经掌握了一种单片机的编程原理又想用另一种单片机的人来说可以大大地缩短学习周期我们将在教程的下册中专门来讲解C语言的应用及其编程原理不过作为单片机初学者想要学会C语言也并不是一件容易的事因此对于大多数人来说汇编语言仍是编写单片机程序的主要语言我们上册的教程将全部以汇编语言来编写单片机的程序了解了单片机编程的设计语言下面我们来看单片机编程的基本过程和步骤二单片机程序设计的步骤单片机的程序设计通常包括根据任务绘制程序流程图编写程序及汇编等几个步骤1绘制流程图所谓流程图就是用各种符号图形箭头把程序的流向及过程用图形表示出来绘制流程图是单片机程序编写前最重要的工作通常我们的程序就是根据流程图的指向采用适当的指令来编写的下面的图形和箭头就是我们绘制流程图用的工具图中左边所示绘制流程图时首先画出简单的功能流程图粗框图再对功能流程图进行扩充和具体化即对存储器标志位等单元做具体的分配和说明把功能图上的每一个粗框图转化为具体的存储器或地址单元从而绘制出详细的程序流程图即细框图下面举个例子给大家演示一下请看下面的程序主程序LOOP:SETBP1.
0LCALLDELAYCLRP1.
0LCALLDELAYLJMPLOOP子程序DELAYMOVR7#250D1MOVR6#250芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153757D2DJNZR6D2DJNZR7D1RETEND还记得吗这是我们第四课中做过的LED灯闪烁的实验以前我们曾对程序进行过分析现在让我们用流程图来把这段程序的主程序部分画出来看上图的右边部分这就是程序的流程图在单片机的编程过程中绘制流程图能看清楚程序执行的步骤以及程序的流向事实上程序的编写就是根据流程图的功能完成的下面我们来把第十五课中的那个程序也用流程图画出来程序如下ORG0000HLJMPSTARTORG30HSTARTMOVSP#5FHMOVP1#0FFHMOVP3#0FFHL1JNBP3.
5L2P3.
5上接有一只按键它按下时P3.
5=0JNBP3.
6L3P3.
6上接有一只按键它按下时P3.
6=0LJMPL1L2CLRP1.
0亮LED1LJMPL1L3SETBP1.
0暗LED1LJMPL1END先不看图自己画一下看是不是同我画的一样在实际的程序设计中根据框图采用适当的指令编写出实现流程图的源程序就是我们编写程序的最后工作2编写程序和汇编程序编写完之后我们要把它汇编成机器语言这种机器语言就是十六进制文件后缀名为*.
HEX文件以前还要把它转换成二进制文件后缀名为*.
BIN文件不过现在的编程器都能直接读入十六进制文件就不需要转换了最后用编程器把程序写入单片机这些以前都讲过了这里就不重复了下面来讲本课的主题—程序设计的方法三单片机程序设计的方法要想搞清楚程序设计的方法我们首先要知道单片机到底有哪几类程序单片机的程序分为结构芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153758化程序子程序和综合程序三个大类先来看结构化程序1结构化程序的设计方法在单片机的程序中既有复杂的程序也有简单的程序但不论哪种程序它们都是由一个个基本的程序结构组成的这些基本结构有顺序结构分支结构和循环结构1顺序结构程序的设计顺序结构的程序一般用来处理比较简单的算术或逻辑问题它的执行过程是按照程序存储器PC自动加1的顺序执行的主要用数据传递类指令和数据运算类指令来实现比如我们前面第六课中的I/O口输入实验就是典型的顺序结构的程序试试看把这个程序的流程图写出来下面再看一个例子将内部RAM中20H单元和30H单元的无符号数相加存入R0高位和R1低位中先画出流程图根据流程图编写源代码如下MOVA20HADDA30HMOVR0ACLRAADDCA#00HMOVR0AMOVA30HADDAR1MOVR1ACLRAADDCAR0MOVR0A这就是顺序结构程序程序的原理就不分析了我们接着讲分支结构的程序设计这里说明一点最近有朋友提出这一课的有些程序看不懂的确如此这一课的有几个程序实例芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153759我们从来没有学过之所以放在这里原本是为了让大家理解程序设计的方法举几个示例证明一下没想到反而增加了大家的难度其实这些示例你不需要刻意的去理解它只要明白它的设计方法就可以了因为这一课的主要内容是程序设计的方法而不是程序执行的原理和结果如果以后有更好的示例我会修改一下2分支结构程序的设计所谓分支结构就是利用条件转移指令使程序执行某一指令后根据所给的条件是否满足来改变程序执行的顺序也就是本条指令执行完后并不是象顺序结构那样执行下一条指令而是看本条指令所给的条件是否满足如果满足条件就跳转到其他的指令如果不满足就顺序执行当然也可以是满足条件顺序执行而不满足条件跳转执行看十五课实验程序中的下面两条L1JNBP3.
5L2P3.
5上接有一只按键它按下时P3.
5=0JNBP3.
6L3P3.
6上接有一只按键它按下时P3.
6=0这就是分支结构的程序如果P3.
5为0就转移反之就顺序执行当然也可以改成P3.
5=0顺序执行而P3.
5=1则转移不过此时的程序就要用JB指令了在51系列单片机中可以直接用于分支程序的指令有JBJNBJCJNCJZJNZCJNEJBC等这几条它们可以完成诸如正负判断大小判断和溢出判断等等在分支结构的指令设计中大家必须注意执行一条判断指令只可以形成两路分支如果要形成多路分支就必须进行多次判断也就是多条指令连续判断下面给大家举两个例子A单分支结构的程序实例假设有两个数在内部RAM单元的40H和41H中现在要求找出其中较大的一个数并将较大的数存入40H中而将较小的一个数存入41H中根据程序的要求我们先画出程序的流程图左图再根据流程图写出程序的源代码如下MOVA40HCLRCSUBBA41HJNCWAITMOVA41HXCHA41H芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153760MOV40HAWAITSJMPWAITEND程序的原理请大家自行分析一下接下来再举一个多分支结构的实例看下面的程序MOVA20H取数JZZEROA=0转移A=1顺序执行JBACC7STOREA为负数转移ADDA#3A为正数则加3SJMPSTOREZEROMOVA#20STOREMOV21HA自己画一下本例的流程图再和上面的右图比较一下看是不是一样这里有一条指令给大家解释一下JBACC.
3STOREACC.
3表示累加器A中的D3位这条指令的意思就是看一下累加器中的D3位是正还是负D3是什么呢在这里就是020H的二进制10000000上一课刚讲过不要说又忘了接下来再讲第三种循环结构的程序设计3循环结构程序的设计循环程序是最常用的程序结构形式在单片机的程序设计中有时要碰到一段程序需要重复执行多次的情况此时就要用到循环结构程序比如第四课中的实验--LED灯闪烁程序的子程序DELAYMOVR7#2501D1MOVR6#2502D2DJNZR6D23DJNZR7D14RET5END在这段程序中为了延时需要多次执行DJNZ指令此时若用循环结构程序就可以大大地简化程序的设计减少程序占用的存储器空间循环结构指令一般有以下四个部分组成A初始化部分初始化部分主要用来设置循环的初始值包括预值数计数器和数据指针的初值比如上例中的#250就是预值数初值B循环处理部分循环处理部分是程序的主体部分也称为程序体通过它可以完成程序处理的任务C循环控制部分循环控制部分可以控制程序循环的次数并修改预值数或计数器和指针的值检查该循环是否执行了足够的次数如果到了足够的次数就采用条件转移指令或判断指令来控制循环的结束比如上例中的34指令就是当R6或R7中的值为0时就转移C循环结束部分循环结束后必须返回一般用RET或RETI指令这里注意以上四个部分中第一和第四部分只能执行一次而第二和第三部分可以执行多次典型的循环结构程序的流程图可画成如下左图所示也可以将处理部分和控制部分位置对调如右图在循环程序设计中循环控制部分是程序设计的关键环节常用的循环控制方式有计数器控制和条件控制两种计数器控制就是把要循环的次数即预值数放入计数器中程序每循环一次计数器的值就减1一直到计数器的内容为零时循环结束一般用DJNZ指令而条件控制方式常预先不知道要循环的次数只知道循环的有关条件此时就可以根据给定的条件标志位来判断程序是否继续一般参照分支结构方法中的条件来判别指令并执行下面举几个例子来分别解释一下希望大家能以此类推芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153761程序一用计数器控制的单重循环程序源程序如下CLRAMOVR220HMOVR122HLOOPADDA@R1INCR1DJNZR2LOOPMOV21HA这段程序的作用是从22H单元开始存放一个数据块其长度存放在20H单元中将数据块求和要求将和存放入21H单元中和不超过255下面再举一个条件控制的循环程序程序二用条件控制的单重循环程序设字符串存放在内部RAM的21H开始的单元中以结束作标志要求计算出该字符串的长度并将其存放在20H单元中源程序如下CLRAMOVR0#21H将地址指针指向21H单元LOOPCJNZ@R0#24HNEXT与比较SJMPCOMP找到结束NEXTINCA不为0计数器加1INCR0修改地址指针SJMPLOOPCOMPMOV20HA存放结果试试看自己把上面两段程序的流程图画出来下面再看一个例子DELAYMOVR7#250D1MOVR6#250D2DJNZR6D2DJNZR7D1RETEND芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153762这是一段约125mS的延时程序现在我们来把它改成下面表格中的程序右边的程序DELAYMOVR7#250DELAYMOVR7#250D1MOVR6#250D1MOVR6#250D2DJNZR6D2D2MOVR5#250DJNZR7D1D3DJNZR5D3RETDJNZR6D2ENDDJNZR7D1RETEND从这里可以引出一个概念程序的嵌套什么是嵌套比如早上我骑自行车从家里到单位去上班当走到半路上时太太叫我去孩子学校拿点东西到了学校老师又叫我把学校的一台电脑修一下修好电脑一个朋友又打电话叫我去他那里拿了一本单片机与嵌入式系统杂志完了之后再去上班这就是生活中的嵌套在单片机的程序设计中也有类似的现象有时为了达到某个目的往往要在一段循环程序中再加入另一段循环程序这就是单片机的程序嵌套通常我们把一个循环体中不再包含循环的叫做单重嵌套如果一个循环体中还包括有循环则叫做多重嵌套上面的表格中左边的程序就是单重嵌套而右边的程序则是多重嵌套另外须注意在多重嵌套中不允许各个循环体互相交叉也不允许从外循环跳入内循环否则编译时会出错了解了结构化程序的设计下面再来看子程序的设计方法2子程序的设计方法什么是子程序如何设计子程序要解释这个问题让我们先同样从生活中的一个例子说起请看下面的数学题目28*33+65+47*33+65+875*33+65在这道题中我们一般是怎么算的也许大家都知道一般总是先把33+65=98代出来然后再用28+47+875*98来计算最后的结果为什么会这样这是因为在这道题中我们多次用到了33+65这个中间结果在单片机的程序设计中有时也有这样的情况比如下面的程序主程序LOOP:SETBP1.
0LCALLDELAYCLRP1.
0LCALLDELAYLJMPLOOP子程序DELAY:MOVR7,#250D1:MOVR6,#250D2:DJNZR6,D2DJNZR7,D1RETEND这是大家非常熟悉的LED灯延时程序在这段程序中两次调用到了DELAY这段程序为了简化程序的设计我们就把DELAY这段程序单独地列了出来这段列出的程序我们就叫它子程序而调用子程序的程序我们则叫它主程序LOOP的程序段在主程序执行时每当要用到子程序时我们就用LCALL指令来调用子程序子程序执行完之后必须返回主程序返回就用RET指令这我们以前都讲过了这里不再重复另外如果子程序执行的过程中还要再次调用其他的子程序这种现象我们就称它为子程序的嵌套看上面右边的图就是一个两层子程序的嵌套结构图这里有个问题在子程序的执行过程中有时可能要使用到累加器和某些工作寄存器而在调用子程序前这些寄存器中可能已经存放有主程序的中间结果它们在子程序返回后仍要使用这样就需芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153763要在进入子程序之前将要使用的累加器和寄存器中的内容预先转移到安全的地方保存起来这叫现场保护当子程序执行完即将返回主程序之前还要将这些内容先取出来送回到累加器和原来的工作寄存器中这个过程叫恢复现场保护现场和恢复现场通常使用堆栈即在进入子程序之前将需要保护的数据压入堆栈在返回之前再将压入的数据弹出到原来的工作单元中恢复原来的状态看下面的例子LOOPPUSH03H将03H单元中的值压入堆栈保护PUSHACC将累加器中的值压入堆栈保护POPACC将ACC中的值从堆栈弹出POP03H恢复03H单元中的内容RET从子程序返回由于堆栈的操作是后进先出先进后出所以编写指令时必须把后压入堆栈的数据先弹出来才能保证恢复到原来的状态在实际的程序设计中由于每个应用程序的不同还必须根据具体的情况来考虑是否需要保护哪些数据需要保护等等这就是单片机的堆栈为什么能够变化的原因关于堆栈的操作先讲这些后面的实验中我们还将结合具体的实验来分析接下来再看另一种程序--综合程序的设计方法3综合程序的设计方法综合程序有查表程序散转程序数据排序程序代码转换程序等等作为初学者要想全面的掌握也确实有一定的难度所以只给大家简单地提一下详细的内容就留到下则的课程中再来解释四本课总结程序设计是单片机开发最重要的工作掌握程序设计的基本步骤和方法对于单片机的软件编写是至关重要的这一课的内容较多对于一时无法搞清的部分大家可以结合以后的实际应用慢慢去理解不要急于求成千万记住一点学习使用单片机绝不是一朝一夕的事如果你不是天才想速成单片机我还是劝你赶紧改行五第16课习题1什么是单片机的程序设计语言2单片机的程序设计包括哪几个步骤3画出单片机的流程图符号并简述它的作用4单片机的分支结构程序指令有哪几条5什么是单片机的程序嵌套想想生活中还有哪些现象与单片机的嵌套类似芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153764第十七课单片机的定时/计数器通过前面十几节课的学习我们已经掌握了很多的单片机知识也许您已经可以用它来开发具体的产品了不过在有些工业及民用控制中我们往往需要定时检测某个参数或按一定的时间间隔来进行某项控制比如家里的闹钟定时电动机的Y/控制等等此时您就要用到定时器或计数器因此几乎所有的单片机系统内部都有几个定时/计数器89C51有两个16位的定时/计数器而89C52则有3个在了解这些定时/计数器之前让我们先来熟悉几个基本概念一几个基本概念1定时/计数的概念从选票的统计谈起画正这就是计数生活中计数的例子处处可见例线缆行业在电线生产出来之后要计米也就是测量长度怎么测量呢用尺量不现实太长不说要一边做一边量怎么办呢行业中有很巧妙的方法用一个周长是1米的轮子将电缆绕在上面一周由线带动轮子转这样轮子转一周不就是线长1米嘛所以只要记下轮子转了多少圈就可以知道走过的线有多少米了2计数器的容量从生活中的一个例子看起一个水盆在水龙头下水龙没关紧水一滴一滴地滴入盆中水滴不断落下盆的容量是有限的过一段时间之后水就会逐渐变满换句话说计数是有容量的那么单片机中的计数器有多大的容量呢89C51的两个计数器分别称之为T0和T1这两个计数器都是由两个8位的RAM单元组成的即每个计数器都是16位的计数器最大的计数容量是216=65536记住是从0-65535因为在计算机中往往把0作为起始点比如P0P1.
0T0等等3定时器的原理单片机中的计数器除了可以作为计数用还可以用作定时器定时器的用途当然很大如闹钟的定时手机的定时开关机等等那么计数器是如何作为定时器来用的呢一个闹钟如果我们将它定时在1个小时后闹响就相当于秒针走了3600次在这里时间就转化成为了秒针走的次数可见计数的次数和时间之间的确有关那么单片机的定时/计数器是怎么回事呢请看下面的图从图中我们可以得出这样的结论只要计数脉冲的间隔相等那么计数值就代表了时间的流逝其实单片机中的定时器和计数器是一个东西只不过计数器记录的是外界发生的事情而定时器则是由单片机提供一个非常稳定的计数源然后把计数源的计数次数转化为定时器的时间图中的C/T开关就是起这个作用的那么提供给定时器的计数源又是从哪里来的呢继续看上面的图原来它就是由芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153765单片机的晶振经过12分频后获得的一个脉冲源我们知道晶振的频率是很准的所以这个计数脉冲的时间间隔当然也很准这里提个问题一个12M的晶振它提供给计数器的脉冲时间间隔是多少呢不知大家是否还记得那就是1us也就是1个微秒4溢出的原理继续让我们看水滴的例子当盆中的水不断落下最终会有一滴水使得盆中的水变满这时如果再有一滴水落下就会发生什么现象水会溢出来用个单片机的术语叫溢出水溢出是流到地上而计数器溢出后会使得TF0由0变为1至于TF0是什么我们稍后再谈一旦TF0由0变为1就是发生了变化发生了变化就会引发事件就象闹钟的定时时间一到铃声就会响一样那么单片机的溢出会引发什么事件呢我们下节课再具体介绍这里我们来研究另一个问题要有多少个计数脉冲才会使TF0由0变为15任意定时及计数的方法刚才已经讲过51系列单片机的计数器是16位的也就是最大的计数值范围是0-65535因此计数器计到65536个脉冲就会产生溢出这个不是问题问题是我们在实际应用中经常会有少于65536个计数脉冲的要求如药品生产线上一箱为50瓶一瓶为100粒怎么样才能满足这个要求呢提示如果是一个空的盆要1万滴水滴进去才会满我们在开始滴水之前就预先放入一勺水还需要1万滴嘛单片机计数也是如此如果我要计5000个脉冲就先放进60535个再来5000个不就到了65535了吗定时器同样如此每个脉冲是1微秒则计满65536个脉冲需时65.
536毫秒但现在我只要10毫秒就可以了怎么办10个毫秒为10000微秒所以只要在计数器里预先放进55536就可以了这种计数方法我们把它称之为预置数计数法那么单片机的定时/计数器是由什么来控制的呢下面就来讨论这个问题二定时/计数器的方式控制字从上一节我们已经知道单片机中的定时/计数器可以有两种用途那么我们怎样才能让它们工作于我们所需要的用途呢这就需要通过定时/计数器的方式控制字实际上就是与定时/计数器有关的特殊功能寄存器来设置在单片机中有两个特殊功能寄存器与定时/计数器有关它们是TMOD和TCON顺便说一下TMOD和TCON是名称我们在写程序时既可以直接用这个名称来指定它们也可以直接用它们的地址89H和88H来指定它们其实用名称也就是直接用地址只不过汇编软件帮你翻译一下而已具体使用稍后讲现在先来看特殊功能寄存器TMOD的组成看下表1特殊功能寄存器TMOD89H用于T1用于T0GATEC/TM1M0GATEC/TM1M0从表中可以看出TMOD被分成两部份每部份4位分别用于控制T1和T0至于这里面是什么意思我们稍后介绍先看另一个与定时/计数器有关的特殊功能寄存器TCON2特殊功能寄存器TCON88H用于定时/计数器用于中断TF1TR1TF0TR0IE1IT1IE0IT0TCON也被分成两部份高4位用于定时/计数器低4位则用于中断我们暂时不管而TF0我们前面已提到了当计数溢出后TF0将由0变为1原来TF0在这儿那么TR0TR1又是什么呢看前面的图计数脉冲要想进入计数器还真不容易有层层关要通过最起码就是TR0要为1开关才能合上脉冲才能过来因此TR0我们称之为运行控制位当要使用T0时必须用指令SETB来置位以启动计数/定时器工作用指令CLR可关闭定时/计数器的工作这一切就在您的掌握中了知道了TF0和TR0TF1和TR1的作用也清楚了讲到这里我们还是没有讲清楚单片机定时/计数器是如何来工作的别着急接着往下看三定时/计数器的四种工作方式芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153766单片机的定时/计数器共有四种工作方式下面我们分别加以介绍1工作方式0定时/计数器的工作方式0称之为13位定时/计数器方式它由TL0/1的低5位和TH0/1的8位构成13位的计数器此时TL0/1的高3位未用请看各位的功能1M1M0定时/计数器一共有四种工作方式就是用TMOD的M1M0来控制的两位正好是4种组合2C/T前面我们说过定时/计数器既可作定时器用也可作计数器用到底作什么用由我们根据需要自行决定也说是决定权在我们编程者手中如果C/T=0就是用作定时器开关往上打如果C/T=1就用作计数器开关往下打顺便提一下一个定时/计数器同一时刻要么作定时用要么作计数用不能同时使用这一点请大家注意3GATE当我们选择了定时/计数器工作方式后定时/计数脉冲却不一定能到达计数器端中间还有一个开关很显然如果这个开关不合上计数脉冲就没法通过那么开关什么时候合上呢它有两种情况AGATE=0分析一下逻辑GATE非后是1进入或门或门总是输出1和或门的另一个输入端INT0中断0什么是中断先不去管它无关在这种情况下开关的打开合上只取决于TR0只要TR0=1开关就合上计数脉冲得以畅通无阻而如果TR0=0则开关打开计数脉冲无法通过因此定时/计数是否工作在这里只取决于TR0BGATE=1在这种情况下计数脉冲通路上的开关不仅要由TR0来控制而且还要受到INT0引脚的控制只有TR0=1且INT0也是高电平开关才能合上计数脉冲才得以通过那么为什么在这种模式下只用13位呢干吗不用16位这是为了和51的前辈48系列兼容而设的一种工作方式如果你觉得用起来不顺手那就干脆用工作方式1吧2工作方式1工作方式1是16位的定时/计数器方式将TMOD的M1M0设为01即可其它特性与工作方式0相同这里就不详细介绍了3工作方式2在介绍这种工作方式之前先让我们思考一个问题前面我们提到过任意计数及任意定时的问题比如我要计5000个数可是16位的计数器要计到65535才溢出怎么办呢我们讨论后得出的办法是采用预置数的办法--先在计数器里放上60535个再来5000个脉冲不就行了吗是的但是计满了之后我们又该怎么办呢要知道计数总是不断重复的流水线上计满后马上又要开始下一次计数下一次的计数还是5000吗当计满并溢出后计数器里面的值又变成了0为什么可以参考前面课程的说明因此下一次将要计满65535后才会溢出这可不符合要求怎么办当然办法很简单就是每次一溢出时执行一段程序这通常是需要的要不然要溢出干吗可以在这段程序中做把预置数60535送入计数器中的工作所以采用工作方式0或1都要在溢出后做一个重置预置数的工作做工作当然就得要时间一般来说这点时间不算什么可是有一些场合我们还是要计较的所以就有了工作方式2--自动再装入预置数的工作方式既然要自动装入预置数那么预置数就得放在一个地方要不然装什么呢那么预置数放在什么地方呢它放在T0或T1的高8位中那么这高8位不就不能参与计数了吗是的在工作方式2中只有低8位参与计数而高8位是不参与计数的用作预置数的存放这样计数范围就小了当然做任何事总是有代价的关键看值不值如果我根本不需要计那么多数那就可以用这种工作方式了看前面的图每当计数溢出就会打开T0或T1的高低8位之间的开关预置数就进入低8位当然这是由硬件自动完成的不需要我们去操心通常工作方式2用于波特率发生器我们将在下册的串行接口中讲解对于这种用途定时器就是为了提供一个时间基准计数溢出后不需做任何的事情要做的仅仅只有一件就是重新装入预置数再开始计数而且中间不能有任何的延迟可见这个任务用这种工作方式来完成是最妙不过了芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537674工作方式3在这种工作方式下T0被拆成2个独立的定时/计数器来用其中TL0可以构成8位的定时器或计数器工作方式而TH0则只能作为定时器用我们知道定时/计数器使用时需要有控制计满后溢出需要有溢出标记T0被分成两个来用那就要两套控制及溢出标记了从何而来呢TL0还是用原来的T0的标记而TH0则借用T1的标记如此一来T1不是无标记控制可用了吗是的在一般情况下只有在T1以工作方式2运行时才让T0工作于方式3四定时器/计数器的定时/计数范围那么单片机的这四种工作方式的计数范围是如何确定的呢1工作方式013位的定时/计数器工作方式因此最多可以计到2的13次方也就是8192次2工作方式116位的定时/计数器工作方式因此最多可以计到2的16次方也就是65536次3工作方式2和3工作方式2和工作方式3都是8位的定时/计数器工作方式因此最多可以计到2的8次方也说是256次预置值计算用最大计数量减去需要的计数次数即可例如流水线上一个包装是24盒要求每到24盒就产生一个动作用单片机的工作方式0来控制应当预置多大的值呢对了就是8192-24=8168以上是计数器的原理明白了这个道理定时器也一样前面的课程已经提到过就不再重复了请大家参考前面的例子自行分析本来想在这里做个实验可有的问题可能还解释不清楚所以等大家学完了下一课的中断后一块儿来实验吧请继续把下一课的内容看完五本课总结本课主要讲述了单片机的定时/计数器的原理和工作方式定时/计数器是单片机的重要组成部分如果您在用单片机开发产品时需要用到定时器或计数器那么本课的内容是必须掌握的所以希望大家能认真地看一下这一课的内容后面我们还会结合具体的实验来讲解它们的使用方法六第17课习题189C51中有几个定时/计数器它们的计数范围是多少2什么是单片机的溢出溢出后会产生什么现象3定时/计数器有关的两个SFR是什么它们的地址为什么4单片机有几种工作方式它们的定时/计数范围是多少芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153768第十八课单片机的中断系统由于不讲中断无法解释实验的某些结果所以就等这一课讲完了再一起做实验我们先来看单片机的中断系统原理单片机中断系统的目的是为了让CPU对内部或外部的突发事件及时地作出响应并执行相应的程序在单片机的开发中它有着十分重要的作用那么单片机的中断是怎么回事它是如何工作的呢这一课就来讨论这个问题在讲解之前让我们先来介绍一下中断的原理一中断的基本原理什么是中断中断的过程是什么要搞清楚这个问题我们同样先从生活中的一个例子开始你正在家中看书突然电话铃响了你放下书去接电话和来电话的人交谈通完电话回来继续看你的书这就是生活中的中断现象就是正常的工作过程被外部的事件打断了仔细研究一下生活中的中断对我们学习单片机中断会很有帮助第一中断源什么可引起中断生活中很多事件都可以引起中断比如有人按了门铃电话铃响了你的闹钟响了你烧的水开了等等诸如此类的事件我们把可以引起中断的事件称之为中断源单片机中也有一些可以引起中断的事件比如按下键盘定时/计数器溢出报警等等89C51单片机中共有5个中断源两个外部中断两个定时/计数器中断和一个串行口中断第二中断的嵌套与优先级处理设想一下我们正在看书电话铃响了同时又有人按了门铃你先做那样呢如果你正在等一个很重要的电话一般是不会去理会门铃的而反之如果你正在等一个很重要的客人则可能就不会去理会电话了如果两者都不是既不等电话也不等人上门你可能会按你通常的习惯去处理总之这里存在一个优先级的问题单片机中也是如此也有优先级的问题优先级的问题不仅仅发生在两个中断同时产生的情况也发生在一个中断已产生又有另一个中断产生的情况比如你正在接电话又有人按门铃的情况或者你正开门与人交谈又有电话响了的情况仔细想一下我们一般会怎么处理不会吧这样就有点手忙脚乱了要是再来个MM这么办呵呵第三中断的响应与处理当有事件产生进入中断之前我们必须先记住现在的书看到第几页了或拿一个书签放在当前页的位置然后去处理不同的事情因为处理完了我们还要回来继续看书电话铃响我们要到放电话的地方去门铃响了我们要到门那边去也就是说不同的中断我们要在不同的地点处理而这个地点通常还是固定的单片机中采用的也是这种方法五个中断源每个中断产生后都要到一个固定的地址去找处理这个中断的程序当然在去之前首先要保存下面将执行的指令的地址以便处理完中断后回到原来的地方继续往下执行程序具体地说单片机中断响应可以分为以下几个步骤1停止主程序运行当前指令执行完后立即终止现在执行的程序2保护断点把程序计数器PC的当前值压入堆栈保存终止的地址即断点地址以便从中断服务程序返回时能够继续执行该程序3寻找中断入口根据5个不同的中断源所产生的中断查找5个不同的入口地址4执行中断处理程序这就不讲了5中断返回执行完中断处理程序后就从中断处返回到主程序继续往下执行以上工作是由计算机自动完成的与编程者无关在这5个入口地址处存放有中断处理的程序这是程序编写时放在那儿的如果没把中断处理程序放在那儿可就错了因为中断程序无法被执行到那么执行中断程序有什么好处呢二实现中断的好处单片机为什么要有中断系统使用中断有什么好处呢日常生活中我们除了看书肯定还要做很多其他的事情比如听电话接待客人烧水吃饭等等单片机实行中断也有很多的好处具体来说1实行分时操作提高CPU的效率只有当服务对象向CPU发出中断申请时才去为它服务这样我们就可以利用中断功能同时为多个对象服务从而大大提高了CPU的工作效率2实现实时处理利用中断技术各个服务对象可以根据需要随时向CPU发出中断申请及时发现和处理中断请求并为芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153769之服务以满足实时控制的要求比如定时的时间到了就要CPU做相应的处理3进行故障处理对难以预料的情况或故障比如掉电事故等可以向CPU发出请求中断由CPU作出相应的处理那么单片机是如何实现中断处理的呢要了解这个问题就让我们先来看看单片机中断系统的内部结构三单片机中断系统的结构前面已经提到89C51单片机有5个中断源看下面的图这就是89C51单片机的中断系统内部结构图让我们一一来进行分析1中断源1外部中断即外中断0和外中断1经由外部引脚引入在单片机的硬件上有两个引脚12脚和13脚名称为INT0和INT1第二引脚功能P3.
2P3.
3在单片机的内部有一个特殊功能寄存器TCON其中有四位是与外中断有关的还记得TCON是什么吗对了是定时器控制寄存器请看下面的表用于定时/计数器用于中断TF1TR1TF0TR0IE1IT1IE0IT0AIT0中断0INT0的触发方式控制位可由软件进行置位和复位IT0=0中断0为低电平触发方式IT0=1中断0为负跳变触发方式这两种方式的差异讲起来有点复杂这里就不介绍了作为初学者只要知道就可以了BIE0中断0INT0的中断请求标志位当有外部的中断请求时该位就会置1在CPU响应中断后该位就自动清0注意这是由硬件自动完成的IT1IE1的用途和IT0IE0是类似的看上面的表2内部中断即定时器0T0和定时器1T1中断与外中断一样它也是由TCON中的四位控制的TF0定时器T0的溢出中断标记当T0计数器产生溢出时由硬件置位TF0当CPU响应芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153770中断后再由硬件将TF0自动清0TF1与TF0类似这里就不讲了3串行口中断负责串行口的发送接收中断具体内容我们到下册学习串行接口时再详细讲解下面我们再来讲另一个与中断有关的寄存器2中断允许寄存器IEA8H中断的允许或禁止是由片内可进行位什么是位大家可别到现在还说不知道哦寻址的8位中断允许寄存器IE来控制的允许中断我们把它称为中断开放不允许中断我们把它称为中断屏蔽如何操作说穿了其实很简单就是通过对IE的相应位的置1或请0就可以了请看下面的表格中断允许寄存器IEEAESET1EX1ET0EX01EA总中断允许开关它是个总开关凡是要设置中断都得先通过它EA=1开放所有的中断EA=0则所有中断都被禁止2ES串行口中断控制位ES=1允许中断ES=0禁止中断3ET1定时/计数器1中断控制位ET1=1允许中断ET1=0禁止中断4EX1外中断1中断控制位EX1=1允许中断EX1=0禁止中断5ET0定时器0中断控制位ET0=1允许中断ET0=0禁止中断6EX0外中断0中断控制位EX0=1允许中断EX0=0禁止中断例如我们现在要设置T1允许INT1允许其它不允许则IE应该是10001100即8CH也可以直接用位操作指令SETBEASETBET1SETBEX1来实现它看一下下面的表EAESET1EX1ET0EX010001100这里有一点请大家注意当复位CPU时IE将被全部清0了解了中断的设置让我们再来看另一个问题前面我们提到过中断有优先级和嵌套的问题那么中断的优先级和嵌套是如何来控制的呢接着往下看3中断源优先级寄存器IPD8H单片机执行中断的过程和生活中的中断有些类似它也有一个自然优先级与人工优先级的问题那么单片机是如何来设置它们的呢这就要用到中断优先级寄存器IP它也是一个可位寻址的8位寄存器现在让我们先来看五个中断源的自然优先级是如何设置的五个中断源的自然优先级由高到低的排列顺序为外中断0定时器0外中断1定时器1串口中断如果我们不对其进行设置单片机就按照此顺序不断的循环检查各个中断标志就像我们生活中按照习惯处理事物一样但有时我们需要人工设置高低优先级也就是说由编程者来设定哪些中断是高优先级哪些中断是低优先级当然由于只有两级所以必然只有一些中断处于优先级别而其他的中断则处于同一级别处于同一级别的中断顺序就由自然优先级来确定这一点请大家务必搞清楚了既然可以设定人工优先级那么它又是如何来设置的呢其实很简单我们只要把IP寄存器的对应位置1就可以了看下面的表PSPT1PX1PT0PX0串口T1INT1T0INT0开机时每个中断都处于低优先级我们可以用指令来对优先级进行设置例如现在有如下要求将T0INT1设为高优先级其它为低优先级求IP的值IP的首3位没用可任意取值设为000后面根据要求写00000110即IP=06H看下面的表PSPT1PX1PT0PX000000110这里有个问题如果5个中断请求同时发生时又会出现什么情况呢比如在上例中五个中断同时发生求中断响应的次序按照我们学到的内容响应次序应该为定时器0外中断1外中断0芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153771实时器1串行中断是不是符合我们刚才说的除了人工设置的高优先级外其余的均按照自然优先级来处理其实这很好理解如果我在家等待一个很重要的电话同时又有人来敲门或者烧的水开了当我放下电话后还是会按照一般的习惯去处理其他的事情比如先开门让客人进来再去处理烧开的水4串行口控制寄存器SCON98H用于串行口中断及控制我们留到下册中再详细解释下面讨论一下另一个问题四中断响应的条件和过程1中断响应的原理讲到这里我们依然对于单片机响应中断的过程感到神秘我们人响应外界的事件是因为我们有多种传感器――眼耳等可以接受不同的信息那么单片机是如何做到这点的呢其实说穿了一点也不稀奇单片机工作时在每个机器周期中都去查询一下各个中断标记看它们是否是1如果是1就说明有中断请求了所以所谓中断其实也就是查询只不过是每个周期都查一下而已这要换成人来说就相当于你在看书的时候每一秒钟都抬起头来看是不是有人按门铃了是否有电话来了烧的水是否开了很蠢是吗本来嘛计算机它根本就没人聪明了解了响应中断的原理就不难理解中断响应的条件了2中断响应的条件当有下列三种情况之一发生时CPU将封锁对中断的响应而是到下一个机器周期时再继续查询1CPU正在处理一个同级或更高级别的中断请求时2当前的指令没有执行完时我们知道单片机有单周期指令双周期指令三周期指令和四周期指令如果当前执行指令是单周期指令也许没关系如果是双周期或四周期指令那就要等整条指令都执行完了才能响应中断因为中断查询是在每个机器周期都可能查到的3当前正执行的指令是返回指令RET或RETI或访问IPIE寄存器的指令则CPU将至少再执行一条指令才能响应中断这些都是与中断有关的寄存器如果正访问IPIE则可能会出现开关中断或改变中断的优先级而中断返回指令则说明本次中断还没有处理完所以就要等本指令处理结束再执行一条指令才可以响应中断3中断响应的过程CPU响应中断时首先把当前指令的下一条指令就是中断返回后将要执行的指令的地址断点地址送入堆栈然后根据中断标记硬件执行跳转指令转到相应的中断源入口处执行中断服务程序当遇到RETI中断返回指令时返回到断点处继续执行程序这些工作都是由硬件自动来完成的那么中断入口的地址是如何来确定的呢在51系列单片机中五个中断源都有它们各自的中断入口地址请看下面1外中断0INT00003H2定时器0T0000BH3外中断1INT10013H4定时器1T1001BH5串口中断0023H讲到这里大家应该明白为什么我们前面的有些程序一开始是这样写的ORG0000HLJMPSTARTORG0030HSTART***************芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153772END其实这样写的目的就是为了让出中断源所占用的地址当然在程序中如果没有用到中断时直接从地址0000H开始写理论上不是不可以但在实际工作中最好不要这样做这里还有一个问题大家是否注意到每个中断向量地址只间隔了8个字节如0003H000BH在如此少的空间中如果完成不了中断程序又该这么办呢其实很简单您只要在中断处安排一条LJMP指令不就可以把中断服务程序跳转到任何地方去了吗所以一个完整的主程序看起来应该是这样的ORG0000HLJMPSTARTORG0003HLJMPAINT0转外中断0服务程序ORG000BHSTART*****主程序开始**********AINT0*****中断服务程序*****RETI从中断服务程序返回END中断程序处理完成后一定要执行一条RETI指令执行这条指令后CPU将会把堆栈中保存着的断点地址取出送回程序计数器PC中那么程序就会根据PC中的值从主程序的中断处继续往下执行了从CPU终止当前程序且转向另一程序这点看中断的过程很象子程序其实它们之间还是有区别的中断发生的时间是随机的而子程序调用则是按程序进行的所以它们的返回命令也是不一样的RET是用在返回子程序中的而RETI则用在返回中断处理程序中的这一点千万不能搞错了五本课总结本课主要讲述中断的工作原理和响应的过程以及如何来设置与中断有关的寄存器中断是单片机响应外界事件的重要组成部分与定时/计数器一样掌握它的工作原理对我们使用单片机开发产品是非常必需的六第18课习题151单片机有哪几个中断源它们的名称分别是什么2中断请求源是由哪些寄存器控制的3中断响应的过程是什么4简述RET和RETI的区别芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153773第十九课定时与中断实验一前面的两节课程我们连续的介绍了单片机定时/计数器和中断的原理及结构可能大家不是很理解这节课我们就来做几个实验验证一下前面所学的内容实验一利用定时器实现灯的闪烁在开始学单片机时我们所做的第一个实验就是LED灯的闪烁不过那是用延时程序做的现在回想起来这样做不是很恰当为什么呢因为我们的主程序做了灯的闪烁就不能再干其它的事情了难道单片机只能这样工作吗当然不是我们可以用定时器来完成灯的闪烁功能程序如下ORG0000H;AJMPSTART;ORG30H;START:MOVP1,#0FFH;关所有的灯MOVTMOD,#00000001B;定时/计数器0工作于方式1MOVTH0,#15H;MOVTL0,#0A0H;立即数15AH+0A0H=5536SETBTR0;定时/计数器0开始运行LOOP:JBCTF0,NEXT;如果TF0等于1则清TF0并转NEXT处此处可以加入其他的任何指令AJMPLOOP;否则跳转到LOOP处运行NEXT:CPLP1.
0;MOVTH0,#15H;MOVTL0,#0A0H;重置定时/计数器的初值AJMPLOOP;END把程序下载到实验板看到了什么灯开始闪烁了这可是用定时器做的不再是主程序的循环了简单分析一下程序为什么用JBC呢TF0是定时/计数器0的溢出标记位当定时器产生溢出后该位由0变1所以查询该位就可知道定时时间是否已到该位为1后要用软件将标记位清0以便下一次定时时间到了将该位由0变为1所以用了JBC指令该指令前面已经学过--判1转移的同时将该位清0以上程序可以实现灯的闪烁了可是主程序除了让灯闪烁外还是不能做其他的事啊不对我们可以在LOOPJBCTF0NEXT和AJMPLOOP指令之间插入一些指令来做其他的事情只要保证执行这些指令的执行时间少于定时时间就可以了当然这样的方法还不是最好所以我们常用下面的方法实现延时程序实验二利用中断方式实现灯的延时程序如下ORG0000H;AJMPSTART;ORG000BH;定时器0的中断向量地址AJMPTIME0;跳转到真正的定时器程序处ORG30H;START:MOVP1,#0FFH;关所有灯MOVTMOD,#01H;定时/计数器0工作于方式1芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153774MOVTH0,#15H;MOVTL0,#0A0H;立即数5536SETBEA;开总中断允许SETBET0;开定时/计数器0允许SETBTR0;定时/计数器0开始运行LOOP:AJMPLOOP;真正工作时这里可写任意程序TIME0:PUSHACC;将ACC推入堆栈保护PUSHPSW;将PSW推入堆栈保护CPLP1.
0;取反P1.
0MOVTH0,#15H;MOVTL0,#0A0H;重置定时常数POPPSW;POPACC;RETI;END上面的例子中定时时间一到TF0由0变1就会引发中断CPU将自动转至000BH处寻找程序并执行由于留给定时器中断的地址空间只有8个字节显然不足以写下所有的中断处理程序所以在ORG000BH后安排了一条长跳转指令转到实际处理中断的程序处这样中断程序可以写在任意地方也可以写任意长度了单片机进入定时中断后首先要保存当前的一些状态在这里程序只演示了保存ACC和PSW实际工作中应该根据需要将可能会改变的单元的值都推入堆栈进行保护本程序中实际不需保护任何值这里只作个演示这是一项很重要的工作因为CPU所做的自动保护工作是很有限的它只保护了一个地址就是中断返回后将要执行的指令的地址也叫断点地址而其它的所有东西都不保护所以如果你在主程序中用到了如ACCPSW等寄存器而在中断程序中又要用到它们还要保证回到主程序后这里面的数据还是没执行中断之前的数据就得自己把它们保护起来否则程序执行的结果就不是您想象的要求了上面的两个程序运行后我们发现灯的闪烁非常快根本分辨不出来只是视觉上感到有些晃动而已为什么呢我们可以计算一下定时器中预置的数是5536所以每计6000065536-5536个脉冲就是定时时间到这60000个脉冲的时间是多少呢我们的晶振是12兆的所以就是60000微秒即60毫秒因此速度是非常快的如果我想实现一个1秒的定时器该怎么办呢在该晶振频率下最长的定时也就是65.
536个毫秒啊请看第三个实验实验三延长定时时间的方法程序如下ORG0000H;AJMPSTART;ORG000BH;定时器0的中断向量地址AJMPTIME0;跳转到真正的定时器程序处ORG30H;START:MOVP1,#0FFH;关所有的灯MOV30H,#00H;软件计数器预清0MOVTMOD,#01H;定时/计数器0工作于方式1MOVTH0,#3CH;MOVTL0,#0B0H;立即数3CH+0BH=15536SETBEA;开总中断允许芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153775SETBET0;开定时/计数器0允许SETBTR0;定时/计数器0开始运行LOOP:AJMPLOOP;真正工作时,这里可写任意程序TIME0:PUSHACC;将ACC推入堆栈保护PUSHPSW;将PSW推入堆栈保护INC30H;MOVA,30H;CJNEA,#20,TIME1;30H单元中的值到了20了吗CPLP1.
0;到了取反P1.
0MOV30H,#0;清软件计数器TIME1:MOVTH0,#15H;给T0重新赋值MOVTL0,#9FH;重置定时常数POPPSW;POPACC;RETI;END先自己分析一下程序看看是怎么实现的这里采用了软件计数器的概念思路是这样的先用T0做一个50毫秒的定时器定时时间到了之后并不是立即取反P1.
0而是将软件计数器中的值加1如果软件计数器计到了20就取反一次P1.
0并清掉软件计数器中的值否则直接返回这样就变成了20次定时中断才取反一次P1.
0因此定时时间就延长了成了20*50mS即1000毫秒了这个思路在实际的工程应用中是非常有用的比如有时候我们需要若干个定时器可89C51中总共才有2个怎么办呢其实只要这几个定时器在时间上有一定的公约数我们就可以用软件定时器加以实现例如要实现P1.
0口所接灯按1S/次而P1.
1口所接灯按2S/次闪烁怎么实现呢我们可以用两个计数器一个在它计到20时取反一次P1.
0并清0如上面所示而另一个则计到40取反一次P1.
1然后清0不就行了吗看下面的实验实验四软件定时器的实现方法程序如下ORG0000H;AJMPSTART;ORG000BH;定时器0的中断向量地址AJMPTIME0;跳转到真正的定时器程序处ORG0030H;START:MOVP1,#0FFH;关所有的灯MOV30H,#00H;软件计数器预清0MOVTMOD,#01H;定时/计数器0工作于方式1MOVTH0,#3CH;MOVTL0,#0B0H;立即数15536SETBEA;开总中断允许SETBET0;开定时/计数器0允许SETBTR0;定时/计数器0开始运行LOOP:AJMPLOOP;真正工作时,这里可写任意程序TIME0:PUSHACC;将ACC推入堆栈保护PUSHPSW;将PSW推入堆栈保护芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153776INC30H;INC31H;两个计数器都加1MOVA,30H;CJNEA,#20,TNEXT;30H单元中的值到了20了吗CPLP1.
0;到了取反P1.
0MOV30H,#0;清软件计数器TNEXT:MOVA,31H;CJNEA,#40,TRET;31H单元中的值到40了吗CPLP1.
1;MOV31H,#0;到了取反P1.
1并清计数器返回TRET:MOVTH0,#15H;MOVTL0,#9FH;重置定时常数POPPSW;POPACC;RETI;END这就是软件定时器的用法试试看用软件定时器做一个交通信号灯的实验要求红灯亮2分钟黄灯亮1分钟绿灯亮3分钟然后红灯再亮2分钟黄灯再亮1分钟绿灯再亮3分钟不断的循环通过上面的几个实验大家对定时器的使用方法是不是有了一个初步认识接下来让我们共同来做一个更为有趣的实验用单片机做一个乐曲编奏器实验五可编程乐曲演奏器单片机用作乐曲编奏器的原理是通过控制定时器的定时时间来产生不同频率的方波驱动喇叭发出不同音阶的声音再利用延迟来控制发音时间的长短就能控制音调中的节拍编程时把乐谱中的音符和相应的节拍变换为定时常数和延迟常数把数据表格存放在存储器中由查表程序得到相应的定时常数和延迟常数分别用定时器控制产生方波的频率和发出该频率方波的持续时间当延迟时间到了之后再查下一个音符的定时常数和延迟常数依次进行下去就可自动演奏出悦耳动听的乐曲来程序如下ORG001BH;定时器T1的中断入口MOVTH1,R1;重装定时初值MOVTL1,R0;CPLP3.
7;P1.
0输出方波RETI;中断返回ORG100H;主程序START:MOVTMOD,#01H;定时器T1工作方式1MOVIE,#88H;允许T1中断MOVDPTR,#TAB;表格首地址LOOP:CLRA;MOVCA,@A+DPTR;查表MOVR1,A;定时器高8为存R1INCDPTR;CLRA;MOVCA,@A+DPTR;查表MOVR0,A;定时器低8为存R0ORLA,R1;JZNEXT0;全0为休止符芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153777MOVA,R0;ANLA,R1;CJNEA,#0FFH,NEXT;全1表示乐曲结束SJMPSTART;从头开始循环演奏NEXT:MOVTH1,R1;装入定时值MOVTL1,R0;SETBTR1;启动定时器SJMPNEXT1;NEXT0:CLRTR1;关闭定时器停止发音NEXT1:CLRA;INCDPTR;MOVCA,@A+DPTR;查延迟常数MOVR2,A;LOOP1:LCALLD200;调用延时200mS子程序DJNZR2,LOOP1;控制延迟次数INCDPTR;AJMPLOOP;处理下一个音符D200:MOVR4,#81H;延时20mS子程序D200B:MOVA,#0FFH;D200A:DECA;JNZD200A;DECR4;CJNER4,#00H,D200B;RET;TAB:DB0FEH,25H,02H,0FEH,25H,02H;DB0FEH,84H,02H,0FEH,84H,02H;DB0FEH,84H,04H,0FEH,25H,04H;DB0FEH,25H,02H,0FEH,84H,02H;DB0FEH,0C0H,04H,0FEH,0C0H,04H;DB0FEH,98H,02H,0FEH,84H,02H;DB0FEH,57H,08H,00H,00H,04H;DB0FFH,0FFH;END上述程序是歌曲新年好的一段简谱1=C111533311355432—如何来实现的呢单片机的晶振为12M则乐曲频率及定时常数三者之间的对应关系如下表所示C调音符5671234567频率Hz392440494524588660698784880988半周期mS1.
281.
141.
010.
950.
850.
760.
720.
640.
570.
51定时值FD80FDC6FE07FE25FE57FE84FE98FEC0FEE3FF01我们用定时器T1工作方式1来产生歌谱中各音符对应频率的方波由P3.
7输出驱动蜂鸣器节拍的控制通过调用延时子程序D200延时200mS的次数来实现以每拍800mS的节拍时间为例一拍需要调用D200子程序4次同样的道理半拍就需要调用2次由此就演奏出了上面的乐曲这里给大家讲明一点上面的程序是我从其他的单片机书籍上照搬过来的由于我对音乐实在是一窍不通所以上面的程序我也不知道是否正确还请大家自己分析一下如果有不对的地方请您多多包涵六本课总结本课主要介绍了定时/计数器的使用方法及编程技巧大家可以通过反复实验来加强和巩固上两节课所学的知识另外请您结合第十六课的内容把这几段程序的流程图画出来这就算是本课的习题吧芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153778第二十课定时与中断实验二前面我们用定时器和中断做了延时的实验现在再来看一看外部计数和外部中断的实验在实际的工程应用中计数器通常会有两种要求第一种将计数的值显示出来象录音机上的计数器汽车上的里程表等等第二种计数值到一定值后即中断报警如前面提到的生产线上的计数定长定量仪等等接下来我们先来做一个外部计数器的实验要将外部计数的值显示出来最好是用数码管可我们还没有讲到这一部份为了避免把问题复杂化我们用P1口的8个LED来显示计到的数据为了完成这个实验我们需要用到一套它的作用就是输出一个宽度为500mS的方波这套不在我们的实验板上为了节约大家的学习费用我特地做了几套供大家借用各位可以到我这儿来借免费使用不过请各位爱惜哦不要搞坏了有了这套就可以完成我们的实验了我们把的两根线分别连接到实验板的电源接口和单片机的15脚也就是T1的输入端实验的程序如下一计数器实验一程序如下ORG0000H;AJMPSTART;ORG0030H;START:MOVSP,#5FH;MOVTMOD,#40H;定时/计数器1作计数用T0不用全置0SETBTR1;启动T1开始运行LOOP:MOVA,TL0;MOVP1,A;AJMPLOOP;END运行这个程序看到了什么随着LED的闪烁实验板上的8个LED也在不断地变化注意观察是不是按二进制00000000000000010000001000000011这样的顺序在变呢对了这就是TL0中的数据不过这个实验还看不出什么名堂接着做第二个实验二计数器实验二程序如下ORG0000H;AJMPSTART;ORG001BH;AJMPTIMER1;定时器1的中断处理ORG0030H;START:MOVSP,#5FH;MOVTMOD,#40H;定时/计数器1作计数用工作方式1T0不用置0MOVTH1,#0FFH;MOVTL1,#0FAH;预置值每计到6个脉冲即为一个事件SETBEA;SETBET1;开总中断和定时器1中断允许SETBTR1;启动定时/计数器1开始运行AJMP$;TIMER1:PUSHACC;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153779PUSHPSW;CPLP1.
0;计数值到即取反P1.
0MOVTH1,#0FFH;MOVTL1,#0FAH;重置计数初值POPPSW;POPACC;RETI;END这段程序完成的工作其实很简单就是每6个计数脉冲到来后取反一次P1.
0因此实验的结果应当是15脚接的LED亮灭6次则P1.
0口所接的LED就亮或灭一次这就是我们对输入脉冲的计数也就是每6个计数产生一次中断这段程序中有一个符号以前没见过需要给大家解释一下AJMP$$我们称为标识符它的作用是指这条指令的开始处在这里其实就是循环执行AJMP$这条指令执行这么多次干什么实际上它是在等待中断的产生这两个实验需要如果您觉得做起来不大方便没关系我们接着来做第三个实验采用两个定时/计数器合用一个作为定时器用一个作为计数器用来实现P1.
1的延时这可以直接在我们的实验板上完成三两个定时/计数器合用的延时实验采用两个定时/计数器其中T0作为定时器用工作方式为方式1T1作为计数器用计数次数为1000次T0溢出时产生一个间隔为60mS的方波也就是让LED3各亮灭60mS然后把P1.
2的输出作为T1的计数脉冲T1计数溢出时满1000次取反一次P1.
1产生一个周期为2秒的方波即LED2每2秒闪烁一次程序如下ORG0000H;AJMPMAIN;ORG000BH;定时器T0的中断入口AJMPT_0;转T0中断服务程序ORG001BH;定时器T1的中断入口AJMPT_1;转T1中断服务程序ORG0030H;MAIN:MOVTMOD,#51H;T1为计数器方式1T0为定时器方式1MOVTH0,#15H;设置T0初值MOVTL0,#0A0H;MOVTH1,#0FCH;设置T1初值MOVTL1,#18H;MOVIE,#8AH;允许T0T1中断SETBTR0;启动定时器T0SETBTR1;启动定时器T1LL:SJMPLL;循环T_0:MOVTH0,#15H;给T0重新赋值MOVTL0,#0A0H;CPLP1.
2;定时到取反P1.
2RETI;T_1:MOVTH1,#0FCH;给T1重新赋值MOVTL1,#18H;CPLP1.
1;计数到取反P1.
1芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153780RETI;END把程序下载到单片机看到什么LED3在不断的闪烁这就是T0的作用闪烁的周期是多少请大家计算一下接下来把P1.
2也就是3脚和P3.
5也就是T1的输入端相连接是不是接在P1.
1上的LED2每2秒闪烁一次对了这就是T1作计数器的结果在这段程序里有一点请大家注意第四条—AJMPT_0,为什么要在T和0之间加上一条横线而不直接用T0呢原来在MCS—51系列单片机中是不能用T0T1INTRETIPPSW等等内部名称作为标号的如果这样做的话编译软件会出错这点我们好象很早以前曾经提到过接下来我们再来做一个外部中断的实验四外部中断实验程序如下ORG0000H;AJMPSTART;ORG0003H;外部中断0地址入口AJMPINTO;ORG30H;START:MOVSP,#5FH;MOVP1,#0FFH;灯全灭MOVP3,#0FFH;P3口置高电平SETBEA;SETBEX0;AJMP$;INTO:PUSHACC;PUSHPSW;CPLP1.
0;POPPSW;POPACC;RETI;END本程序的功能就是按一次按键S1接在P3.
2引脚上的就引发一次外部中断INT0=0取反一次P1.
0因此理论上按一下灯亮再按一下灯灭有点象我们工程应用中的自锁开关不过这段程序在实际的实验中可能会发觉有时不很灵按了它没反应但在大部份时候还是对的这是怎么回事呢其实这是因为按键没有作去抖动处理也就是说理论上我们是按了一次键但由于计算机的处理速度很快计算机实际上却认为已经按了好多次了如何来解决这个问题呢这就需要我们对按键作去抖动处理什么是按键的去抖动处理我们下一课讨论键盘接口时再作详细解释五本课总结通过这两节课的实验我们对定时/计数器和中断的使用方法已经有了一个基本的了解希望大家继续多做实验本来嘛学会单片机靠的就是不断的实践和总结芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153781第二十一课键盘接口与编程一键盘接口和数码管接口是构成单片机人机界面的主要方法对于一个初学者来说这部分的内容也是较难的我们将用四节课的时间来学习这方面的知识这一课先来讨论键盘的接口原理与编程方法键盘是单片机应用系统不可缺少的重要输入设备主要负责向计算机传递信息我们可以通过键盘向计算机输入各种指令地址和数据它一般由若干个按键组合成开关矩阵按照其接线方式的不同可分为两种一种是独立式接法一种是矩阵式接法如下面的图这一课先来讲解独立式键盘的工作原理和编程方法一独立式键盘的工作原理和编程方法独立式键盘具有结构简单使用灵活等特点因此被广泛应用于单片机系统中那么它是如何来工作的呢我们慢慢往下看1独立式键盘的接线原理独立式键盘是由若干个机械触点开关构成的把它与单片机的I/O口线连起来通过读I/O口的电平状态即可识别出相应的按键是否被按下下面的左图就是我们实验板的按键连接图如果按键不被按下其端口就为高电平如果相应的按键被按下则端口就变为低电平在这种键盘的连接方法中我们通常采用下拉电平接法即各按键开关一端接低电平另一端接单片机I/O口线如上左图所示这是为了保证在按键断开时各I/O口线有确定的高电平通常我们用来做键盘的按键有触点式和非触点式两种单片机中应用的一般是由机械触点构成的触点式微动开关这种开关具有结构简单使用可靠的优点但当我们按下按键或释放按键的时候它有一个特点就是会产生抖动看上图的按键脉冲波形这种抖动对于人来说是感觉不到的但对单片机来说则是完全可以感应到的因为单片机处理的速度是在微秒级的而机械抖动的时间至少是毫秒级对计算机而言这已是一个很漫长的过程了下面我们通过一个实验来验证一下实验程序如下ORG0000H;AJMPSTART;ORG0030H;START:MOVSP,5FH;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153782MOVP1,#0FFH;MOVP3,#0FFH;L1:JNBP3.
4,L2;按下按键开关取反一次P1.
0灯亮再按一下灯灭JNBP3.
5,L3;按下按键开关取反一次P1.
1灯亮再按一下灯灭LJMPL1;L2:CPLP1.
0;LJMPL1;L3:CPLP1.
1;LJMPL1;END把这个程序下载到单片机我们会发现当按下相应的按键时灯并不是想象中的按一下亮再按一下就灭而是有时灵有时不灵为什么会这样呢原来当你按了一次按键可是单片机却早已执行了好多次如果执行的次数正好是奇数次那么结果正如你所料如果执行的次数是偶数次那结果就不对了为了使CPU能正确地读出端口的状态对每一次按键只作一次响应就必须考虑如何去除按键的抖动2按键的去抖动原则和方法常用的去抖动的方法有两种硬件方法和软件方法硬件去抖动的方法很多好多书都有介绍这不在我们的讨论范围单片机中常用软件去抖动法软件法其实也很简单就是在单片机获得端口为低电平的信息后不是立即认定按键已被按下而是延时10毫秒或更长一些时间后再次检测该端口如果仍为低说明此键的确被按下了这实际上是避开了按键按下时的抖动时间而在检测到按键释放后端口为高电平时再延时5-10毫秒消除后沿的抖动然后再对按键进行处理不过一般情况下我们通常不对按键释放的后沿进行处理实践证明也能满足通常的要求下面我们把前面的程序改一下看看按键的去抖动是如何实现的看下面的程序ORG0000H;AJMPSTART;ORG0030H;START:MOVSP,#5FH;MOVP1,#0FFH;MOVP3,#0FFH;L1:JBP3.
4,L2;P3.
4为1不做处理转P3.
5否则说明有键按下LCALLD10mS;调用延时程序去除抖动JBP3.
4,L1;P3.
4为0说明此键确实被按下了CPLP1.
0;取反P1.
0L3:JNBP3.
4,L3;直到P3.
4释放后转去判断第二个键L2:JBP3.
5,L1;P3.
5为1返回去继续处理P3.
4否则说明有键按下LCALLD10mS;调用延时程序去除抖动JBP3.
5,L2;P3.
5为0说明此键确实被按下了CPLP1.
1;取反P1.
1L4:JNBP3.
5,L4;直到P3.
5释放为止LJMPL1;返回D10mS:MOVR7,#50;延时的时间一般为5-20mSD1:MOVR6,#100;D2:DJNZR6,D2;DJNZR7,D1;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153783RET;END把这段程序写入单片机试试看是不是行了这就是独立式按键去抖动的基本方法不过这个程序在实际应用中并没有多大的意义因为如果按键数量比较多的话程序就会变得很长为什么会这样呢因为这里我们采用了直接寻址的方式如果我们把键值放入一个表格中再通过查表程序来判断到底是哪个按键被按下了再去处理相应的程序就会很简单想想看该怎么做二独立式键盘的编程方法我们刚才的程序演示了按键的去抖动原理和基本方法接下来让我们做一个按键使用的实验来验证一下大家看附图的电路图我们的实验板上有4个按键分别接到了P3口的P3.
2,P3.
3,P3.
4,P3.
5引脚上现在我们用P3.
2,P3.
3,P3.
4和P3.
5这四个按键来做一个实验实验之前先定义各个按键的功能AP3.
2开始按此键则灯开始流动(由左向右)BP3.
3停止按此键则停止流动所有灯为灭CP3.
4向左按此键则灯反向流动由右向左DP3.
5向右按此键则灯正向流动由左向右实验程序如下UpDownEQU00H;上下行标志StartEndEQU01H;起动及停止标志LampCodeEQU21H;存放流动的数据代码ORG0000H;AJMPMAIN;ORG30H;MAIN:MOVSP,#5FH;MOVP1,#0FFH;CLRUpDown;启动时处于向上的状态CLRStartEnd;启动时处于停止状态MOVLampCode,#0FEH;单灯流动的代码LOOP:ACALLKEY;调用键盘程序JNBF0,LNEXT;如果无键按下则继续ACALLKEYPROC;否则调用键盘处理程序LNEXT:ACALLLAMP;调用灯显示程序AJMPLOOP;反复循环主程序到此结束DELAY:MOVR7,#100;D1:MOVR6,#100;DJNZR6,$;DJNZR7,D1;RET;延时程序键盘处理中调用KEYPROC:MOVA,B;从B寄存器中获取键值JBACC.
2,KeyStart;分析键的代码某位被按下则该位为"1"在键盘程序中已取反JBACC.
3,KeyOver;JBACC.
4,KeyUp;JBACC.
5,KeyDown;AJMPKEY_RET;KeyStart:SETBStartEnd;第一个键按下后的处理AJMPKEY_RET;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153784KeyOver:CLRStartEnd;第二个键按下后的处理AJMPKEY_RET;KeyUp:SETBUpDown;第三个键按下后的处理AJMPKEY_RET;KeyDown:CLRUpDown;第四个键按下后的处理KEY_RET:RET;KEY:CLRF0;清F0表示无键按下ORLP3,#01111000B;将P3口接有四个键的位置1MOVA,P3;取P3口的值ORLA,#10000111B;将其余四位也置1CPLA;取反JZK_RET;如果为0则无键按下ACALLDELAY;否则延时去键抖ORLP3,#01111000B;MOVA,P3;ORLA,#10000111B;CPLA;JZK_RET;MOVB,A;确实有键按下将键值存入B中SETBF0;设置有键按下的标志K_RET:ORLP3,#01111000B;此处循环等待键的释放MOVA,P3;ORLA,#10000111B;CPLA;JZK_RET1;直到读取的数据取反后为"0"说明键释放了才从键盘处理程序返回AJMPK_RET;K_RET1:RET;D500mS:;流水灯的延迟时间PUSHPSW;SETBRS0;MOVR7,#200;D51:MOVR6,#250;D52:NOPNOPNOPNOPDJNZR6,D52;DJNZR7,D51;POPPSW;RET;LAMP:JBStartEnd,LampStart;如果StartEnd=1则启动MOVP1,#0FFH;AJMPLAMPRET;否则关闭所有显示返回LampStart:JBUpDown,LAMPUP;如果UpDown=1则向上流动MOVA,LAMPCODE;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153785RLA;实际就是左移位MOVLAMPCODE,A;MOVP1,A;LCALLD500mS;AJMPLAMPRET;LAMPUP:MOVA,LAMPCODE;RRA;向下流动实际就是右移MOVLAMPCODE,A;MOVP1,A;LCALLD500mS;LAMPRET:RET;END这段程序是我们到目前为止最长的程序相信大多数指令大家应该能看懂开始三条UpDownEQU00HStartEndEQU01HLampCodeEQU21H给大家解释一下EQU叫做等值伪指令它的功能是将一个常数或者特定的符号赋予规定的字符串什么意思呢举个例子ORG200HABCEQUR6MOVAABC这里将ABC等值为寄存器R6也就是说在指令中R6这个寄存器可以用字符串ABC来代替为什么要这样写呢当然是为了增加程序的可读性不过有一点大家要记住了这里使用的字符串不是标号不能用来做分隔符比如这样写ABC:EQUR6如果加上汇编程序会出错当然用EQU指令除了可以赋值数据和地址外还可以赋值直接地址或者直接当作一个立即数来使用例如ABCEQU10HDELAYEQU05AFHMOVAABCLCALLDELAY这里ABC赋值以后被当作了直接地址使用而DELAY被赋值以后则成了一个16位的地址如此一来上面的三条指令也就很清楚了这里有一个问题大家需注意使用EQU伪指令必须先赋值后使用所以一般的程序都把赋值指令放在程序的开头部分既然讲到了赋值伪指令我们再讲一下另外三条赋值伪指令.
A位地址定义伪指令BIT它的功能是将一个可直接寻址的位地址赋予所规定的字符名称例如ABCBITP1.
0把P1.
0赋值给ABC即字符串ABC就是直接寻址位P1.
0这里注意与EQU不同的是这条指令只能对位地址赋值而不能对寄存器或直接地址和立即数赋值相反EQU指令却可以用来定义位地址变量不过这时所赋的值应当是具体的位地址值比如P1.
0要用90H来代替P2.
0要用AOH来代替等等B内部RAM定义伪指令DATA它的功能是给一个8位的内部RAM起一个名称例如ABCDATA20H把内部RAM的20H定义为ABCC外部RAM定义伪指令XDADT给一个8位的外部RAM起一个名称例如ABCXDATA0ACH由于89C51的内部RAM寻址范围为00H-FFH所以这个地址必然大于FFH讲了赋值伪指令再回到上面的按键处理程序这段程序的功能虽然很简单但它演示了一个键盘处理程序的基本思路程序本身很简单也不很实用实际工作中还会有好多要考虑的因素比如主循环每次都调用了灯的循环程序会造成按键反应迟钝而如果一直按着键不放则灯不会再流动芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153786一直要到松开手为止大家可以仔细考虑一下这些问题想想有什么好的解决办法独立式键盘除了上面介绍的这种连接方法我们还可以采用上图右边所示的连接方法用一个与非门把四个输入端连接起来当有任何一个按键按下时都会使与非门输出为低电平从而引起单片机的中断它的好处是不用在主程序中不断地循环查询了如果有键按下单片机就去作相应的处理具体的应用就不介绍了大家如果有兴趣的话可以自己找一些相关的资料看一下三本课总结这一课通过两个实验讲解了独立式键盘的工作原理和基本的去抖动方法由于键盘的实际使用是千差万别的所以工程中您还得根据实际情况灵活应用这里只能给大家一个基本的认识四第21课习题1什么是键盘的去抖动问题为什么要对键盘进行去抖动处理2找一个硬件的去抖动电路并自行分析其工作原理芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153787第二十二课键盘接口与编程二上一课我们讨论了独立式键盘的工作原理和编程方法这一课再来讲解矩阵式键盘的工作原理和编程方法一矩阵式键盘的连接方法和工作原理什么是矩阵式键盘当键盘中按键数量较多时为了减少I/O口线的占用通常将按键排列成矩阵形式如下图所示在矩阵式键盘中每条水平线和垂直线在交叉处不直接连通而是通过一个按键加以连接这样做有什么好处呢大家看下面的电路图一个并行口可以构成4*4=16个按键比之直接将端口线用于键盘多出了一倍而且线数越多区别就越明显比如再多加一条线就可以构成20键的键盘而直接用端口线则只能多出一个键9键由此可见在需要的按键数量比较多时采用矩阵法来连接键盘是非常合理的矩阵式结构的键盘显然比独立式键盘复杂一些识别也要复杂一些在上图中列线通过电阻接电源并将行线所接的单片机4个I/O口作为输出端而列线所接的I/O口则作为输入端这样当按键没有被按下时所有的输出端都是高电平代表无键按下行线输出是低电平一旦有键按下则输入线就会被拉低这样通过读入输入线的状态就可得知是否有键按下了具体的识别及编程方法如下所述二矩阵式键盘的按键识别方法确定矩阵式键盘上任何一个键被按下通常采用行扫描法或者行反转法行扫描法又称为逐行或列扫描查询法它是一种最常用的多按键识别方法因此我们就以行扫描法为例介绍矩阵式键盘的工作原理芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537881判断键盘中有无键按下将全部行线X0-X3置低电平然后检测列线的状态只要有一列的电平为低则表示键盘中有键被按下而且闭合的键位于低电平线与4根行线相交叉的4个按键之中若所有列线均为高电平则表示键盘中无键按下2判断闭合键所在的位置在确认有键按下后即可进入确定具体闭合键的过程其方法是依次将行线置为低电平即在置某根行线为低电平时其它线为高电平当确定某根行线为低电平后再逐行检测各列线的电平状态若某列为低则该列线与置为低电平的行线交叉处的按键就是闭合的按键下面给出一个具体的例子单片机的P1口用作键盘I/O口键盘的列线接到P1口的低4位键盘的行线接到P1口的高4位也就是把列线P1.
0-P1.
3分别接4个上拉电阻到电源把行线P1.
4-P1.
7设置为输出线4根行线和4根列线形成16个相交点如上图所示检测当前是否有键被按下检测的方法是P1.
4-P1.
7输出全0读取P1.
0-P1.
3的状态若P1.
0-P1.
3为全1则说明无键闭合否则有键闭合去除键抖动当检测到有键按下后延时一段时间再做下一次的检测判断若仍有键按下应识别出是哪一个键闭合方法是对键盘的行线进行扫描P1.
4-P1.
7按下述4种组合依次输出P1.
7-1110P1.
6-1101P1.
5-1011P1.
4-0111在每组行输出时读取P1.
0-P1.
3若全为1则表示为0一行的没有键闭合否则就是有键闭合由此得到闭合键的行值和列值然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值为了保证按键每闭合一次CPU仅作一次处理必须去除键释放时的抖动看下面的实例三矩阵式键盘的实验程序ORG0030H;SCANMOVP1,#0FH;MOVA,P1;ANLA,#0FH;CJNEA,#0FH,NEXT1;SJMPNEXT3;NEXT1:ACALLD20Ms;MOVA,#0EFH;NEXT2:MOVR1,A;MOVP1,A;MOVA,P1;ANLA,#0FH;CJNEA,#0FH,KCODE;MOVA,R1;SETBC;RLCA;JCNEXT2;NEXT3:MOVR0,#00H;RET;KCODE:MOVB,#0FBH;NEXT4:RRCA;INCB;JCNEXT4;MOVA,R1;芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153789SWAPA;NEXT5:RRCA;INCB;JCNEXT5;NEXT6:MOVA,P1;ANLA,#0FH;CJNEA,#0FH,NEXT6;MOVR0,#0FFH;RET;END由于我们的实验设备不能做这个实验所以上面的程序只能请大家自行分析一下事实上开发多键盘的应用系统是非常复杂的为了不增加大家的学习难度这里只给大家讲一个基本的概念您只要稍微了解一下就可以了详细的内容我们将留到下册中再来仔细地讨论如果你确实在实际的应用中碰到了这样的问题可以电话或者E-mail与我联系我会尽力的帮助你大家四本课总结事实上在比较复杂的单片机系统中键盘的的设计只是程序设计的一部分在这种系统中还会有很多的其他程序设计这种系统也是一项非常复杂的工作作为初学者我们对此有所了解就已经可以了若您想尽快的掌握这方面的知识请继续学习教程的下册部分五第22课习题1矩阵式键盘采用什么样的扫描方式2识别矩阵式键盘包括哪几个步骤芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153790第二十三课数码管接口与编程一如果说键盘构成的是单片机的输入系统那么数码管就是单片机的输出系统和学会使用键盘接口一样学会数码管的接口与编程对单片机的开发同样有着十分重要的意义这一课我们就来讲解数码管的接口与编程方法一LED数码显示器的连接与显示方法在单片机系统中通常用LED数码显示器来显示各种数字或符号由于它具有显示清晰亮度高使用电压低寿命长的特点因此使用非常广泛那么数码管是如何工作的呢我们学习数字电路时讲过可能大家都忘得差不多了这里我再从头给大家讲一遍您可不要觉得我烦哦还记得我们小时候玩过的火柴棒游戏吗几根火柴棒组合起来可以拼成各种各样的图形LED显示器实际上就是利用这个原理做成的八段LED显示器由8个发光二极管组成其中7个长条形的发光管排列成一个日字形另一个圆点形的发光管在显示器的右下角作为显示小数点用它能显示各种数字及部份英文字母LED显示器有两种不同的连接形式一种是8个发光二极管的正极连在一起称之为共阳极LED显示器另一种是8个发光二极管的负极连在一起称之为共阴极LED显示器它们的内部电路图如下所示勘误图中有一点点小错误把H端漏了由于这是用CAD14画的现在改起来不方便请大家注意一下由图可以看出共阳和共阴结构的LED显示器各笔划段名的安排位置是相同的当二极管导通时相应的笔划段就发亮由发亮的笔划段组合而显示出各种字符八个笔划段h在许多书中用dp来表示其实是一个意思gfedcba对应于一个字节8位的D7D6D5D4D3D2D1D0,于是用8位二进制码就可以表示欲显示字符的字形代码例如对于共阴LED显示器当公共阴极接地零电平阳极hgfedcba各段为01110011时显示器就显示P字符即P"字符的字形码是73H而如果是共阳极LED显示器公共阳极接高电平显示P"字符的字形代码应为100011008CH这里必须注意的是很多产品为了方便接线常常不按照规则的方法去对应字段与位的关系这时字形码就必须根据接线来自行设计了后面我们会给出一个例子让大家参考那么数码管和单片机又是如何连接的呢请继续往下看芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153791二LED数码管的静态显示方法在单片机的应用系统中数码管显示器的显示常采用两种方法静态显示和动态扫描显示所谓静态显示就是把多个LED显示器的每一段与一个独立的并行口连接起来而公共端则根据数码管的种类连接到VCC或GND端这种连接方式的每一个显示器都要占用一个单独的具有锁存功能的I/O端口用于笔划段字形代码单片机只需把要显示的字形代码发送到接口电路就不用再管它了直到要显示新的数据时再发送新的字形码因此使用这种方法当显示位数较多时单片机中I/O口的开销很大需要提供的I/O接口电路也较复杂但它具有编程简单显示稳定CPU的效率较高的优点下面我们以常用的串-并转换电路74LS164为例介绍一种常用的静态显示电路以使大家对静态显示有一个基本的了解请看下面的电路图MCS-51单片机串行口方式称为移位寄存器方式外接6片74LS164作为6位LED显示器的静态显示接口我们把单片机的RXD作为数据输出线TXD作为移位时钟脉冲74LS164为TTL单向8位移位寄存器可实现串行输入并行输出其中AB12脚为串行数据输入端2个引脚按逻辑与运算规律输入信号只有一个输入信号时可并接T8脚为时钟输入端可连接到串行口的TXD端每一个时钟信号的上升沿加到T端时移位寄存器移一位8个时钟脉冲过后8位二进制数全部移入74LS164中R9脚为复位端当R=0时移位寄存器各位复0只有当R=1时时钟脉冲才起作用Q1Q83-6脚和10-13脚为并行输出端分别接到LED显示器的hgfedcba各段对应的引脚上关于74LS164还可以作如下的介绍所谓时钟脉冲端其实就是需要高低高低的脉冲不管这个脉冲是怎么来的比如我们用根电线一端接T一端用手拿着分别接高电平低电平那也是给出时钟脉冲在74LS164获得时钟脉冲的瞬间再讲清楚点是在脉冲的前沿如果数据输入端12脚是高电平则就会有一个1进入到74LS164的内部如果数据输入端是低电平则就会有一个0进入其内部在给出了8个脉冲后最先进入74LS164的第一个数据到达了最高位然后再来一个脉冲会有什么情况发生呢第一个脉冲就会从最高位移出就象车站排队买票栏杆就那么长要从后面进去一个人就必须要从前面走出去一个人才行搞清了这一点让我们再来看电路图电路图在后面的附录中6片74LS164首尾相串而时钟端则连接在一起这样当第一次输入8个脉冲时从单片机RXD端输出的数据就进入到了第一片74LS164中了而当第二次8个脉冲到来后这个数据就进入到了第二片74LS164新的数据则进入了第一片74LS164中这样当第六次8个脉冲完成后首次送出的数据被送到了最左面的74LS164中其他的数据则依次出现在第一二三四五片74LS164中这里有个问题在第一次8个脉冲到来时除了第一片74LS164中接收数据外其他各片在干吗呢它们也在接收数据因为它们的时钟端都是被接在一起的可是数据还没有送到其他各片呢它们在接收什么数据呢其实所谓数据不过是一种说法而已它实际上就是电平的高或低当第一次8个脉冲到来时第一片74LS164固然是从单片机接收数芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153792据了而其它各片也接到前一片的Q8上而Q8是一根电线在数字电路中它只可能有两种状态低电平或高电平也就是0"和1"所以它的下一片74LS164也相当于是在接收数据只是接收的全部是0或1而已这个问题放在这儿来讲可能有的朋友不屑一顾而有的朋友可能还是不清楚这实际上涉及到数的本质的问题如果不懂请并回到前面的内容再仔细的复习一遍或找一些数字电路方面的书籍看一下理解了74LS164的工作原理再来看这个问题就会变得简单多了这里就算给大家留个习题吧希望大家务必把74LS164的工作原理搞清楚搞懂了这一点您的级别就超过初级了变成中级了接下来让我们做一个实验做这个实验也需要一套这套由于大家只用一次所以各位可以到我这儿来借同样免费使用不过还是那句老话请各位多多爱惜哦不要把它搞坏了我们把的两根线连接到实验板的P3口扩展插座和实验仪的电源接口上先看实验要求输入把要显示的数分别放在显示缓冲区60H-65H共6个单元中并且分别对应各个数码管LED1-LED6输出将预置在显示缓冲区中的6个数转换成相应的显示字形码然后输出到显示器中显示出来程序如下ORG0000H;AJMPSTART;ORG30H;START:MOVSP,#6FH;MOV65H,#0;MOV64H,#1;MOV63H,#2;MOV62H,#3;MOV61H,#4;MOV60H,#5;LCALLDISP;SJMP$;DISP:MOVSCON,#00H;初始化串行口方式0MOVR1,#06H;显示6位数MOVR0,#65H;60H-65H为显示缓冲区MOVDPTR,#SETTAB;字形表的入口地址LOOP:MOVA,@R0;取最高位的待显示数据MOVCA,@A+DPTR;查表获取字形码MOVSBUF,A;送串口显示DELAY:JNBTI,DELAY;等待发送完毕CLRTI;清发送标志DECR0;指针下移一位准备取下一个待显示数DJNZR1,LOOP;直到6个数据全显示完RET;SETTAB:;字形表前面有介绍后面我们会介绍字形表的制作DB03H,9FH,27H,0DH,99H,49H,41H,1FH,01H,09H,0FFH;END如果按图示数码管排列则以上程序将显示543210不过我们的实验板是做不了这个实验的为什么我们稍候再讲先让我们来讲解一下字形表的制作问题先就上述标准的图形来做写出数据位和字形的对应关系并列一个表如下共阳接法也就是输出为0时笔段亮芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153793怎么样不算复杂吧就是这样列个表格根据要求0亮1灭写出相应位的0和1就可以了接着练习一下写出显示A-F的字形码数据位D7D6D5D4D3D2D1D0笔段位ABCDEFGH字型码00000001103H1100111119FH20010011127H3000011010DH41001100199H50100100149H60100000141H7000111111FH80000000101H90000100109H不过这是按照上面的标准接线排列的在实际的程序设计中有时为了接线方便常常会把接线顺序打乱我们的实验板就是这样的那么此时的字形表又该如何做呢其实也很简单一样地列表以我们的实验板为例同样显示9876543210共阴极接法注意和共阳极接法的区别接线如下P2.
0P2.
1P2.
2P2.
3P2.
4P2.
5P2.
6P2.
7对应gfabhcde则字形码如下所示011101110/EEH100101000/28H211001101/CDH301101101/6DH400101011/2BH501100111/67H611100111/E7H700101100/2CH811101111/EFH900101111/2FH继续练习写出显示A-F的字形码下面提个问题如果是共阳极的接法字形码又该是怎么样的呢不用我再说了吧如果学到现在连这个还不明白那真的是惨了现在让我们来继续上面的实验把543210的字形码放入上面的查表程序中即DB后面如果要显示012345我们的程序又该如何修改呢自己想一下三本课总结这一课主要讨论数码管的静态显示原理及编程方法在实际的应用中远比这些要复杂的多不过在我们的上册课程中目的是为了让大家尽快的进入到单片机的应用中来所以我这里只能讲这么多如果您想学习更多的知识只有继续学习课程的下册部分当然如果您现在就要用到这方面的内容我可以协助您开发和设计四第23课习题1什么是LED数码管的共阳接法它与共阴接法有什么不同2深入了解74LS164的工作原理3了解74LS165的作用和功能芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153794第二十四课数码管接口与编程二上一课讲解了数码管的静态显示方法这一课专门来讨论数码管的动态显示方法一LED数码显示器的动态显示方法由于静态显示占用的I/O口线较多CPU的开销很大所以为了节省单片机的I/O口线常采用动态扫描方式来作为LED数码管的接口电路在实际的工程应用中它是使用最为广泛的一种显示方式其接口电路是把所有显示器的8个笔划段h-a同名端连在一起而每一个显示器的公共极COM端与各自独立的I/O口连接当CPU向字段输出口送出字形码时所有显示器接收到相同的字形码但究竟是那个显示器亮则取决于COM端而这一端是由另外的I/O口控制的所以我们就可以自行决定何时显示哪一位了而所谓动态扫描就是指我们采用分时的方法一位一位地轮流控制各个显示器的COM端使各个显示器每隔一段时间点亮一次在轮流点亮的扫描过程中每位显示器的点亮时间是极为短暂的约1ms左右由于人的视觉暂留现象及发光二极管的余辉效应尽管实际上各位显示器并非同时点亮但只要扫描的速度足够快给人的印象就是一组稳定的显示数据不会有闪烁感在我们实验板的电路图中我们把89C52的P2口作为位选端即同名端abcdefgh并联起来而把它们的片选端分别与P3.
5和P3.
6连接图中为了增加P3.
5和P3.
6的驱动能力采用了一个三极管这样由P3.
5和P3.
6控制对应数码管的亮或灭只要给P2.
0送入不同的字形码就能显示不同的数了下面的这个程序就是用我们实验板上的两个数码管来显示0和1电路的连接方法请看后面的实验板电路图FIRSTEQUP3.
6;第一位数码管的位控制SECONDEQUP3.
5;第二位数码管的位控制DISPBUFFEQU5AH;显示缓冲区为5AHORG0000H;AJMPSTART;ORG30H;START:MOVSP,#5FH;设置堆栈MOVP0,#0FFH;MOVP1,#0FFH;MOVP2,#0FFH;初始化所有显示器LED灭MOVDISPBUFF,#0;第一位显示0MOVDISPBUFF+1,#1;第二位显示1LOOP:LCALLDISP;调用显示程序AJMPLOOP;主程序到此结束DISP:PUSHACC;ACC入栈PUSHPSW;PSW入栈MOVA,DISPBUFF;取第一个待显示数MOVDPTR,#DISPTAB;字形表首地址MOVCA,@A+DPTR;取数字0的字形码MOVP2,A;将字形码送P2口SETBFIRST;打开第一位显示器位选端LCALLDELAY;延时1毫秒CLRFIRST;关闭第一位显示器开始准备第二位的数据芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153795MOVA,DISPBUFF+1;取显示缓冲区的第二位MOVDPTR,#DISPTAB;第二个字形码地址MOVCA,@A+DPTR;去数字1的字形码MOVP2,A;将第二个字形码送P2口SETBSECOND;打开第二位显示器位选端LCALLDELAY;延时1毫秒CLRSECOND;关闭第二位显示器POPPSW;POPACC;RET;DELAY:PUSHPSW;SETBRS0;MOVR7,#50;D1:MOVR6,#10;D2:DJNZR6,$;DJNZR7,D1;POPPSW;RET;DISPTAB:DB0EEH28H0CDH6DH2BH67H0E7H2CH0EFH2FHEND从上面的例子中可以看出动态扫描显示必须由CPU不断地调用显示程序才能保证持续不断的显示上面的这个程序虽然可以实现数字的显示但过于简单了我们学到现在也应该做点复杂一些的实验比如让两个LED从0显示到99不断的循环这可是很经典的程序几乎所有用数码管显示的系统都会把它作为初始化的显示程序看下面的实验程序a_bitequ20h;个位数存放处b_bitequ21h;十位数存放处tempequ22h;计数器寄存器star:movtemp,#0;初始化计数器stlop:acalldisplayinctempmova,tempcjnea,#100,next;=100重来movtemp,#0next:ljmpstlop;显示子程序display:mova,temp;将temp中的十六进制数转换成10进制movb,#10;10进制/10=10进制divabmovb_bit,a;十位在amova_bit,b;个位在bmovdptr,#numtab;指定查表启始地址movr0,#4dpl1:movr1,#250;显示1000次dplop:mova,a_bit;取个位数MOVCA,@A+DPTR;查个位数的7段代码芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153796movp2,a;送出个位的7段代码clrp0.
7;开个位显示acalld1ms;显示1mssetbp0.
7mova,b_bit;取十位数MOVCA,@A+DPTR;查十位数的7段代码movp2,a;送出十位的7段代码clrp0.
6;开十位显示acalld1ms;显示1mssetbp0.
6djnzr1,dplop;100次没完循环djnzr0,dpl1;4个100次没完循环ret1MS延时(按12MHZ算)D1MS:MOVR7,#50;D1:MOVR6,#200;D2:DJNZR6,$;DJNZR7,D1RETnumtab:dbDB0EEH28H0CDH6DH2BH67H0E7H2CH0EFH2FHEND细心的朋友可能看出来了这段指令中有的是用大写字母来写的而有的是用小写字母来写的有什么区别吗在KEILC51中用汇编写程序的时候是不区分大小写的你完全可以根据自己的书写习惯来写不过标号是不能前面的用大写后面的用小写这样编译时会出错好了不多说了你还是自己试试吧这段程序可以完成从0-99的显示循环当然在实际的产品中不可能只显示两个数字不做其他的事不过程序的结构和思路是没有问题的从上面的程序中我们可以看出与静态扫描相比动态扫描的程序稍微有点复杂但这是值得的因为它可以大大节省单片机的I/O口线资源所以在实际的工程应用中几乎都采用动态扫描的方法来进行数码管的显示我们的这个程序也具有一定的通用性只要改变端口的值及计数器的值就可以显示更多的位数了不过正如我前面所说的那样单片机的程序设计在实际应用中还会考虑很多的其他问题所以这一课的内容同样只是给大家以后的学习打一个基础倒是下面的LED数码管的选择原则和驱动方法大家有必要了解一下二LED数码管的选择和驱动LED数码管是单片机人机界面输出中用的最多也是最简单的显示方式由于单片机口线的驱动能力是有限的所以如何来选择和驱动LED数码管是单片机初学者的基本功下面就来给大家介绍一下前面我们已经讲过LED数码管有两种连接方法一种是共阳接法一种是共阴接法在单片机的应用中对于共阳接法我们一般把它叫做接电源方法即把COM端接VCC通过控制COM端引脚电平的高低来达到片选的目的而对于共阴接法则通常叫做接地方法即把COM端接GND由于受单片机口线驱动能力的限制采用直接驱动的方法只能连接小规格的LED数码管目前市场上有一种高亮度的数码管每段工作电流约为2-3mA这样当LED全亮时工作电流在10-20mA左右是普通数码管的1/5正好能用单片机的口线直接驱动因此在条件允许的情况下应尽量采用这种LED数码管作为显示器件当然如果想用更高亮度或更大尺寸的数码管来作为显示器件比如户外的电子钟大型广告牌等芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153797等就必须采用适当的扩展电路来实现与单片机的接口常用的接口元件可以是三极管集成电路和专用芯片等三极管的规格可以根据数码管所需的驱动电流大小进行选择电流比较小的可以用90138550等小功率晶体管电流比较大的则可以用TIP217等大功率三极管而当显示器的位数较多时一般也会采用集成电路来作接口此类集成电路有20032803740675452等它们的功能其实就是由多路晶体管组成的达林顿电路具体电路请大家自己找一些相关的资料查一下另外还可以使用一种叫译码/驱动器的芯片这种芯片能将二-十进制码BCD码译成七段码a-g以驱动数码管采用这种芯片的最大好处是编程简单并且能提高CPU的运行效率如CD4511或74LS47等就是此类芯片不过它们的驱动能力也是有限的具体数据请参考有关的DS介绍勘误真是不好意思左面的这个图又画错了四个三极管应该用来驱动片选端而不是位选端请大家千万别照抄不然出了问题可不要来找我哦*^*近几年来国内外厂商还开发了许多基于串行总线SPI和I2C总线方式的LED接口芯片这些芯片采用SPI总线或I2C总线方式与单片机进行通讯具用占用单片机口线少程序易于实现的特点比如美信的MAX7219力源的PS7219SPI总线和SAA1064I2C总线等有些芯片还集成了键盘控制器可以实现键盘和显示的双重功能如zlg7289等关于这方面的内容请您自己找一些相关的资料来看一下其实除了数码管显示外在实际的工程应用中单片机还有很多的显示方法其中比较常用的就是液晶显示器液晶显示器是一种低压低功耗的显示器件它的工作电压一般只要几伏工作电流仅有几个微安是任何数码管显示器件所无法比拟的除此之外液晶显示器的最大优点就是可以显示文字图形和曲线与传统的数码管显示器相比显示界面有了质的提高采用点阵式的液晶显示器配合大规模集成电路能够显示大量的信息目前已经广泛使用在各类中高档仪器仪表及家用电器中比如数字万用表手机数码相机等等不过它的使用方法与编程就比较复杂了我们只有等到下册中再来给大家讲解了二本课总结到本课为止我们课程的上册部分已经全部讲完希望大家课后多进行练习因为学习单片机是一种非常注重实践的课程如果离开了实际的应用那么学习再多的理论知识也是非常无效的课程的下册部分我还在继芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153798续的编写之中等全部写完了会通知大家由于本人的才疏学浅教材中难免有疏漏甚至有许多不正确的地方希望大家多多批评指正最后申明本教程的编写其实多数参考了平凡老师的教程只不过看到他写的内容有很多的错误之处我就进行了大量的整理和修改并应用到实际的教学工作中据说他现在的教程已经出版了如果大家打印不方便看电子书觉得累还是去买一本不要老想着图小便宜毕竟人家也是化了很多心血的支持一下嘛老想着图小便宜的人也是做不了什么大事的大家如果看得起我可以任意的转载和使用但决不允许把本教程作为商业用途只希望后来的兄弟少走一点弯路我的目的也就达到了另外如果您在实际的产品开发中有什么问题的话可以给我来电或发E-mailjiguocitiz.
net联系我会尽我的所能帮助大家谢谢芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通7153799附录一MCS-51单片机指令表助记符指令说明字节数周期数数据传递类指令MOVARn寄存器传送到累加器11MOVAdirect直接地址传送到累加器21MOVA@Ri累加器传送到外部RAM(8地址)11MOVA#data立即数传送到累加器21MOVRnA累加器传送到寄存器11MOVRndirect直接地址传送到寄存器22MOVRn#data累加器传送到直接地址21MOVdirectRn寄存器传送到直接地址21MOVdirectdirect直接地址传送到直接地址32MOVdirectA累加器传送到直接地址21MOVdirect@Ri间接RAM传送到直接地址22MOVdirect#data立即数传送到直接地址32MOV@RiA直接地址传送到直接地址12MOV@Ridirect直接地址传送到间接RAM21MOV@Ri#data立即数传送到间接RAM22MOVDPTR#data1616位常数加载到数据指针31MOVCA@A+DPTR代码字节传送到累加器12MOVCA@A+PC代码字节传送到累加器12MOVXA@Ri外部RAM(8地址)传送到累加器12MOVXA@DPTR外部RAM(16地址)传送到累加器12MOVX@RiA累加器传送到外部RAM(8地址)12MOVX@DPTRA累加器传送到外部RAM(16地址)12PUSHdirect直接地址压入堆栈22POPdirect直接地址弹出堆栈22XCHA,Rn寄存器和累加器交换11XCHA,direct直接地址和累加器交换21XCHA,@Ri间接RAM和累加器交换11XCHDA,@Ri间接RAM和累加器交换低4位字节11(算术运算类指令)INCA累加器加111INCRn寄存器加111INCdirect直接地址加121INC@Ri间接RAM加111INCDPTR数据指针加112DECA累加器减111DECRn寄存器减111DECdirect直接地址减122芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537100助记符指令说明字节数周期数DEC@Ri间接RAM减111MULAB累加器和B寄存器相乘14DIVAB累加器除以B寄存器14DAA累加器十进制调整11ADDA,Rn寄存器与累加器求和11ADDA,direct直接地址与累加器求和21ADDA,@Ri间接RAM与累加器求和11ADDA,#data立即数与累加器求和21ADDCA,Rn寄存器与累加器求和(带进位)11ADDCA,direct直接地址与累加器求和(带进位)21ADDCA,@Ri间接RAM与累加器求和(带进位)11ADDCA,#data立即数与累加器求和(带进位)21SUBBA,Rn累加器减去寄存器(带借位)11SUBBA,direct累加器减去直接地址(带借位)21SUBBA,@Ri累加器减去间接RAM(带借位)11SUBBA,#data累加器减去立即数(带借位)21(逻辑运算类指令)ANLA,Rn寄存器与到累加器11ANLA,direct直接地址与到累加器21ANLA,@Ri间接RAM与到累加器11ANLA,#data立即数与到累加器21ANLdirect,A累加器与到直接地址21ANLdirect,#data立即数与到直接地址32ORLA,Rn寄存器或到累加器12ORLA,direct直接地址或到累加器21ORLA,@Ri间接RAM或到累加器11ORLA,#data立即数或到累加器21ORLdirect,A累加器或到直接地址21ORLdirect,#data立即数或到直接地址31XRLA,Rn寄存器异或到累加器12XRLA,direct直接地址异或到累加器21XRLA,@Ri间接RAM异或到累加器11XRLA,#data立即数异或到累加器21XRLdirect,A累加器异或到直接地址21XRLdirect,#data立即数异或到直接地址31CLRA累加器清零12CPLA累加器求反11RLA累加器循环左移11RLCA带进位累加器循环左移11RRA累加器循环右移11RRCA带进位累加器循环右移11SWAPA累加器高低4位交换11芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537101助记符指令说明字节数周期数(控制转移类指令)JMP@A+DPTR相对DPTR的无条件间接转移12JZrel累加器为0则转移22JNZrel累加器为1则转移22CJNEA,direct,rel比较直接地址和累加器,不相等转移32CJNEA,#data,rel比较立即数和累加器,不相等转移32CJNERn,#data,rel比较寄存器和立即数,不相等转移22CJNE@Ri,#data,rel比较立即数和间接RAM,不相等转移32DJNZRn,rel寄存器减1,不为0则转移32DJNZdirect,rel直接地址减1,不为0则转移32NOP空操作,用于短暂延时11ACALLadd11绝对调用子程序22LCALLadd16长调用子程序32RET从子程序返回12RETI从中断服务子程序返回12AJMPadd11无条件绝对转移22LJMPadd16无条件长转移32SJMPrel无条件相对转移22(布尔指令)CLRC清进位位11CLRbit清直接寻址位21SETBC置位进位位11SETBbit置位直接寻址位21CPLC取反进位位11CPLbit取反直接寻址位21ANLC,bit直接寻址位与到进位位22ANLC/bit直接寻址位的反码与到进位位22ORLC,bit直接寻址位或到进位位22ORLC/bit直接寻址位的反码或到进位位22MOVC,bit直接寻址位传送到进位位21MOVbit,C进位位位传送到直接寻址22JCrel如果进位位为1则转移22JNCrel如果进位位为0则转移22JBbitrel如果直接寻址位为1则转移32JNBbitrel如果直接寻址位为0则转移32JBCbitrel直接寻址位为1则转移并清除该位22伪指令ORG指明程序的开始位置DB定义数据表DW定义16位的地址表EQU给一个表达式或一个字符串起名芯源电子—大屏幕LED显示屏设计/制造单片机和嵌入式系统开发上海芯源电子电器设计中心:13564769866E-mail:jiguo@citiz.
netQQ180625111875110579990E话通71537102DATA给一个8位的内部RAM起名XDATA给一个8位的外部RAM起名BIT给一个可位寻址的位单元起名END指出源程序到此为止指令中的符号标识Rn工作寄存器R0-R7Ri工作寄存器R0和R1@Ri间接寻址的8位RAM单元地址00H-FFH#data88位常数#data1616位常数addr1616位目标地址能转移或调用到64KROM的任何地方addr1111位目标地址在下条指令的2K范围内转移或调用Rel8位偏移量用于SJMP和所有条件转移指令范围-128+127Bit片内RAM中的可寻址位和SFR的可寻址位Direct直接地址范围片内RAM单元00H-7FH和80H-FFH$指本条指令的起始位置电路图我不再贴出来大家可以直接到网站上去下载网址www.
fj136.
com/bbs/index.
asp

Hostodo,美国独立日特价优惠,四款特价VPS云服务器7折,KVM虚拟架构,NVMe阵列,1核512M内存1Gbps带宽3T月流量,13.99美元/月,赠送DirectAdmin授权

Hostodo近日发布了美国独立日优惠促销活动,主要推送了四款特价优惠便宜的VPS云服务器产品,基于KVM虚拟架构,NVMe阵列,1Gbps带宽,默认分配一个IPv4+/64 IPv6,采用solusvm管理,赠送收费版DirectAdmin授权,服务有效期内均有效,大致约为7折优惠,独立日活动时间不定,活动机型售罄为止,有需要的朋友可以尝试一下。Hostodo怎么样?Hostodo服务器好不好?...

spinservers:圣何塞物理机7.5折,$111/月,2*e5-2630Lv3/64G内存/2T SSD/10Gbps带宽

spinservers美国圣何塞机房的独立服务器补货120台,默认接入10Gbps带宽,给你超高配置,这价格目前来看好像真的是无敌手,而且可以做到下单后30分钟内交货,都是预先部署好了的。每一台机器用户都可以在后台自行安装、重装、重启、关机操作,无需人工参与! 官方网站:https://www.spinservers.com 比特币、信用卡、PayPal、支付宝、webmoney、Payssi...

VoLLcloud:超便宜香港CMI大带宽vps-三网CMI直连-年付四免服务-低至4刀/月-奈飞

vollcloud LLC创立于2020年,是一家以互联网基础业务服务为主的 技术型企业,运营全球数据中心业务。致力于全球服务器租用、托管及云计算、DDOS安 全防护、数据实时存储、 高防服务器加速、域名、智能高防服务器、网络安全服务解决方案等领域的智 能化、规范化的体验服务。所有购买年付产品免费更换香港原生IP(支持解锁奈飞),商家承诺,支持3天内无条件退款(原路退回)!点击进入:vollclo...

qq空间怎么添加音乐为你推荐
bbsxpdvbbs bbsxp LeadBBS 对比万网核心代理哪里可以注册免费代理?手机区号手机号码前怎样填写正确的国内区号?显卡温度多少正常电脑显卡温度多少正常?正则表达式javajava正则表达式苹果5怎么越狱苹果5怎么越狱如何建立一个网站如何建立一个网站小米3大概多少钱小米3现在多少钱创维云电视功能创维电视怎么用,我买了个创维云电视,现在不知道怎么用手机往电视上传照片,谁能解答以下,怎么升级ios6苹果IOS5怎么升级IOS6版本
香港虚拟空间 uk2 圣迭戈 韩国电信 koss 免费名片模板 服务器日志分析 12u机柜尺寸 免费网站申请 中国电信测速112 日本bb瘦 刀片服务器的优势 linux使用教程 卡巴斯基是免费的吗 无限流量 服务器是干什么用的 网通服务器 免费个人主页 重庆服务器 香港博客 更多