
设计基础定时计数器.ppt
21页3.3 51 单片机定时器单片机定时器/计数器计数器3.3.1 定时定时/计数器的工作原理计数器的工作原理计数或定时计数或定时规定:规定:规定:规定:识别一个从识别一个从识别一个从识别一个从“1”“1”“1”“1”到到到到“0”“0”“0”“0”的跳变至少要花两个机器周期的跳变至少要花两个机器周期的跳变至少要花两个机器周期的跳变至少要花两个机器周期当然,最大计数频率为晶振频率的当然,最大计数频率为晶振频率的当然,最大计数频率为晶振频率的当然,最大计数频率为晶振频率的1/241/241/241/24对外部输入脉对外部输入脉对外部输入脉对外部输入脉冲宽度的要只有低限,即输入脉冲的低电平和高电平的宽冲宽度的要只有低限,即输入脉冲的低电平和高电平的宽冲宽度的要只有低限,即输入脉冲的低电平和高电平的宽冲宽度的要只有低限,即输入脉冲的低电平和高电平的宽度至少都应保持一个机器周期,多者不限度至少都应保持一个机器周期,多者不限度至少都应保持一个机器周期,多者不限度至少都应保持一个机器周期,多者不限 这里需要注意的是:加法计数器是计满溢出时才申请中这里需要注意的是:加法计数器是计满溢出时才申请中这里需要注意的是:加法计数器是计满溢出时才申请中这里需要注意的是:加法计数器是计满溢出时才申请中断,所以在给计数器赋初值时,不能直接输入所需的计数断,所以在给计数器赋初值时,不能直接输入所需的计数断,所以在给计数器赋初值时,不能直接输入所需的计数断,所以在给计数器赋初值时,不能直接输入所需的计数值,而应输入的是计数器计数的最大值与这一计数值的差值,而应输入的是计数器计数的最大值与这一计数值的差值,而应输入的是计数器计数的最大值与这一计数值的差值,而应输入的是计数器计数的最大值与这一计数值的差值。
设最大值为值设最大值为值设最大值为值设最大值为M M M M,计值为,计值为,计值为,计值为N N N N,初值,初值,初值,初值X X X X的计算方法如下:的计算方法如下:的计算方法如下:的计算方法如下: 计数状态:计数状态:计数状态:计数状态:X=M-NX=M-NX=M-NX=M-N 定时状态:定时状态:定时状态:定时状态:X=M-X=M-X=M-X=M-定时时间定时时间定时时间定时时间÷T ,÷T ,÷T ,÷T ,而而而而T=12÷T=12÷T=12÷T=12÷晶振频率晶振频率晶振频率晶振频率 3.3.2 定时定时定时定时/ /计数器所用到的寄存器计数器所用到的寄存器计数器所用到的寄存器计数器所用到的寄存器3.3.3 定时定时/计数器的控制计数器的控制一、定时器一、定时器一、定时器一、定时器/ /计数器的设置计数器的设置计数器的设置计数器的设置1)工作方式寄存器)工作方式寄存器TMOD的设置的设置 2)控制寄存器)控制寄存器TCON的设置的设置 控制寄存器控制寄存器控制寄存器控制寄存器TCONTCONTCONTCON用于控制定时器的启动、停止和中断请求。
用于控制定时器的启动、停止和中断请求用于控制定时器的启动、停止和中断请求用于控制定时器的启动、停止和中断请求其中,其中,TCON的低的低4位与中断有关,已经作过介绍位与中断有关,已经作过介绍 高高4位含义如下:位含义如下: ①①TF0、、TF1分别是分别是T0、、T1的溢出标志位的溢出标志位 ②②TR0、、TR1分别是分别是T0、、T1的运行控制位,的运行控制位, 必须由软件置必须由软件置1或清或清0 当当TR0(或(或TR1)置)置1后,对应后,对应T0或或T1才开始工作;当才开始工作;当TR0或或(TR1)清)清0后,对应定时器后,对应定时器/计数器停止工作;在系统复位时计数器停止工作;在系统复位时TR0或或(TR1)被清)被清0 一、定时一、定时/ /计数器的工作模式(计数器的工作模式(M1M1,,M0M0))1 1)模式)模式)模式)模式0 0 【【【【M1,M0=00M1,M0=00,,,,1313位】位】位】位】13131313位初值的高位初值的高位初值的高位初值的高8 8 8 8位赋值给位赋值给位赋值给位赋值给TH0TH0TH0TH0,低,低,低,低5 5 5 5位数前面加位数前面加位数前面加位数前面加3 3 3 3个个个个0 0 0 0凑成凑成凑成凑成8 8 8 8位之后赋位之后赋位之后赋位之后赋给给给给TL0TL0TL0TL0。
如要求计数值如要求计数值如要求计数值如要求计数值N N N N为为为为1000100010001000,则初值,则初值,则初值,则初值X X X X为:为:为:为:X X X X====M M M M----1000100010001000====8192819281928192----1000100010001000====7192719271927192====1C18H1C18H1C18H1C18H(或(或(或(或11100111001110011100,,,,00011000B00011000B00011000B00011000B))))其二进制的高其二进制的高其二进制的高其二进制的高8 8 8 8位是:位是:位是:位是:11100000B11100000B11100000B11100000B,低,低,低,低5 5 5 5位是位是位是位是11000B11000B11000B11000B,因此赋初值时,因此赋初值时,因此赋初值时,因此赋初值时 TH0 TH0 TH0 TH0====E0HE0HE0HE0H,,,,TL0TL0TL0TL0====18H18H18H18H。
2 2 2 2)模式)模式)模式)模式1 1 1 1【【【【M1M1M1M1,,,,M0=01M0=01M0=01M0=01,,,,16161616位】位】位】位】如要求计数值如要求计数值如要求计数值如要求计数值N N N N为为为为1000100010001000,则初值,则初值,则初值,则初值X X X X为:为:为:为:X X X X====M M M M----1000100010001000====65536655366553665536----1000100010001000====64536645366453664536====FC18HFC18HFC18HFC18H,因此,因此,因此,因此 赋初值时赋初值时赋初值时赋初值时TH0TH0TH0TH0====FCHFCHFCHFCH,,,,TL0TL0TL0TL0====18H18H18H18H3 3 3 3)模式)模式)模式)模式2 2 2 2【【【【M1M1M1M1,,,,M0=10M0=10M0=10M0=10,,,,8 8 8 8位重装式】位重装式】位重装式】位重装式】 这种方式绝大部分将这种方式绝大部分将这种方式绝大部分将这种方式绝大部分将T1T1T1T1用于串口波特率发生器。
用于串口波特率发生器用于串口波特率发生器用于串口波特率发生器如希望每隔如希望每隔如希望每隔如希望每隔250μs250μs250μs250μs产生一个定时控制脉冲,若晶振频率为产生一个定时控制脉冲,若晶振频率为产生一个定时控制脉冲,若晶振频率为产生一个定时控制脉冲,若晶振频率为12MHz12MHz12MHz12MHz,,,,此时计数初值此时计数初值此时计数初值此时计数初值X X X X====M M M M----N N N N====256256256256----250÷1250÷1250÷1250÷1====6 6 6 6,故只要在,故只要在,故只要在,故只要在TH0TH0TH0TH0,,,,TL0TL0TL0TL0(或(或(或(或TL1TL1TL1TL1,,,,TH1TH1TH1TH1)中预置初值)中预置初值)中预置初值)中预置初值6 6 6 64 4 4 4)模式)模式)模式)模式3 3 3 3【【【【M1M1M1M1,,,,M0=11M0=11M0=11M0=11,,,,T0T0T0T0被设成两个被设成两个被设成两个被设成两个8 8 8 8位)位)位)位) 定时定时器器器器/ / / /计数器计数器计数器计数器0 0 0 0设为模式设为模式设为模式设为模式3 3 3 3时,时,时,时,TH0TH0TH0TH0控制了控制了控制了控制了T1T1T1T1的中断,而的中断,而的中断,而的中断,而T1T1T1T1只能只能只能只能用于不需要中断的各种场合(可设置为模式用于不需要中断的各种场合(可设置为模式用于不需要中断的各种场合(可设置为模式用于不需要中断的各种场合(可设置为模式0 0 0 0~~~~2 2 2 2中的一种),如用中的一种),如用中的一种),如用中的一种),如用作不使用中断的作不使用中断的作不使用中断的作不使用中断的““““定时器定时器定时器定时器””””、、、、““““计数器计数器计数器计数器””””和串行口的波特率发生和串行口的波特率发生和串行口的波特率发生和串行口的波特率发生器。
器 通常,当通常,当通常,当通常,当T1T1T1T1用作串行口波特率发生器时,用作串行口波特率发生器时,用作串行口波特率发生器时,用作串行口波特率发生器时,T0T0T0T0才定义为方式才定义为方式才定义为方式才定义为方式3 3 3 3,以,以,以,以增加一个增加一个增加一个增加一个8 8 8 8位计数器位计数器位计数器位计数器 在用作波特率发生器时,在用作波特率发生器时,在用作波特率发生器时,在用作波特率发生器时,T1T1T1T1被设置成模式被设置成模式被设置成模式被设置成模式0 0 0 0~~~~2 2 2 2时的逻辑结构:时的逻辑结构:时的逻辑结构:时的逻辑结构: 参考下图:参考下图:三、三、8052定时定时/计数器计数器2的设置的设置四、四、 定时定时/计数器的应用计数器的应用 [ [例一例一] ]由由T0T0产生秒信号产生秒信号, ,在在输出输出( (发声发声) )设:晶振频率设:晶振频率 先介绍定时的算法先介绍定时的算法 再用程序说明再用程序说明 已知:已知: 1 1个机器周期个机器周期=12=12个时钟(振荡)周期个时钟(振荡)周期 时间常数的算法 1个机器周器的时间微妙 定时一秒,从输出,需25个20ms=500ms 反转一次,这样,20ms的次数是: N(次数)=20毫秒微妙=36866D 用16位定时,T0初值=65536-36866 =28670D=6FFFH ,即:TH0=6FH,TL0=FFH 用s_numb记次数需25次。
(先用汇编编写,后用C编程如下:)to_t0: ;to_t0: ;T0中断程序T0中断程序 mov th0,#6Fh ; mov th0,#6Fh ;重新装入常数重新装入常数 mov tl0,#0FFh mov tl0,#0FFh clr c clr c mov a,s_numb ; mov a,s_numb ;判断是否到判断是否到2525次?次? subb a,#01h ; subb a,#01h ;总次数减一总次数减一 mov s_numb,a mov s_numb,a jnc no_to1s ; jnc no_to1s ;无减完退出无减完退出! ! mov s_numb,#25 ; mov s_numb,#25 ;减完减完, ,需重新置次数需重新置次数. . cpl speak ; cpl speak ;发声发声 no_to1s: no_to1s: reti ; reti ;返回到主程序返回到主程序 T0中断相应主程序中断相应主程序 s_numb equ 30H ; 20ms的次数的次数(25x20=500ms) speak bit p1.0 ;蜂鸣器蜂鸣器 org 0000h ljmp main ;复位入口复位入口 org 000bh ; ljmp to_t0 ;T0定时器入口定时器入口 org 0100h ……….main: mov sp,#60h ;main: mov sp,#60h ;设堆栈设堆栈设堆栈设堆栈 mov ie,#00h ; mov ie,#00h ;将中断全部关掉将中断全部关掉将中断全部关掉将中断全部关掉? ? mov tmod,#00100001b ;T1 mov tmod,#00100001b ;T1为为为为8 8位重装位重装位重装位重装(0010b(0010b为波特率为波特率为波特率为波特率) ) ; T0 ; T0为为为为1616位定时器位定时器位定时器位定时器 (0001b) (0001b) mov th0,#6Fh mov th0,#6Fh mov tl0,#0FFh mov tl0,#0FFh mov s_numb,#25 ; (25x20=500ms) mov s_numb,#25 ; (25x20=500ms)设设设设2525次次次次 setb speak ; setb speak ;关蜂鸣器关蜂鸣器关蜂鸣器关蜂鸣器 setb ea ; setb ea ;开总中断开总中断开总中断开总中断 setb et0 ; setb et0 ;开开开开T0T0中断中断中断中断 setb tr0 ;T0 setb tr0 ;T0开始计数开始计数开始计数开始计数 loop: sjmp loop ;loop: sjmp loop ;循环等待中断循环等待中断循环等待中断循环等待中断 end ; end ;整个程序结束整个程序结束整个程序结束整个程序结束用用C编的编的20ms函数函数 void out_t0(void) //定时器定时器T0初始化初始化 { TMOD=0X21; //【【mov tmod,#21H】】 TH0=0X6f; //装装T0 定时常数定时常数 TL0=0Xff; // TR0=1; } void To_int(void) interrupt 1 //T0void To_int(void) interrupt 1 //T0中断入口函数中断入口函数中断入口函数中断入口函数 { { TH0=0x6f; // TH0=0x6f; //装装装装T0T0定时常数定时常数定时常数定时常数 TL0=0xff; TL0=0xff; s_numb=s_numb-1; // s_numb=s_numb-1; //到到到到2525次吗?次吗?次吗?次吗? If (s_numb==0) If (s_numb==0) { { speak= speak= ~~~~speak; //speak; //取反取反取反取反“ “发声发声发声发声” ” s_numb=25; s_numb=25; } } } } sbit speak=P1^0; //蜂鸣器蜂鸣器 unsigned char s_numb; //全局变量全局变量 void main (void) //主函数主函数 { out_t0(); //定时器初始化定时器初始化 s_numb=25; //设置次数设置次数 “25” ET0=1; //开开T0中断中断 EA=1; //开总中断开总中断 while(1); //等待发声等待发声 }【例2】利用利用利用利用T0T0T0T0确定引脚上出现的正脉冲的宽度。
确定引脚上出现的正脉冲的宽度确定引脚上出现的正脉冲的宽度确定引脚上出现的正脉冲的宽度 在外部中断在外部中断在外部中断在外部中断0 0 0 0为上升沿时为上升沿时为上升沿时为上升沿时, , , ,自动开始定时在下降沿时自动开始定时在下降沿时自动开始定时在下降沿时自动开始定时在下降沿时 产生中断,关掉产生中断,关掉产生中断,关掉产生中断,关掉T0T0T0T0((((TR0=0TR0=0TR0=0TR0=0),读数(),读数(),读数(),读数(TH0TH0TH0TH0,,,,TL0TL0TL0TL0) 【相关程序见教材】【相关程序见教材】【相关程序见教材】【相关程序见教材】。












