单片机精确延时计算和中断定时_第1页
单片机精确延时计算和中断定时_第2页
单片机精确延时计算和中断定时_第3页
单片机精确延时计算和中断定时_第4页
单片机精确延时计算和中断定时_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.单片机准确延时计算和定时中断一.延时1.10ms延时程序〔for循环嵌套〕*********************************************************************文件名称:voiddelay_10ms()功能:10ms延时参数:单片机晶振12MHz*********************************************************************voiddelay_10ms(){unsignedinti,j;for(i=0;i<10;i++){for(j=0;j<124;j++);}}i和j定义为int整型时,for循环执行时间为8个机器周期,当i和j定义为char字符型时,for循环执行时间3个机器周期。";〞一个机器周期,每次调用for循环2个机器周期。则执行本段延时程序是内循环时间t1=8*124+3个机器周期,其中"8〞执行for循环指令时间;"124〞为for循环次数;"3〞为每次调用for循环指令的时间。外循环t2=t1*10+8*10+3其中"10〞为for循环次数;"8〞为一次for循环指令调用和执行时间;"10〞为调用for循环次数,3为调用for循环指令时间。所以本程序延时t=〔〔8*124〕+3〕*10+8*10+3=10033=10.033ms≈10ms。注意:变量为整型时,每次调用for循环需要3个机器周期的调用时间,执行for循环判断需要8个机器周期的执行时间;字符型变量时,每次调用for循环需要2个机器周期的调用时间,执行for循环判断需要3个机器周期的执行时间。程序运行到第一个断点所用时间0.00038900s,运行到第二个断点所用时间为0.01042800s,则执行delay_10ms()函数所用时间为0.010428-0.000389=0.010039s=10.039ms≈10ms。由于断点的原因,执行P0=0*ff;和P0=0*fe;指令也花费了时间所以这里时间是10.039ms而不是上面计算出的10.033ms。2.10μs短暂延时*********************************************************************文件名称:voiddelay10μs()功能:10μs延时参数:单片机晶振12MHz,机器周期1μs*********************************************************************voiddelay10μs(){_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();}函数中共用了6个_NOP_()语句,每个语句执行时间为1μs。主函数调用delay10μs()时,先执行一个LCALL指令〔2μs〕,然后执行个_NOP_()语句〔6μs〕,最后执行了一个RET指令〔2μs),所以执行上述函数时共需要10μs。可以把这一函数当作根本延时函数,在其他函数中调用,即嵌套调用,以实现较长时间的延时;但需要注意,如在delay40μs()中直接调用4次delay10μs()函数,得到的延时时间将是42μs,而不40μs。这是因为执行delay40μs()时,先执行了一次LCALL指令〔2μs),然后开场执行第一个delay10μs(),执行完最后一个delay10μs()时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在delay80μs()中两次调用delay40μs(),则也要先执行一次LCALL指令〔2μs〕,然后执行两次delay40μs()函数〔84μs〕,所以,实际延时时间为86μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在delay80μs()中直接调用8次delay10μs(),此时的延时时间为82μs。通过修改根本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。二.定时中断:1.定时器/计数器:8051单片机有2个16为定时器/计数器〔8052有3个〕,它可设置为计数方式,对外部事件〔脉冲〕进展计数;也可以设置为定时方式,对标准时钟脉冲进展定时计时。它有4中工作方式,定时和计数范围可以通过软件编程进展设定。一旦定时或计数到位,就会立即向CPU发送中断请求,CPU根据定时或计数结果对外设实行控制。单片机具有5~8个中断源,2级中断优先级。它可接收外部中断请求、定时器/计数器中断请求和串行口中断请求。对紧急事件的实时控制、故障自动处理、单片机与外设之间的数据传输、人机对话等。定时器/计数器的核心是两个16位的加法计数器,T0,T1分别由两个8位的特殊功能存放器TH0,TL0和TH1,TL1构成。定时器/计数器工作方式控制器TMOD,字节地址89H:GATEC/T非M1M0GATEC/T非M1M0|定时器/计数器T1|定时器/计数器T0|GATE:GATE为0时,定时器/计数器由软件控制位TR*〔*为0或1〕来控制启动或停顿,1启动,0停顿;GATE为1时,由外部中断引脚INT0非或INT1非和TR*共同控制,INT非为高电平和TR*为1启动,低电平和0停顿。C/T非:C/T非为0时,定时器/计数器为定时器方式,对晶振脉冲的12分频信号进展计数。为1时,定时器/计数器为计数器方式,对外部引脚T0(P3.4)或T1(P3.5)输入的脉冲进展计数。CPU在每个机器周期的S5P2期间,对T0或T1引脚进展采样,在前一个周期采得值为1,后一个周期采得值为0,则计数器加1。由于确认一次负跳变需要两个机器周期,因此最高计数频率为晶振频率的1/12。工作方式:M1M0工作方式00方式0,为13位定时器/计数器,2^13=819201方式1,为16位定时器/计数器,2^16=6553610方式2,为8位自动重装载计数初值定时器/计数器,2^8=25611方式3,定时器/计数器T0分成两个独立的8位定时器/计数器定时器/计数器控制存放器TCON,字节地址88H,可位寻址:TF1TR1TF0TR0IE1IT1IE0IT0TF1/TF0:定时器/计数器溢出标志位,溢出时由硬件置1,向CPU申请中断或查询,CPU响应中断后,由硬件自动清0。TR1/TR0:定时器/计数器运行控制位,由软件置1或清0,置1时启动定时器/计数器,清0时停顿计数。IT0/IT1:外部中断0/外部中断1触发方式选择位。IT0/IT1=0为电平触发方式,IT0/IT1=1为跳变触发方式。IE0/IE1:外部中断0/外部中断1中断请求标志位。IE0/IE1=1表示在向CPU申请中断。中断:中断是指CPU正在处理*件事情时,外部发生的*一事件〔如一个电平的变化,一个脉冲沿的发生或定时器/计数器溢出等〕请求CPU迅速去处理。于是,CPU暂时中断当前的工作,转去处理所发生的事件。中断效劳处理完成后,再回到原来被中止的地方,继续原来的工作,此过程即为中断。8051中断系统共有5个中断源,分别为1.外部中断0请求2.外部中断1请求3.定时器/计数器T0溢出中断请求4.定时器/计数器T1溢出中断请求5.串行口中断请求1〕串行口控制存放器SCON,字节地址98H,可位寻址。SM0SM1SM2RENTB8RB9TIRI与中断系统有关的标志位时TI和RI。TI:串行口的发送中断请求标志位。CPU将一字节的数据写入发送缓冲器SBUF时,就启动一帧串行数据的发送,没发送完一帧串行数据后,硬件自动置TI位为1。〔发送完一帧数据,假设还要接着发送,则为了下一次发送做准备,需要软件将TI清0〕RI:串行口的接收中断请求标志位。在串行口允许接收时,每接收完一帧串行数据,硬件自动置RI位为1。〔接收完一帧数据,假设还要接着接收,则为了下一次接收做准备,需要软件将RI清0〕中断允许控制存放器IE,字节地址A8H,可位寻址。EA——ESET1E*1ET0E*0EA:中断允许总控制位。EA=0,CPU关中断。EA=1,CPU开中断。ES:串行口中断允许控制位。ES=0,制止中断。ES=1,允许中断。ET0/ET1:定时器/计数器0/1中断允许控制位。0制止中断,1允许中断。E*0/E*1:外部中断0/1中断允许控制位。0制止中断,1允许中断。中断优先级控制存放器IP,字节地址B8H,可位寻址。———PSPT1P*1PT0P*0PS:串行口中断优先级控制位。1为高优先级,0为低优先级。PT0/PT1:定时器/计数器0/1溢出中断优先级控制位。1为高优先级,0为低优先级。P*0/P*1:外部中断0/1中断优先级控制位。1为高优先级,0为低优先级。查询中断方式编程:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h>//包含51单片机存放器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7引脚voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0*10;//使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的低8位赋初值TR1=1;//启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;//将P3.7引脚输出电平取反TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的低8位赋初值}}中断方式编程:用定时器T0的中断控制1位LED闪烁#include<reg51.h>//包含51单片机存放器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚/**************************************************************函数功能:主函数**************************************************************/voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0*01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的低8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待中断;}/**************************************************************函数功能:定时器T0的中断效劳程序***************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论