七天入门单片机——定时器/计数器及实验主讲人:姜瀚文2011年7月26日主讲人:姜瀚文定时/计数器及实验本讲内容:定时/计数器的概念MCS51单片机的定时/计数器定时器的工作模式及控制方法课堂实验主讲人:姜瀚文定时/计数器的概念计数器的定义:可以计量输入时钟的个数,结果以二进制表示,存放在若干字节(取决于计数器的长度)的RAM中,该部分存储单元称为计数寄存器。精确的时钟信号+计数器=定时器计数器计数寄存器脉冲个数:5输入5个时钟脉冲主讲人:姜瀚文MCS51的定时/计数器MSC51片内有两个16位定时器/计数器,即定时器0(T0)和定时器1(T1),它们都有定时和事件计数的功能。其中,T0由两个8位特殊功能寄存器TH0和TL0构成;T1由TH1和TL1构成。每个定时器都可由软件设置为定时工作方式或计数工作方式及其他灵活多样的可控功能方式(指的是定时器的4种工作模式)。主讲人:姜瀚文定时工作方式在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可看作是对计算机机器周期的计数器(因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号)。故其频率为晶振频率的1/12。如果晶振频率为12MHZ,则定时器每接收一个输入脉冲的时间为1us。主讲人:姜瀚文计数工作方式设置为计数工作方式时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。单片机采样T0或T1的输入电平,若在前一个机器周期采样为1,下一个机器周期采样值为0,则计数器加1,所以最高计数频率为振荡频率的1/24。为了确保某个电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期。主讲人:姜瀚文小结不管是定时还是计数工作方式,定时器T0或T1在对内部时钟或对外部事件计数时,不占用CPU时间,除非定时器/计数器益处,才可能中断CPU的当前操作。由此可见,定时器是单片机中效率高而且工作灵活的部件。主讲人:姜瀚文中断讲解中断的概念在程序运行期间,自动响应非预期的紧急事件的发生。通常是为了避免查询方式的程序设计。用得最多的是外部中断与定时器中断。外部中断:按键程序定时器中断:定时与循环扫描等应用场合中断服务程序中断发生时,主程序暂停,跳转到中断服务程序,称为“响应中断”。执行完毕后返回主程序继续运行。中断服务程序不能被调用、没有返回值,编写程序时不知道会在程序的何处发生中断。主程序主程序响应中断中断返回中断服务程序主讲人:姜瀚文中断讲解C语言中采用一类特殊的函数来实现中断服务程序,叫做“中断服务函数”,格式如下void函数名()interruptN函数名可以任意,但一般要用一个有意义的函数名,例如int0_srv;N代表中断向量编号,外部INT0的中断服务函数中断向量号为0,外部中断INT1的N=2,定时器T0的N=1,定时器T1的N=3。主讲人:姜瀚文如何使用定时器?P3.0/RXD10EA/VPP31X119X218RESET9P3.7/RD17P3.6/WR16P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.5/MOSI6P1.6/MISO7P1.7/SCK8P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P2.7/A1528PSEN29ALE/PROG30P3.1/TXD11GND20VCC40U2(AT/STC/SST)89(S/C)5X8051片内存储器 SFR RAMFF807F004KBROM00000FFF主讲人:姜瀚文定时器的控制MCS51定时/计数器相关的寄存器MCS51定时器/计数器有四种工作模式,其工作方式的选择及控制都由两个特殊功能寄存器(TMOD和TCON)的内容来决定。TMOD和TCON寄存器在复位时其每一位均清零。定时器的方式寄存器TMOD特殊功能寄存器TMOD为定时器的方式控制寄存器,寄存器中每位的定义如图所示。高4位用于定时器1,低4位用于定时器0。GateC/TM1M0TMOD00010000示例D7D6D5D4D3D2D1D0GateC/TM1M0主讲人:姜瀚文工作方式选择表M1M0方式说明00013位定时器/计数器01116位定时器/计数器102自动装入时间常数的8位定时器/计数器113对T0分为两个8位独立计数器;对T1置方式3时停止工作(无中断重装8位计数器)定时器的方式寄存器TMOD1.M1M0:定时器/计数器四种工作方式选择GateC/TM1M0TMOD00010000示例D7D6D5D4D3D2D1D0GateC/TM1M0主讲人:姜瀚文定时器的方式寄存器TMOD2.C/T:定时器方式或计数器方式选择位。C/T=1时,为计数器方式;C/T=0时,为定时器方式。3.GATE定时器/计数器运行控制位,用来确定对应的外部中断请求引脚(INT0,INT1)是否参与T0或T1的操作控制。当GATE=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数(TCON各位含义见后面叙述);当GATE=1时,不仅要TCON中的TR0或TR1置位,还需要P3口的P3.2或P3.3引脚为高电平,才允许计数。GateC/TM1M0TMOD00010000示例D7D6D5D4D3D2D1D0GateC/TM1M0主讲人:姜瀚文定时器控制寄存器TCON1.TR0:T0的运行控制位。该位置1或清0用来实现启动计数或停止计数。2.TF0:T0的溢出中断标志位。当T0计数溢出时由硬件自动置1;在CPU中断处理时由硬件清为0。3.TR1:T1的运行控制位,功能同TR0。4.TF1:T1的溢出中断标志位,功能同TF0。D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TCON0100示例用于外部中断主讲人:姜瀚文模式1及应用MCS51定时器工作于方式1当M1:M0设置为01时,定时器选定为方式1工作。在这种方式下,由TH0和TL0组成一个16位计数器。1.当GATE=0时,只要TCON中的TR0为1,TL0及TH0组成的16位计数器就开始计数.2.当GATE=1时,此时仅TR0=1仍不能使计数器计数,还需要P3.2引脚为1才能使计数器工作。由此可知,当GATE=1和TR0=1时,TH0+TL0是否计数取决于P3.2引脚的信号,当P3.2由0变1时,开始计数;当P3.2由1变0时,停止计数,这样就可以用来测量在P3.2端出现的脉冲宽度。当16位计数器从0或设定的初值,加1到全“1”以后,再加1就产生溢出。这时,置TCON的TF0位为1,同时把计数器变为全“0”主讲人:姜瀚文160:0212OSCTFTHTLD7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TCON0100示例用于外部中断MCS51定时器使用步骤(工作于方式1)1.初始化TMOD,设置工作模式。2.根据定时间隔,计算并初始化TH0与TL0的数值。计算公式如下。其中FOSC是晶振频率(单位:Hz),T是定时间隔(单位:S)3.如果中断方式使用定时器,则需置位中断允许控制寄存器(IE)中的ET0或ET1,而且要打开全局中断(EA=1)。同时要写好中断服务函数。4.将TR0或TR1置位,启动定时器。GateC/TM1M0TMOD00010000示例D7D6D5D4D3D2D1D0GateC/TM1M0主讲人:姜瀚文定时间隔计算公式的推导过程1.计算时钟周期:MCS51的定时器的时钟源就是CPU的工作时钟,因此时钟周期t。例如晶振频率24MHz时,t=0.5*10-6S2.计算定时间隔经历的时钟周期数N。例如期望的定时间隔是10mS,则N=20000。3.计算TH0:TL0的初值。对于T=10mS,FOSC=24MHz,结果为45535112CPUOSCtFF/12OSCTFNTt160:026553612OSCTFTHTLN主讲人:姜瀚文模式0及应用该模式结构与操作几乎与模式0完全相同,唯一的差别是:16位寄存器(TH0和TL0)只用了13位。其中,TL0的高3位未使用,其余位为整个13位的低5位,TH0占高8位。当TL0的低5位溢出时,向TH0进位;TH0溢出时,向中断标志位TF0进位,申请中断。模式0的最大定时时间:模式1的最大定时时间:1312(21)oscTf1612(21)oscTf:oscf晶体振荡频率主讲人:姜瀚文模式1实例程序voidinit_tc0(void)//24MHz时定时10mS{TMOD|=0x01;//定时器模式TH0=(65535-20000)8;//初值高8位TL0=(65535-20000)&0xff;//初值低8位EA=1;//打开全局中断ET0=1;//开定时中断TR0=1;//启动定时器}voidtc0_srv(void)interrupt1//定时器0中断服务程序{TH0=(65535-20000)8;//重置初值高8位TL0=(65535-20000)&0xff;//重置初值低8位}voidmain(void){init_tc0();while(1);//条件总为真,死循环}主讲人:姜瀚文蜂鸣器实验一中断方式使用定时器实验内容:使用定时器T0定时,使蜂鸣器每隔1S响一次,一次响一秒钟。主讲人:姜瀚文蜂鸣器实验一中断方式使用定时器主讲人:姜瀚文蜂鸣器实验一中断方式使用定时器主讲人:姜瀚文蜂鸣器实验一中断方式使用定时器为了使OUT3驱动蜂鸣器,锁存器U22的所存使能端要为高电平,从而CS4和WR要同时为低电平,所以对P2和P3引脚的操作为:P3&=~(16);P2=0x80;主讲人:姜瀚文#includereg52.h//必要的头文件#includeabsacc.h//必要的头文件sbitBUZ_BIT=P0^3;//控制蜂鸣器的IO口unsignedintcnt;voidinit_tc0(void)//24MHz时定时10mS{TMOD|=0x01;//定时器模式TH0=(65535-20000)8;//初值高8位TL0=(65535-20000)&0xff;//初值低8位EA=1;//打开全局中断ET0=1;//开定时中断TR0=1;//启动定时器}蜂鸣器实验一中断方式使用定时器主讲人:姜瀚文voidtc0_srv(void)interrupt1//定时器0中断服务程序{TH0=(65535-20000)8;//重置初值高8位TL0=(65535-20000)&0xff;//重置初值低8位if(cnt100)//10mSX100=1S{cnt++;}else{BUZ_BIT=~BUZ_BIT;cnt=0;//计数归零}}voidmain(void){init_tc0();P3&=~(16);P2=0x88;//此代码用于选通蜂鸣器,while(1);//条件总为真,死循环}蜂鸣器实验一中断方式使用定时器主讲人:姜瀚文流水灯实验二实验内容:使八个发光二极管每隔1S钟亮一次。关闭蜂鸣器的程序代码:P3&=~(16);P2=0x80;BUZ_BIT=0;P3|=(16);P2=0xE0;P0=0xff;主讲人:姜瀚文数码管实验三定时中断方式扫描数码管八段数码管由八段LED构成,各LED阴极或阳极并在一起,称为“位选线”:共阴、共阳,其余8个引脚各自引出,