实例讲解,51单片机常用延时控制子程序
单片机中常用的延时控制方式有两种。一种是采用编程的方式达到延时的目的,另一种方法则是通过单片机中的两个定时器T0和T1进行计时达到延时的目的。
本例通过具体实例说明单片机的两种延时控制方式在实际中的应用。
采用编程方式延时控制
1.问题的提出通过编程使单片机分别产生约10ms和约0.5s的延时。单片机的晶振频率为12MHz。因为单片机的晶振频率为12MHz,所以单片机1个机器周期的时间为1μs。
2.控制程序
(1)10ms延时程序。
此程序的实际延时时间为:1+(1+2×250+2)×20=10.061ms
(2)0.5s延时程序。
此程序实际延时时间为:251×66×5×6+66×5×2+5×2+1×2+5×6+66×5×6=499662μs=0.49662s。
采用定时器延时控制
1.问题的提出
利用单片机定时器使之产生10h的延时控制。
2.控制程序
说明:程序中用“;程序开始******”符号表示程序开始,用“;程序结束******”符号表示程序结束,用“;-------------”表示将程序中各阶段程序分隔开,以便程序的条理性和直观性,这些符号均可以同时输入到Keil μVision3软件中进行编译。以下各例程序均同。
单片机系列第五讲 单片机延时程序分析
上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。
〈单片机延时程序〉
MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中 来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递 者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这 个#就是用来说明250就是一个被传递的东西本身,而不是传递者。那么MOV R6,#250是什么意思,应当不用分析了吧。
DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是 R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。D2在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是给本行起一个名 字。DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转 移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是, 在原地转圈250次。
执行完了DJNZ R6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是DJNZ R7,D1,请大家自行分析一下这句话执行的结果。(转去执行MOV R6,#250,同时R7中的值减1),最终DJNZ R6,D2这句话将被执行250*250=62500次,执行这么多次同一条指令干吗?就是为了延时。
一个问题:如果在R6中放入0,会有什么样的结果。
二、时序分析:
前面我们介绍了延时程序,但这还不完善,因为,我们只知道DJNZ R6,D2这句话会被执行62500次,但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。
先提一个问题:我们学校里什么是最重要的。(铃声)校长能出差,老师能休息,但学校一日无铃声必定大乱。整个学校就是在铃声的统一指挥下,步调一致,统一 协调地工作着。这个铃是按一定的时间安排来响的,我们能称之为“时序��时间的次序”。一个由人组成的单位尚且要有一定的时 序,计算机当然更要有严格的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。计算机 要完成的事更复杂,所以它的时序也更复杂。
我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:计算机访问一次存储器的时间,称之为一个机器周期。这是一个时间 基准,好象我们人用“秒”作为我们的时间基准一样,为什么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯。
一个机器周期包括12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于12M晶体震荡器,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。(请计算一个工作于6M晶体震荡器的单片机,它的机器周期是多少)。
MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才 行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所 谓指令周期就是指执行一条指令的时间。INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些指令是需要记住的, 如DJNZ指令是双周期指令。
下面让我们来计算刚才的延时。首先必须要知道晶体震荡器的频率,我们设所用晶体震荡器为12M,则一个机器周期就是1微秒。而DJNZ指令是双周期指令,所以执行一次要2个微秒。一共执行62500次,正好125000微秒,也就是125毫秒。
三、复位电路
一、复位方式
⒈ 复位条件
RST引脚保持2个机器周期以上的高电平。
⒉ 复位电路
〈单片机复位电路〉
⒊ 复位后CPU状态
PC: 0000H TMOD: 00H
Acc: 00H TCON: 00H
B: 00H TH0: 00H
PSW: 00H TL0: 00H
SP: 07H TH1: 00H
DPTR:0000H TL1: 00H
P0~P3:FFH SCON: 00H
IP:×××00000B SBUF: 不定
IE:0××00000B PCON: 0×××0000B
任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一响,大家就自动地从操场、其它地方进入教室了,在 这一段时间里,是没有老师干预的,对单片机来说,是程序还没有开始执行,是在做准备工作。显然,准备工作不需要太长的时间,复位只需要5ms的时间就能 了。如何进行复位呢?只要在单片机的RST管脚上加上高电平,就能了,按上面所说,时间不少于5ms。为了达到这个要求,能用很多种办法,这里供给一种供 参考,见图1。实际上,我们在上一次实验的图中已见到过了。
这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是RST管脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作。
最新电子行业资讯、教程以及开发板样片申请,请关注“云汉电子社区”官方微信公众号ickeybbs ,或者登录云汉电子社区官方QQ群:496780052
相关问答
求助: 单片机 C语言中 延时程序怎么样 计算?-ZOL问答运行程序并观察“sec”的值就能调试出你程序的执行时间了。注意,一定要先选择晶振频率,不然会默认24MHz。希望我的回答能帮助到你。有用(0)回复ftdlw一般...
20; 延时 子 程序 , 延时 0.2秒D1:MOVR6,#20D2:MOVR7,#248_作业帮[最佳回答]这个叫做软件延时程序.由于单片机每执行一条指令都需要时间.上面的程序用文字描述:DELAY:MOVR5,#20;延时子程序,延时0.2秒这句是将十进制数20这...
单片机 用中断和定时 怎么延时 ?1.软件延时利用多个指令的执行来延时,累加每个指令的运行时间,来计算出延时的总时间。一般写成一个延时函数。如,以下是10ms软件延时。delay_10ms(){int...
单片机 1秒钟定时汇编语言怎么编?可以有两种方法,设晶振为12M,则第一种方法:用延时的方法实现DELAY:MOVR3,#10;延时子程序,延时1秒D1:MOVR4,#200D2:MOVR5,#250D3:DJ...
单片机 中 延时 100毫秒的 程序 ?闪烁一定要有个流程和延时,比如while(1){亮灯,延时200毫秒,灭灯,延时200毫秒,}如果延时太短了,就闪的很快眼睛感觉一直是亮着的。最好有个100毫秒以上的延...
51 单片机 C语言for循环 延时程序 时间计算设晶振12MHz,即一个机...[最佳回答]是不是你的编译有错的啊我改的晶振12M,在KEIL4.0里面编译的,为你得出的结果最大也就是40ms,这是软件的原因,不可能出现100ms那么大的差距,...不...
51 单片机 编写一个10s的 延时程序 ,晶振频率为6MHZ?6M晶振,一个机器周期2us方式0最多计数65536也就是13072.us无法满足10s因此可以用定时器计数50000也就是0.1s计10个这样的数就能满足要求,也就是一开始给...
延时程序 时间如何选用?精确延时有两个方法,一个方法是用定时器来延时,这个方法我们后边课程要详细介绍,定时器是单片机的一个重点。另外一个就是用库函数nop();,一个NOP的时间...
单片机 外接24M的晶振,1ms的基准 延时 函数用C语言 怎么写 ?定时器T0工作方式1晶振频率24MHz定时器最大定时时间(us):32768定时器最小定时时间(us):0.5【1ms精确定时C51代码】voidT0_init(void)...定时器T0...
stc12c5a60s2 单片机延时 函数 怎么写 晶振11.0592Mhz和12M?软件延时并不精确,我都是用一个叫dpjxjl的小软件自动生成,具体准确否,没校验过,以1MS例:STC的1T单片机12MHz:voiddelay(void)//误差0us{unsigned....