Ⅰ 单片机中断有什么作用
51单片机中的外部中断有什么作用?
可以打个比方,每天上班你都随时需要知道你同事的工作进度情况,你是希望你不停地打个电话去问“你做完了吗”,还是希望他做完了主动打个电话给你讲“我做完了,我们谈谈吧”。这就是中断的意义,在不需要的时候不影响处理 器做其它的事情,提高效率,增强程序的实时性。
51单片机中什么是中断?其作用是什么?怎么用?用自己的理解回答把
中断就是中途打断。
通俗解释:
你在看影碟,有人敲门(中断源),中断了你看影碟,观看暂停。处理敲门的事宜(中断目的),处理完成(中断结束),继续看影碟(继续执行原来的任务)。
再比如:你在看电视,水开了(中断源),把水灌到暖瓶里(中断目的),再烧上一壶(继续开中断),回去看电视。水又开了。。。。。。。。(循环中断)
以51单片机16位定时计数器0(T0)来讲,
计数是T1是一个能盛65536(十六位时)滴水的水盆,在水龙头下水一滴滴地滴入盆中。如果盆是空的那水在滴完65536滴水时盆子的水就满了再滴一滴的时候就溢出了。这时就会产生中断。
如果盆里面已经装入65500滴水(即初装值),那么只需要36滴水后就溢出了。
每一个水滴计数时即一个脉冲(高低电平变换一次)。
定时时每一个水滴即一个机器周期,水滴的速度即机器周期,等于12个振荡周期(晶振的振荡频率除以12),直接影响到溢出的时间。
51单片机中断系统的作用?
如果没有中断系统,就只能由 CPU 按照程序编写的先后次序,对各个外设,进行巡回检查与处理。
这就是查询式工作方式。
貌似公平,实际效率却不高。
如果有了中断系统,整个计算机系统,就具有了应付突发事件的处理能力。
这就是中断式工作方式。
单片机的中断标志位是有什么作用?
四个问号分为四点一一解答:
1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起,
2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况
3、周期性中断是由定时器辅助完成的,只要定时时间到,硬件就会自动置位标志位,这时中断发生,定时器还在运行,与中断处理是并行的没有冲突,因此周期性的中断不是从中断标志位清零开始的。
4、如果中断程序没有执行完并且一下个中断又来了,那么硬件还是会自动置位标志位的,如果在这之前已经清零标志位那么中断结束后会再进入一次该中断,如果这时还没有清除中断标志位,则第二个1毫秒中断无效。
单片机全局中断有什么用
本人觉得是因为现在有中断正在执行,为了不让高优先级的中断使现在的中断发生中断,而采取的保护程序
51单片机中断有什么作用
打个比方,你在房间看书,看书这个事是持久性的,拖延几分钟也没事。突然淘宝买的衣服送到了,镖局的人敲门,你用书签做好标记去开门。拿回衣服,回去继续看书。这个事的发生过程很正常。
同样的,看书就像单片机的一般事务处理,收快递就像中断。主要是应对紧急的,有时效要求的事件的发生。书签就是进出中断相关的现场保护。
具体点,主程序中有LED不停的闪烁,由于外部按键的触发,告诉你该发个字节出去。这时,可以产生个按键相关的中断(引脚电平中断),去中断发个字节,然后赶紧回来继续闪烁LED。
重要总结:就这么回事!
单片机程序什么作用啊 尤其是X++作用 定时器中断作用是什么呢?
x应该是一个全局变量,每次中断函数都会将x加1,程序的其余函数会扫描x的值来做出相应的动作,
interrupt 1 是计时器中断,这里应该是用一个全局变量计时,main函数或者其他中断函数检查x的数值做到定时的响应,如闪灯或者屏幕刷新又或者PWM输出 ,
定时器中断的作用是在CPU运行期间 ,定时器在不干扰CPU正常运行的情况下不停地将自身寄存器(从你的函数初始化看是TH0和TL0并起来的一个16位值)减一,当寄存器值为0时候发起中断(从1减去1开始到寄存器值为0之间发起的),这样可以做到CPU不用一直等待一个时间的到来而空转,或者运行一个程序的过程中计算运行的时间并定时插入一个额外的工作,
C51的计时器有4个工作模式(对于At89S51或者STC89C52及以上型号来说)不同的模式有不同的功能,这个网络文库能看到的,另外TMOD寄存器和其他寄存器还设定了计时器是外部的跳变信号或者单片机内部时钟来引起计时器的一次减1动作(计时动作)。
另外计时器可以设置为外部输入模式,这样就能作为计数器,比如说一个外接的按键,按10次后才触发中断,如果用外中断处理,那么整个主函数会被中断九次做无效中断才能等到第十次按键执行需要的中断处理动作。
这一点在操作系统中也用到了,比如我们的PC的多任务操作系统,就是用时钟中断来把一个程序中断执行另一个程序(比如操作系统和应用程序间)实现了时间片轮转,不过PC的操作系统把所有的中断处理函数都包含进去了,所以我们基本不用去管硬件中断就能编程。 反观单片机,因为资源有限,想要做到多任务(主函数与各个中断函数及其子函数)必须用定时器(也可以通过外部信号做计数器)以及外中断作为契机来切换多个任务。
如果需要解答整个中断函数的功能,最好把全部的程序都帖出来,因为x这个全局变量的作用没有在中断函数中体现
有问题可以继续跟我交流,我现在是大学本科生,学过C51单片机,正在学STM32
单片机中断寄存器的作用是什么?
中断寄存器就是用于存贮中断状态的 包含是否启用中断 或者是 是否发生中断
#include void InitUART(void){ TMOD = 0x20; 计时器类型 SCON = 0x50; TH1 = 0xFD; TL1 = TH1; PCON = 0x00; EA = 1; 中断寄存器的操作 ES = 1; TR1 = 1; 计时器1的中断}void SendOneByte(unsigned char c){ SBUF = c; while(!TI); TI = 0;}void main(void){ InitUART();}void UARTInterrupt(void) interrupt 4{ if(RI) { RI = 0; add your code here! } else TI = 0;}
单片机中断 的interrupt 0 using 1中的using有什么作用
看到楼上二位说的有误,特纠正。
void INT0()interrupt 0 using 1
{....
棱....
}
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是串行口中断;
using 0 是第0组寄存器;
using 1 是第1组寄存器;
using 2 是第2组寄存器;
using 3 是第3组寄存器;
51单片机内的寄存器是R0--R7(不是R0-R3)
R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。
using 0时设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H)
using 1时设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH)
using 2时设置 RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H)
using 3时设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH)
单片机为什么使用中断
中断保护现场,是为了你中断子程序执行完以后能够返回到你程序中中断点,即产生中断的地方,使程序能够继续向下执行!!!!
如过你说的不用保护现场的话,那么程序执行完以后就不能够回到现场,那么你的程序将不知道要跳转到那里去了,也就是飞鸟,呵呵……
你说的中断嵌套,也是一样的,两者都要保护现场,不然你也不能够回到现场,程序也会飞的!!!!
而我们保护现场的数据都是放在堆栈中的,因此,你的中断次数也不能够超过堆栈的级数,那样数据也会丢失!!!!
说白了,中断它不同于子程序,子程序是固定好了的,返回的位置也固定了;而中断我们不能够预知它在那里发生中断,因此要保护现场,使中断子程序执行完后返回到中断的地方!!!
呵呵……说的太多了!!!
我知道你说的意思了,但是你要知道,中断现场保护是在中断子程序中进行的,因此当你高一级的中断发生的时候(他们不可能共用一个中断子程序,如果是同一中断,那也不可能,因为51中断中你进入中断子程序后要将禁止该中断再次中断,好象似的,嘿嘿……你可以试试),在高一级的中断子程序中也有现场保护,你的问题就是没有把现场保护放对地方!!!!!
============================================================
它们是把现场保护在同一堆栈中,我跟你打个比方吧,假如说堆栈的地址是80H,低一级的中断要保护的是1,2,3;高一级要保护的现场是4,5,6,那么在低一级的中断发生的时候,现场保护1,2,3将压如堆栈,(顺序书上应该有,这里是个比喻),那我先压入1,堆栈阀址加1,压入2,堆栈地址再加1,如果这个时候高一级的中断发生,那么现在就应该跳到高一级中断的子程序,堆栈地址就是82H了,在将4,5,6分别压入堆栈,这样堆栈的地址就是85H,当高一级的中断子程序结束后,返回现场,堆栈的数据要从85H开始弹出,这样现场返回的就是6,5,4,这个时候程序就会跳到中断之前的地方,即底一级的中断那里,将要继续将3保护到堆栈中,在执行低一级的中断子程序.(其中,你要在中断保护现场完了后将中断标志清0啊,不然它始终会中断的,不可能去执行程序去了...)
Ⅱ MCS-51系列单片机中的定时器有哪几个专用寄存器它们各自的作用是什么
要讲定时离不开中断,两者结合使用的。定时计数器主要用到TMOD工作模式寄存器,TCON定时器的控制寄存器,EA中断允许控制寄存器,IP中断优先级寄存器 定时器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONTF0/TF1:定时器0/定时器1溢出中断申请标志位: =0:定时器未溢出; =1:定时器溢出申请中断,进中断后自动清零。TR0/TR1:定时器运行启停控制位: =0:定时器停止运行; =1:定时器启动运行。TCON:Timer控制寄存器,是管理定时器工作的SFR(其中低4位管外部中断)定时器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONIE0/IE1:外部中断申请标志位: =0:没有外部中断申请; =1:有外部中断申请。IT0/IT1:外部中断请求的触发方式选择位: =0:在INT0/INT1端申请中断的信号低电平触发; =1:在INT0/INT1端申请中断的信号负跳变触发.TCON:Timer控制寄存器,低4位管理外部中断�8�4在CPU已经开放了外部中断允许的前提下:�8�4在INT0/INT1引脚输入一个负脉冲或低电平, �8�4TCON寄存器中的IE0/IE1标志位自动变“1”, 检测到IE0/IE1变“1”后,将产生指令:执行中断服务程序,�8�4并将IE0/IE1标志位自动清“0”,以备下次申请。外部中断(INT0,INT1)申请过程 单片机的定时/计数器定时器计数器的概念一、计数的概念
选票:画“正”。这就是计数,生活中计数的例子处处可见。比如一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。51单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536。
二、定时
计数器是如何作为定时器来用的呢?比如一个闹钟,将它定时在1个小时后响闹,我们也能说成是秒针走了(3600)次,所以时间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间十分相关。那么它们的关系是什么呢?也就是秒针每一次走动的时间要正好是1秒。
只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器和计数器是同一个东西,只不过计数器是记录的外部的触发脉冲,而定时器则是由单片机供给一个非常稳定的计数源。供给定时器的是计数源是机器周期也就是由单片机的晶体震荡器经过12分频后获得的一个脉冲源(机器周期)。晶振的频率是很准确的,所以这个计数脉冲的时间间隔也很准。一个12M的晶振,它供给给计数器的脉冲时间间隔是1微秒。计数脉冲的间隔与晶振有关,12M的晶振,计数脉冲的间隔是1微秒。这是逻辑图,可以看到T1是一个单刀双掷开关,说明定一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用;接通T1引脚时作为外部计数用。(T0的引脚是P3.4,T1的引脚是P3.5)。
比如滴水的例子,当水持续落下,盆中的水逐渐变满,最终会有一滴水使得盆中的水全满了。这个时候如果再有一滴水落下,水会漫出来,用术语来讲就是“溢出”,而每一滴水落下,用术语来说就是发出一个计数脉冲。 水溢出是流到地上,而计数器溢出后就会引发一个定时中断事件,就象定时的时间一到,闹钟就会响一样。 现在另一个问题是:要有多少个计数脉冲才会产生事件。 刚才已研究过,计数器的容量是16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经常会有少于65536个计数值的要求,如制药厂包装线上,一瓶药片为100粒,500瓶为一箱 那么怎么样来满足这个要求呢?举例 如果是一个空的水盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还需要10000滴吗?对了,这时我们就采用预置数的办法,我要计 100,那我就先放进65436,再来100个脉冲,不就到了65536了吗。定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时65.536 毫秒,但现在我只要10毫秒,怎么办?10个毫秒为10000个微秒,所以,只要在计数器里面放进55536就可以了。溢出的概念和设置任意定时计数的方法3个16位定时器/计数器 ——(51系列有2个16位Timer少一个T2)定时器:对片内机器时钟(周期方波)进行计数计数器:对Tx引脚输入的负脉冲进行计数与Timer工作有关的特殊功能寄存器: TCON 和 TMODAT89S52单片机的定时器/计数器单片机定时/计数器内部结构单片机定时/计数器内部结构图定时器的2个特殊功能寄存器(TCON)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0定时器控制寄存器TCON (88H)TF0/TF1: 定时器0/1计数溢出标志位。 =1 计数溢出; =0 计数未满 TF0/TF1标志位可用于申请中断或供CPU查询。 在进入中断服务程序时会自动清零;但在 查询方式时必须软件清零。TR0/TR1: 定时器0/1运行控制位。 =1 启动计数; =0 停止计数TR0/TR1:定时器0/1运行控制位: TR0/TR1 =0 时,Timer0/1停止计数 TR0/TR1 =1 时,Timer0/1启动计数定时器T0/T1 中断申请过程�8�4 在已经开放T0/T1中断允许且已被启动的前提下:�8�4 T0/T1加满溢出时 TF0/TF1标志位自动置“1” �8�4 检测到TCON中TF0/TF1变“1”后,将产生指令: 执行中断服务程序,�8�4 TF0/TF1标志位会自动清“0”,以备下次中断申请。 定时/计数器可按片内机器周期定时,也可对由T0/T1引脚输入一个负脉冲进行加法计数TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCON (88H)GATE C / T M1 M0 GATE C / T M1 M0定时器方式寄存器TMOD (89H)T1T0M1,M0:工作方式定义位 ( 定义4 种方式 ):C/T :计数器/定时器选择位 = 1 外部事件计数器。对T0/T1引脚的负脉冲计数; = 0 片内时钟定时器。对机器周期脉冲计数定时0 0:13位 定时器——几乎不用0 1:16位 定时器——经常用到1 0:可自动重装的 8位 定时器——经常用到1 1:T0 分为2个8位 Timer;T1 此时不工作 ——几乎不用GATE C / T M1 M0 GATE C / T M1 M0T1T0GATE门控位: Timer可由软件与硬件两者控制 �8�4 GATE = 0 ——普通用法 Timer的启/停由软件对TRx位写“1”/“0”控制定时器方式寄存器TMOD(89H)�8�4 GATE = 1 ——门控用法 Timer的启/停由软件对TR0/TR1位写“1”/“0” 和在INT0/INT1引脚上出现的信号的高/低共同控制GATE=0时,定时/计数是否工作,只取决于TR0是否为1。GATE=1,只有TR0为1,且INT0管脚也是高电平,定时/计数才工作。 从电路上看到GATE是一个非门,它与INTx组成一个或门,这个或门与TR0又组成一个与门。当GATE=0时,则~GATE=1(非门),此时无论INT0为高或低,它们相或之后必然为1,此时只要TR0=1,则工作,TR0=0则不工作,不受INT0的影响。当GATE=1时,~GATE=0,则INT0=1时,它们相或为1,此时定时器是否工作受TR0影响;若INT0=0,则无论TR0为什么,定时器都不能工作,即当GATE=0时,定时器受INT0和TR0共同的作用。 所以,GATE位的状态决定定时器运行控制取决于TR0的一个条件还是TR0和INT0引脚这两个条件。当GATE=1时,由于GATE信号封锁了与门,使引脚 INT0信号无效。而这时候如果TR0=1,则接通模拟开关,使计数器进行加法计数,即定时/计数工作。而TR0=0,则断开模拟开关,停止计数,定时 /计数不能工作。 当GATE=0时,与门的输出端由TR0和INT0电平的状态确定,此时如果TR0=1,INT0=1与门输出为1,允许定时/计数器计数,在这 种情况下,运行控制由TR0和INT0两个条件共同控制,TR0是确定定时/计数器的运行控制位,由软件置位或清“0”。振荡器�8�112TLx THx (8位) (8位)TFx申请中断Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 开关或门与门非门定时器结构与工作方式工作方式1:——16位的定时/计数器在工作方式1下,计数器的计数值范围是: 1~65536(216)
当为定时工作方式1时,定时时间的计算公式为:
(216—计数初值)╳晶振周期╳12或 (216—计数初值)╳机器周期
其时间单位与晶振周期或机器周期相同。
�8�4 THx/TLx赋初值:THx赋高8位,TLx赋低8位工作方式1 的编程要点: �8�4 TMOD选方式: 写“M1,M0”=01 选方式1�8�4 若不用门控位,直接用软件写TRx控制启/停�8�4 若使用门控位,先置位TRx,然后由INTx端 的高/低电平来控制其启/停�8�4 若要允许中断,还须先置位ETx、EA等中断 允许控制位,并编写中断服务程序�8�4 若不用中断,可查询“计数溢出标志TFx” 的方式工作,但溢出标志TFx须软件清0工作方式2:——8 位自动重装的定时/计数器振荡器�8�112TLx (8位)TFx申请中断Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 =1开关接通或门与门THx (8位)溢出位门开�7�4 THx/TLx赋相同初值 在TLx计数达到0FFH 再加“1”时,TL0 将溢出,进位位直接进入“TFx”去申请 中断,同时打开三态门,使THx中的值 自动重装(Copy)进TLx工作方式 2 的编程:�7�4 TMOD寄存器选方式: 写“M1,M0” = 10选中方式2�7�4 其他用法与各种方式1完全相同T0: 组织成TL0和TH0两个8位定时/计数器Timer工作方式 3 ——几乎无用T1: 不再是定时/计数器了 T1 的TR1和TF1出借给TH0当控制位使用, 剩下的TH1/TL1寄存器只能当作普通寄存 器用。振荡器�8�112TL0 (8位)TF0申请中断T0端TR0位GATE位INT0端≥1&C/T=0C/T=1控制 =1开关接通或门与门TH0 (8位)TF1申请中断TR1位控制 =1Timer工作方式 3 结构:�7�4T0成为双 8位Timer �7�4T1不再有Timer功能 �7�4TF1,TR1出借给TH0 定时器小结: (2个16位加法计数器)�7�4运行/停止由TRx位控制,(当GATE=1时: 由TRx位和Tx引脚上的信号共同控制)�7�4工作方式由TMOD决定; 计数/定时由C/T位决定 工作方式0(13位) 永远不用 工作方式3(T0拆为双8位) 几乎无用 工作方式1(16位) 经常用到 工作方式2(8位自动重装) 经常用到�7�4从初值按机器周期或外部脉冲递加,溢出位 TFx申请中断;中断允许由ETx位和EA位控制,定时器/计数器的定时/计数范围 工作方式0:13位定时/计数方式,因此,最多能计到2的13次方,也就是8192次。 工作方式1:16位定时/计数方式,因此,最多能计到2的16次方,也就是65536次。 工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多能计到2的8次方,也说是256次。 预置值计算:用最大计数量减去需要的计数次数即可
Ⅲ 单片机定时器/计数器主要有什么作用
作用:可以计时,计数,可以产生时间中断,是系统中比较实用的工具。
大部分单片机提供2~3个定时/计数器,少数提供1个或4个定时器。有些定时/计数器还具有输入捕获、输出比较和PWM(脉冲宽度调制)功能,如AVR单片机。
有的单片机还有专门的PCA(可编程计数器阵列)模块和CCP(输入捕获输出比较PWM)模块,如PIC和Philips的部分中高档单片机。利用这些模块不仅可以简化软件设计,而且能减少占用CPU的资源。现在不少单片机还提供了看门狗定时器(WDT),当单片机“死机”后可以自动复位。
定时/计数器
定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。
以上内容参考:网络-定时器中断
Ⅳ 单片机定时中断实验
跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1;
//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此
th0=(65536-45872)/256;
//重新装载初值tl0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void
t0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01;
//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?
(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)
Ⅳ 单片机定时器与计数器的区别
在51单片机的学习过程中,我们经常会发现中断、计数器/定时器、串口是学习单片机的难点,两者的区别是什么呢?下面就跟着我一起来看看吧。
单片机计数器与定时器的区别
计数器和定时器的本质是相同的,他们都是对单片机中产生的脉冲进行计数,只不过计数器是单片机外部触发的脉冲,定时器是单片机内部在晶振的触发下产生的脉冲。当他们的脉冲间隔相同的时候,计数器和定时器就是一个概念。
在定时器和计数器中都有一个溢出的概念,那什么是溢出了。呵呵,我们可以从一个生活小常识得到答案,当一个碗放在水龙头下接水的时候,过了一会儿,碗的水满了,就发生溢出。同样的道理,假设水龙头的水是一滴滴的往碗里滴,那么总有一滴水是导致碗中的水溢出的。在碗中溢出的水就浪费了,但是在单片机的定时计数器中溢出将导致一次中断,至于什么是中断我们下次再讲,这里只是初步的提下概念,中断就是能够打断系统正常运行,而去运行中断服务程序的过程,当服务程序运行完以后又自动回到被打断的地方继续运行。
在定时器计数器中,我们有个概念叫容量,就是最大计数量。方式0是2的13次方,方式1是2的13次方,方式2是2的8次方,方式3是2的8次方。把水滴比喻成脉冲,那么导致碗中水溢出的最后一滴水的就是定时计数器的溢出的最后一个脉冲。
在各种单片机书本中,在介绍定时计数器时都讲到一个计数初值,那什么是计数初值呢?在这里我们还是假设水滴碗。假设第一百滴水能够使碗中的水溢出,我们就知道这个碗的容量是100。问题1,我如何才能使碗接到10滴水就溢出呢?呵呵,我可以想象,如果拿一个空碗去接水,那么还是得要100滴水才能溢出,但是如果我们拿一个已经装有水的碗拿去接,那就不用100滴了。到此我们可以算出,要使10滴水让碗中的水溢出,那么碗中就先要装90滴水。
在定时计数器中,这90滴水就是我们所谓的初始值。问题2,在一个车间我们如何利用单片机对100件产品进行计件,并进行自动包装呢?
我们可以利用计数器计数100,在中断中执行一个自动包装的动作就可以了。
在这里计数初值有3个,假设有方式0:计数初值=8912(2的13次方)—100=8812。方式1:计数初值=65536(2的16次方)—100=65436。方式0:计数初值=256(2的8次方)—100=156。
根据所得的初始值,再将其转换为16进制或者2进制,就可以进行计数或者定时了。当然要让程序完全的运行起来还需要相应的寄存器进行设置。这些可以从各种单片机教程中找到。
单片机中定时器与计数器的区别
定时器实际上也是计数器,只是计数的是固定周期的脉冲
定时/计数器很容易理解的啊
定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
单片机里的寄存器可以看成一个个电子开关,用来切换不同的功能、信号。
51里通过TMOD里的T/C 位切换计数信号的来源
当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率为1/12fosc,当晶振频率6MHZ时,计数频率为500KHz,每2us计数值加1;晶振12MHZ就是每1us加1 了。
当T/C工作在计数器是,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1 ,识别管脚负跳变需要2个机器周期,即24个振荡周期。所以T0或T1脚输入的可计数的外部脉冲的最高频率为1/24fosc,当晶振12MHZ时,最高计数频率为500KHz,高于此频率将计数出错。
至于赋初值就是杯子原理了,由于51只能加计数,且只能在杯子刚刚满的那一刻发出中断,触发中断程序,所以我们就往杯子里先放好一定的豆子,再来相应数量的豆子就满了,然后中断程序就自动工作了。
注意:
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
假设我们要定时一定时间(100个机器周期),我们就置初值为(溢出值-100)就行了,假设我们要计件100个,实际上也是置初值为(溢出值-100),然后将输入脉冲设为外部输入就可以了
所以说:定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
在中断里置初值是为下一个循环作准备,没什么好说的,看需要定了。
由于定时计数器的值也可以随时读出来,所以我们也可以从0开始计数,从而计算一段时间或一定脉冲的数量哦,这是照样可以打开中断,中断时就说明已经又计数了(定时器溢出值)个脉冲哦,在中断里进行溢出处理,就可以计算出远远大于(定时器溢出值)的数字了
此时也要注意一点:51读数时除了T/C2的捕捉功能,直接读TH和TL可是不断变化的哦,具体的还是看书。当你理解了定时计数器后,我们甚至还可以将计数值置为(溢出值-1),从而实现自动单步(定时模式)或作为外部中断(计数模式)用哦,仔细想想吧,呵呵;-)
至于中断中的需要保护现场的原因,是为了防止不小心修改了别的程序的参数,从而影响别的程序的运行,所以要且只要保护中断程序自己动过的数据,将动过的那些存储器在退出中断时恢复到进入时的状态,就不会影响被中断的程序了。
汇编需要自己保存现场,反正程序就是自己编的嘛,一切尽在掌握中;
C的话编译器会自动进行覆盖分析,自动保存需要保存的变量,一般应用时尽可放心,当然,如果你很了解编译器做了什么,也可以嵌入汇编天马行空自由发挥啊,但新手可不建议这样哦,还是交给编译器吧。
其实这些可以说都是基础知识啊,如果不明白肯定是你的书看的不够仔细哦.
猜你喜欢
1. 单片机的硬件结构是什么
2. 10秒定时器电路设计
3. 单片机技术论文
4. 单片机的发声原理
5. 单片机开题报告范文
6. 电子实习报告单片机
7. 单片机实训报告范文3篇