前言
第1章绪论
11单片机的发展
1280C51单片机分类
13单片机应用领域和发展趋势
131单片机的应用领域
132单片机的发展趋势
第2章80C51单片机硬件结构和原理
2180C51的基本结构
21180C51的基本结构框图
212芯片的内部结构特点
2280C51的引脚及其功能
221电源引脚V和Vss
222时钟电路引脚XTALl和XTAL2
223控制信号引脚ALE、PSEN、EA和RST
224输入/输出引脚
2380C51CPU结构和时序
231运算器
232控制器
23380C51时钟系统
234CPU时序
24存储器结构和地址空间分配
241程序存储器地址空间分配
242数据存储器地址空间分配
2580C51工作方式
251复位方式
252程序执行方式
253节电工作方式
254掉电保护方式
第3章80C51指令系统
31指令与汇编语言
311指令与程序设计语言
312指令格式及系统中使用的符号意义
32寻址方式
321寻址方式
322寻址空间
33指令系统
331数据传送指令
332算术运算指令
333逻辑运算指令
334程序控制转移指令
335位 *** 作(Bool类型)指令
第4章80C51单片机的功能资源
41并行I/O接口
411P0口
412P1口
413P2口
414P3口
42定时器/计数器
421概述
422定时器T0和T1的结构和功能
423定时器的工作方式及应用
424定时器/计数器T2
425定时器,计数器的编程和使用
43串行接口
431串行口结构和工作模式
432串行口的编程和举例
44中断系统
441中断基本概念
442中断响应及处理过程
443中断程序举例
第5章单片机C51程序设计基础
51程序设计语言概述
511汇编语言
512C51语言
52C51标识符和关键字
521标识符
522关键字
53C51基本数据类型和运算符
531基本数据类型
532运算符
54数组
541一维数组
542多维数组
543字符数组
55指针
551指针与地址
552指针变量的定义
553指针变量引用
554数组的指针
555函数的指针
556指针数组
56结构体和联合体
561结构体概念和定义
562结构体的引用
563联合体概念和定义
564联合体的引用
565枚举
57型定义和预处理
571类型定义
572预处理
58语句和程序设计基本结构
581语句
582顺序结构
583选择结构
584循环结构
59函数
591函数定义
592函数调用
593中断服务函数
594局部变量与全局变量
595变量的存储种类
第6章典型外围接口设计
61键盘与单片机接口设计
611独立式键盘
612行列式键盘
62显示器接口
621LED显示器
622LED显示器接口实例
623LCD显示器
624LCD显示器接口实例
63显示接口芯片MAX8279
6318279内部结构及基本工作原理
6328279引脚功能
6338279工作方式
6348279命令字
6358279状态字
6368279应用举例
64D/A/AD芯片与单片机接口设计
641D/A转换接口电路
642A/D转换接口电路
第7章80C51单片机系统扩展
7180C51系统扩展概述
71180C:51最小应用系统
712片外总线结构
713片选
714地址锁存
715扩展存储器时应考虑的几个问题
72外部存储器扩展
721程序存储器的扩展
722数据存储器的扩展
723多片存储器的扩展
73并行I/O接口的扩展
731简单并行I/O接口扩展
7328255A可编程并行I/0接口扩展
74串行接口的扩展
7418251串行口扩展芯片
742825l应用实例
第8章80C51单片机应用系统的抗干扰技术
81可靠性与抗干扰技术概述
811干扰窜入单片机系统的主要途径
812干扰形成的基本要素
813干扰的耦合方式
82硬件抗干扰技术
821抑制干扰源
822切断干扰传播路径
823提高敏感器件的抗干扰性能
824其他常用抗干扰措施
83软件抗干扰技术
831指令冗余
832软件“陷阱”
833软件“看门狗”技术
834设置程序运行标志,拦截“跑飞”程序
第9章ProteIDXP电路板设计软件
第10章KeilC51单片机开发软件入门
第11章基于80C51的计量泵流量控制系统设计
第12章80C51单片机在电液位置伺服系统上的应用
附录AMCS-51指令表
附录B
换一个吧电子密码锁
摘要本文的电子密码锁利用数字逻辑电路,实现对门的电子控制,并且有各种附加电路保证电路能够安全工作,具有极高的安全系数。
关键词电子密码锁、电压比较器、555单稳态电路、计数器、JK触发器、UPS电源。
一、引言
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
设计本课题时构思了两种方案:一种是用以AT89C2051为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。考虑到单片机方案原理复杂,而且调试较为繁琐,所以本文采用后一种方案。
二、总体方案设计
1、设计思路
共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法 *** 作。
2、总体方框图
三、设计原理分析
电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电
造成的密码锁电路失效,使用户免遭麻烦。
密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输
次数锁定电路。
1、键盘输入、密码修改、密码检测、开锁及执行电路
其电路如下图3-1-1所示:
图3-1-1 键盘输入、密码修改、密码检测、开锁、执行电路
开关K1~K9是用户的输入密码的键盘,用户可以通过开关输入密码,开关两端的电容是为了提高开关速度,电路先自动将IC1~IC4清零,由报警电路送来的清零信号经C25送到T11基极,使T11导通,其集电极输出低电平,送往IC1~IC4,实现清零。
密码修改电路由双刀双掷开关S1~S4组成(如图3-1-2所示), 它是利用开关切换的原理实现密码的修改。例如要设定密码为1458,可以拨动开关S1向左,S2向右,S3向左,S4向右,即可实现密码的修改,由于输入的密码要经过S1~S4的选择,也就实现了密码的校验。本电路有16组的密码可供修改。
图3-1-2 密码修改电路
由两块74LS112(双JK触发器,包含IC1~IC4)组成密码检测电路。由于IC1处于计数状态,当用户按下第一个正确的密码后,CLK端出现了一个负的下降沿,IC1计数,Q端输出为高电平,用户依次按下有效的密码,IC2~IC3也依次输出高电平,送入与门IC5,使其输出开锁的高电平信号送往IC13的2脚,执行电路动作,实现开锁。
执行电路是由一块555单稳态电路(IC13),以及由T10、 T11组成的达林顿管构成。若IC13的2脚输入一高电平,则3脚输出高电平,使T10导通,T11导通,电磁阀开启,实现开门,同时T10集电极上接的D5(绿色发光二极管)发亮,表示开门,20秒后,555电路状态翻转,电磁阀停止工作,以节电。其中电磁阀并联的电容C24使为了提高电磁阀的力矩。
2、 报警电路
报警电路实现的功能是:当输入密码的时间超过40秒(一般情况下用户输入不会超过),电路报警80秒,防止他人恶意开锁。
电路包含两大部分,2分钟延时和40秒延时电路。其工作原理是当用户开始输入密码时,电路开始2分钟计时,超出40秒,电路开始80秒的报警。图如下3-2-1所示
图3-2-1 报警电路
有人走近门时,触摸了TP端(TP端固定在键盘上,其灵敏度非常高,保证电路可靠的触发),由于人体自身带的电,使IC10的2脚出现低电平,使IC10的状态发生翻转,其3脚输出高电平,T5导通(可以通过R12控制T1的基极电流),其集电极接的发光二极管D3发光,表示现在电子锁处于待命状态,T6截止,C4开始通过R14充电(充电时间是40秒,此时为用户输入密码的时间,即用户输入密码的时间不能超过40秒,否则电路就开始报警, 由于用户经常输入密码,而且知道密码,一般输入密码的时间不会超过40秒),IC2开始进入延时40秒的状态。
开始报警:当用户输入的密码不正确或输入密码的时间超过40秒,IC11的2脚电位随着C4的充电而下降,当电位下降到1/3Vcc时(即40秒延时结束时候),3脚变成高电位(延时时是低电平),通过R15使(R15的作用是为了限制T7的导通电流防止电流过大烧毁三极管)T7导通,其集电极上面接的红色发光二极管D4发亮,表示当前处于报警状态,T8也随之而导通,使蜂鸣器发声,令贼人生怯,实现报警
停止报警:当达到了80秒的报警时间,IC10的6,7脚接的电容C5放电结束,IC10的3脚变成低电平,T5截止,T6导通,强制使强制电路处于稳态,IC11的3脚输出低电平,使T7,T8截止,蜂鸣器停止报警;或者用户输入的密码正确,则有开锁电路中的T10集电极输出清除报警信号,送至T12(PNP),T12导通,强制使T7基极至低电位,解除报警信号。
3、报警次数检测及锁定电路
若用户 *** 作连续失误超过3次,电路将锁定5分钟。其工作原理如下:当电路报警的次数超过3次,由IC9(74161)构成的3位计数器将产生进位,通过IC7,输出清零信号送往74161的清零端,以实现重新计数。经过IC8(与门),送到IC12(555)的2脚,使3脚产生5分钟的高电平锁定脉冲(其脉冲可由公式T=11RC计算得出),经T9倒相,送IC6输入端,使IC6输出低电平,使IC13不能开锁,到锁定的目的。电路图如下3-3-1所示:
图3-3-1报警次数检测及锁定电路
4、备用电源电路
为了防止停电情况的发生,本电路后备了UPS电源,它包括市电供电电路,停电检测电路,电子开关切换电路,蓄电池充电电路和蓄电池组成。其电路图如下3-4-1所示:
220V市电通过变压器B降压成12V的交流电,再经过整流桥整流,7805稳压到5V送往电子切换电路,由于本电路功耗较少,所以选用10W的小型变压器。
图3-4-1 电源电路
由R8,R9,R6,R7及IC14构成电压比较器,正常情况下,V+<V- IC14输出高电平,继电器的常闭触点和市电相连;当市电断开,V+>V- IC14输出高电平,由T3,T4构成的达林顿管使继电器J开启,将其常开触电将蓄电池和电路相连,实现市电和蓄电池供电的切换,保证电子密码锁的正常工作(视电池容量而定持续时间)。其电路图如下3-4-2所示:
图3-4-2停电检测及电子开关切换电路
T1,T2构成的蓄电池自动充电电路,它在电池充满后自动停止充电,其中D1亮为正在充电,D2为工作指示。由R4,R5,T1构成电压检测电路,蓄电池电压低,则T1,T2导通,实现对其充电;充满后,T1,T2截止,停止充电,同时D1熄灭,电路中C4的作用是滤除干扰信号。其电路图如3-4-3所示:
图3-4-3 蓄电池自动充电电路
五、总结与体会
以上为实习期间所设计的电子密码锁电路,它经过多次修改和整理,以是一个比较不错的设计,可以满足人们的基本要求,但因为水平有限,此电路中也存在一定的问题,譬如说电路的密码不能遗忘,一旦遗忘,就很难打开,这可以通过增加电路解决,但过于复杂,本次设计未其中;用开关作74LS112的CLK脉冲,不是很稳定,可以调换其它高速开关或计数脉冲;电路密码只有16种可供修改,但由于他人不知道密码的位数,而且还要求在规定的时间内按一定的顺序开锁,所以他人开锁的几率很小;电路中未加显示电路,但可通过其它数字模块实现这一功能。这需要一段时间的进一步改进,如果有好的意见,希望老师给以支持。
通过这三周的学习,我感觉有很大的收获:首先,通过学习使自己对课本上的知识可以应用于实际,使的理论与实际相结合,加深自己对课本知识的更好理解,同时实习也段练了我个人的动手能力:能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。能对protel 99、和EWB等仿真软件 *** 作,能达到学以致用。对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
在实习中,我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,请允许我向你们致意崇高的敬意,感谢你们,老师!
参考文献
[1] 康华光电子技术基础(第四版)北京:高等教育出版社,1998
[2] 《无线电》第2002年合订本。1、熟悉单片机的原理,结构;
2、学好数电,模电,为设计电路打好基础;
3、熟练使用C语言,多学习别人的程序;
4、对 *** 作系统原理有一定的了解;
5、Protel至少要有点基础;
6、要实际动手调试电路的能力。
学习单片机的步骤
当前的单片机种类很多,但是 51 是最基础的,因此单片机的学习最好也是从 51 开始,不仅容易上手,而且相当实用。然而 51 单片机毕竟过于基础,后来的很多单片机在功能上都有很大的扩展,因此按照我们实验室多数人的路线接下来大多数人会学习 AVR 单片机, AVR 单片机在功能上较 51 有很大提升,集成了 A/D 、快速 PWM 等很多实用的功能,而且和很多大型的单片机在功能上有很多类似之处,因此如果以后还想掌握其他单片机 AVR 无疑是一个很好的跳板。
学习的过程
学习单片机最终要的是当然是练,我所说的学习跟课堂上的单片机学习不同,我以前也看过一些单片机教材,有些教材讲的是单片机的工作原理和内部结构,这些东西对于我们暂时并不需要,等以后开课的时候在学习好了。现在要学习的是暂时抛开内部结构原理不谈,如何能用单片机写一些简单的小程序,是从实用性的角度出发,网上有一种说法称之为先实践后理论的学习方法。
因此我的观点如下,单片机的硬件结构首先要有一个基本的了解,最起码要知道各引脚的功能、区别,能自己动手搭一个单片机的最小系统,然后就可以直接从程序入手,程序最好还是用 C 语言编程,从简单的跑马灯做起,逐渐深入,陆续可以做一些数码管、液晶、 DS1302 、 DS18B20 等电子元器件的应用,在深入就可以结合一些具体实例扩展一些中断、串口通讯等功能。还有一点要声明的是单片机里用到的 C 语言其实很有限,课堂上学习 C++ 的很大一部分内容在初期单片机编程中都用不到,因此没必要因为觉的自己的 C 语言基础不是很好而对单片机望而止步!
学习的工具
软件方面方面, 51 单片机用的是 KEIL 软件,这个软件在学校图书馆软件下载和其他网站上都有,具体用法自己查找相关资料, AVR 的软件就比较多了,我用的是 CVAVR ,另外还有 ICCAVR 等多款编译软件,这要看个人喜好了,建议有了一定的 51 基础再学。另外就是烧写软件,烧写软件的作用就是将编译器生成的 HEX 文件烧写至单片机里,这要配合下载线实用,如果有并口的话最好用并口下载线,软件最好用广州双龙的 SLISP 软件,如果是笔记本没有并口的话则要自己买一个下载器了,名称为 USBASP ,网上电子市场有卖 20 块钱左右,软件会随光盘自带。
硬件方面,首先是要有单片机,对于单片机有一点要注意, 51 单片机最好买 89S51 、 89S52 这两种型号,上面我所说的烧写程序是 ISP 方式,这两种单片机支持 ISP 下载,所以如果买其他型号的烧写程序可能会不太方便, AVR 单片机常用的就是 ATmega16L 其它型号的区别也不是很大,甚至有些兼容。至于单片机开发板,目前的价格都很贵,从一百到几百不等,不过像上次学校里广告的那个六十多块钱的最好还是免了,没什么作用。能买一块当然好,没有的话也不要紧,自己动手买个电路板搭一下也很方便,引出 ISP 接口,烧写程序十分容易,然后将 I/O 口引出扩展也很方便。
学习单片机的其它几个注意点:
1 .理论与实践并重
对一个初学单片机的人来说,如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,也许用不了几天就会觉得枯燥乏味以致半途而废。所以学习与实践结合是一个好方法,边学习、边演练,循序渐进,这样用不了几次就能将所用到的指令理解、吃透、扎根于脑海,甚至 “ 根深蒂固 ” 。也就是说,当你学习完几条指令后 ( 一次数量不求多,只求懂 ) ,接下去就该做实验了,通过实验,使你感受到刚才的指令产生的控制效果,眼睛看得见 ( 灯光 ) 、耳朵听得到 ( 声音 ) ,更能深刻理解指令是怎样转化成信号去实现控制的,通过实验看到自己所学的成果不仅有一种成就感也能提升你对单片机的兴趣。说句实在话,单片机与其说是学出来的,还不如说是做实验练出来的,何况做实验本身也是一种学习过程。因此边学边练的学习方法,效果特别好。
2 .合理安排时间持之以恒
学习单片机不能 “ 三天打鱼、两天晒网 ” ,要有持之以恒的毅力与决 4 心。学习完几条指令后,就应及时做实验,融汇贯通,而不要等几天或几个星期之后再做实验,这样效果不好甚至前学后忘。另外要有打 “ 持久战 ” 的心理准备,不要兴趣来时学上几天,无兴趣时凉上几星期。学习单片机很重要的一点就是持之以恒。
3 .遇到问题耐心检查
单片机有软硬件两方面的内容,有时一个程序怎么调都不出效果,然而从理论分析却又是对的,这是就要仔细找原因了,学习单片机经常碰到很多问题,有时一两天都不能解决,这是就要有耐心,从底层找起,相信每找出一个错误都会有一个新的收获。切不可轻言放弃!!!
4 .对只短暂学过一遍的知识,充其量只比浮光掠影稍好。因此,较好的方法是过一段时间后 (1-2 个月 ) 再重新学一遍,学过的知识要经常运用,这样反复循环几次就能彻底弄懂消化,永不忘却。
5 .要进行适当投资购买实验器材及书籍资料
单片机技术含金量高,一旦学会后,给你带来的效益当然也高,无论是应聘求职还是自起炉灶开厂办公司,其前景都光明无限。因此在学习时要舍得适当投资购买必要的学习、实验器材。另外还要经常去科技图书店看看,购买一些适合自己学习、提高的书籍。一本好的书籍真的很重要,可以随时翻阅,随时补充不懂或遗忘的知识。
学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。
第一步:数字I/O的使用
使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。
第二步:定时器的使用 学会定时器的使用,就可以用单片机实现时序电路,时序电路的功能是强大的,在工业、家用电气设备的控制中有很多应用,例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断
单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事情,例如,按钮按下时的下降沿。要使单片机在程序正常运行过程中,对快速动作做出反应,就必须使用单片机的中断功能,该功能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行正常的程序。中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断),需要设置哪些寄存器才能使某种中断起作用,中断开始时,程序应该干什么,中断完成后,程序应该干什么等等。
中断学会后,就可以编制更复杂结构的程序,这样的程序可以干着一件事,监视着一件事,一旦监视的事情发生,就中断正在干的事情,处理监视的事情,当然也可以监视多个事情,形象的比喻,中断功能使单片机具有吃着碗里的,看着锅里的功能。
以上三步学会,就相当于降龙十八掌武功,会了三掌了,可以勉强护身。
第四步:与PC机进行RS232通信
单片机都有USART接口,特别是MSP430系列中很多型号,都具有两个USART接口。USART接口不能直接与PC机的RS232接口连接,它们之间的逻辑电平不同,需要使用一个MAX3232芯片进行电平转换。
USART接口的使用是非常重要的,通过该接口,可以使单片机与PC机之间交换信息,虽然RS232通信并不先进,但是对于接口的学习是非常重要的。正确使用USART接口,需要学习通信协议,PC机的RS232接口编程等等知识。试想,单片机实验板上的数据显示在PC机监视器上,而PC机的键盘信号可以在单片机实验板上得到显示,将是多么有意思的事情啊!
第五步:学会A/D转换
MAP430单片机带有多通道12位A/D转换器,通过这些A/D转换器可以使单片机 *** 作模拟量,显示和检测电压、电流等信号。学习时注意模拟地与数字地、参考电压、采样时间,转换速率,转换误差等概念。
使用A/D转换功能的简单的例子是设计一个电压表。
第六步:学会PCI、I2C接口和液晶显示器接口
这些接口的使用可以使单片机更容易连接外部设备,在扩展单片机功能方面非常重要。
第七步:学会比较、捕捉、PWM功能
这些功能可以使单片机能够控制电机,检测转速信号,实现电机调速器等控制起功能。
如果以上七步都学会,就可以设计一般的应用系统,相当于学会十招降龙十八掌,可以出手攻击了。
第八步:学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计是非常重要的,因为这是当前产品开发的发展方向。
到此为止,相当于学会15招降龙十八掌,但还不到打遍天下无敌手的境界。即使如此,也算是单片机大虾了
延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器
周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指
令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者
我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。例如
在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。延时程序是如何
实现的呢?下面让我们先来了解一些相关的概念。
一、机器周期和指令周期
1.机器周期是指单片机完成一个基本 *** 作所花费的时间,一般使用微秒来计量单片机的运行速度,
51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行
一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。
2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。
在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个
机器周期),四周期指令(执行这条指令需要四个机器周期)。除了乘、除两条指令是四周期指令,其余均
为单周期或双周期指令。也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需
1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。
现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机
器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成
需要精确延时时间的延时程序。
二、延时指令
在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一
定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时
的效果。
1.数据传送指令 MOV
数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。
如:MOV R7,#80H ;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条
指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。
2.空 *** 作指令 NOP
空 *** 作指令功能只是让单片机执行没有意义的 *** 作,消耗一个机器周期。
3.循环转移指令 DJNZ
循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。
如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果
不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。这条指令需要2 个机器周期。
利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。
三、1 秒延时子程序、流程图及时间计算 (以单片机晶振为12MHz 为例,1 个机器周期需要1μs)
了解了以上的内容,现在让我们来看看
程序总共所需时间:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S
在这里运行这段程序共需998433 μs,还差1567μs 才达到1S 的,所以想要达到完美的1S 延时,需
要在返回指令RET 前再添加一些指令让它把1567μs 的延时完成。有兴趣的读者可以自己试着添加完成。
最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能
的小模块。这样在主程序中就可以方便地反复调用编写好的延时子程序。
小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样
程序就跳回本指令执行。例如:
DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10
时,则执行完该条程序所需的时间为210=20 μs。
51单片机汇编延时程序算法详解
将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。
指令周期、机器周期与时钟周期
指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。
MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。
MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12(1/12000000)=1μs。
程序分析
例1 50ms 延时子程序:
DEL:MOV R7,#200 ①
DEL1:MOV R6,#125 ②
DEL2:DJNZ R6,DEL2 ③
DJNZ R7,DEL1 ④
RET ⑤
精确延时时间为:1+(1200)+(2125200)+(2200)+2
=(2125+3)200+3 ⑥
=50603μs
≈50ms
由⑥整理出公式(只限上述写法)延时时间=(2内循环+3)外循环+3 ⑦
详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。
第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs
第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs
第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6R7次,因是双周期指令,所以耗时2R6R7μs。
例2 1秒延时子程序:
DEL:MOV R7,#10 ①
DEL1:MOV R6,#200 ②
DEL2:MOV R5,#248 ③
DJNZ R5,$ ④
DJNZ R6,DEL2 ⑤
DJNZ R7,DEL1 ⑥
RET ⑦
对每条指令进行计算得出精确延时时间为:
1+(110)+(120010)+(224820010)+(220010)+(210)+2
=[(2248+3)200+3]10+3 ⑧
=998033μs≈1s
由⑧整理得:延时时间=[(2第一层循环+3)第二层循环+3]第三层循环+3 ⑨
此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。
注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。
例3仍以1秒延时为例
DEL:MOV R7,#10 1指令周期1
DEL1:MOV R6,#0FFH 1指令周期10
DEL2:MOV R5,#80H 1指令周期25510=2550
KONG:NOP 1指令周期12825510=326400
DJNZ R5,$ 2指令周期212825510=652800
DJNZ R6,DEL2 2指令周期225510=5110
DJNZ R7,DEL1 2指令周期210=20
RET 2
延时时间=1+10+2550+326400+652800+5110+20+2 =986893μs约为1s
整理得:延时时间=[(3第一层循环+3)第二层循环+3]第三层循环+3 ⑩
结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。
单片机延时子程序
1)延时为:20ms 晶振12M
1+(1+2248+2)4+1+1+1=20000US=20MS
用汇编优点就是精确
缺点就是算有点复杂
DELAY20MS:
MOV R7,#4
D1:
MOV R6,#248
DJNZ R6,$
DJNZ R7,D1
NOP
NOP
RET
2)一些通过计算51汇编指令得出的软延时子程序
;
;延时10uS
;
time10us: mov r5,#05h ;11us
djnz r5,$
ret
;
;延时50uS
;
time50us: mov r5,#19h ;51us
djnz r5,$
ret
;
;延时100uS
;
time100us: mov r5,#31h ;996us
djnz r5,$
ret
;
;延时200uS
;
time200us: mov r5,#64h ;201us
djnz r5,$
ret
;
;延时250uS
;
time250us: mov r5,#7ch ;2496us
djnz r5,$
ret
;
;延时350uS
;
time350us: mov r5,#0afh ;351us
time350us_1: djnz r5,time350us_1
ret
;
;延时500uS
;
time500us: mov r5,#0fah ;501us
time500us_1: djnz r5,time500us_1
ret
;
;延时1mS
;
time1ms: mov r5,#0fah ;1001us
time1ms_1: nop
nop
djnz r5,time1ms_1
ret
;
;延时25mS
;
time2_5ms: mov r5,#05h ;2496ms
time2_5ms_1: mov r6,#0f8h ;497us
djnz r6,$
djnz r5,time2_5ms_1
ret
;
;延时10mS
;
time10ms: mov r5,#14h ;10262ms
time10ms_1: mov r6,#0ffh ;511us
djnz r6,$
djnz r5,time10ms_1
ret
;
;延时50mS
;
time50ms: mov r5,#63h ;49996ms
time50ms_1: mov r6,#0fbh ;503us
djnz r6,$
djnz r5,time50ms_1
ret
;
;延时100mS
;
time100ms: mov r5,#0c3h ;100036ms
time100ms_1: mov r6,#0ffh ;511us
djnz r6,$
djnz r5,time100ms_1
ret
;
;延时200mS
;
time200ms: mov r5,#02h ;250351ms
time200ms_1: mov r6,#0f4h ;125173ms
time200ms_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time200ms_2
djnz r5,time200ms_1
ret
;
;延时500mS
;
time500ms: mov r5,#04h ;500701ms
time500ms_1: mov r6,#0f4h ;125173ms
time500ms_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time500ms_2
djnz r5,time500ms_1
ret
;
;延时1S
;
time1s: mov r5,#08h ;1001401ms
time1s_1: mov r6,#0f4h ;125173ms
time1s_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time1s_2
djnz r5,time1s_1
ret
12M晶振 机器周期为1US NOP为单周期指令 DJNZ为双周期指令.
3)
;;晶振12MHZ,延时1秒
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
4);延时1分钟子程序,F=6MHz
;程序已测过,延时时间60,000,0000uS
delay60s:mov r3,#228
mov r2,#253
mov r1,#219
loop1: djnz r1,$
djnz r2,loop1
djnz r3,loop1
nop
ret
5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延时子程序为例,详细分析单片机汇编延时程序。
何为时钟周期、机器周期、和指令周期?
时钟周期:也就是振荡周期,以12MHz的时钟脉冲为例,那时钟周期就为(1/12000000)s=(1/12)us;
机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;
指令周期:CPU执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需的机器周期不一定相同,可参考51单片机指令速查表。
由上可得:CPU执行一条单周期指令,需要1us;执行一条双周期指令需要2us。
下面是具体的延时子程序分析:
01s延时子程序(12MHz晶振):
MOV R7,#200 ;单周期指令(1us)
D1: MOV R6,#250 ;单周期指令(1us)
DJNZ R6,$ ;双周期指令(2us)//该指令自身执行R6次
DJNZ R7,D1 ;双周期指令(2us)//D1执行R7次
RET ;双周期指令(2us)
T=1+(1+2R6+2)R7+2
=100603us
≈01s
05s延时子程序(12MHz晶振):
MOV R7,#5 ;单周期指令(1us)
D1: MOV R6,#200 ;单周期指令(1us)
D2: MOV R5,#250 ;单周期指令(1us
DJNZ R5,$ ;双周期指令(2us)//该指令自身执行R5次
DJNZ R6,D2 ;双周期指令(2us)//D2执行R6次
DJNZ R7,D1 ;双周期指令(2us)//D1执行R7次
RET ;双周期指令(2us)
T=1+[1+(1+2R5+2)R6+2]R7+2
=503018us
≈05s
6) 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0 ;程序从0地址开始
START: MOV A,#0FEH ;让ACC的内容为11111110
LOOP: MOV P2,A ;让P2口输出ACC的内容
RR A ;让ACC的内容左移
CALL DELAY ;调用延时子程序
LJMP LOOP ;跳到LOOP处执行
;01秒延时子程序(12MHz晶振)===================
DELAY: MOV R7,#200 ;R7寄存器加载200次数
D1: MOV R6,#250 ;R6寄存器加载250次数
DJNZ R6,$ ;本行执行R6次
DJNZ R7,D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序
方式1的最大定时是65ms左右,一次要采用软件和硬件结合定时,先让T0定时50ms运行3次就可以了。具体的ORG 1000H
MOV R2,#03H
MOV TMOD ,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB IE ,#82H
SETB R0,#03H
SJMP $
ORG 000BH
AJMP BRT0
ORG 0080H
BRTO:DJNZ R2,NEXT
(此处加上定时时间到时采取的 *** 作)
MOV TH0,#3CH
MOV TL0,#0B0H
RETI
END
对于采取方式2,由于其最大定时间才有02ms,要想实现要负责些,采用内外同时定时,如果想要可以再联系我,在给你弄
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)