单片机定时器2的使用
52单片机定时器2作为串行口波特率发生器使用(C语言程序)
52
53 i=0;
54 while(str[i]!='\0')
55 {
56 TI=0;
57 SBUF=str[i];
58 while(!TI);
59 TI=0;
60 i++;
61 }
62 while(1);
本文是关于52单片机定时器计数器2做为串行口波特率发生器使用的例子,类似于定时器1作为波特率发生器工作在模式1下,但是不同的是:定时器2作为波特率发生器是16位自动重装的,位数比定时器1作为波特率发生器要高(定时器1作为串口波特率发生器是8位自动重装的),所以可以支持更高的传输速度,性能也比定时器1要好,老鲁推荐使用。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。AT89C52及其以上、AT89S52及其以上、STC89C52及其以上测试正常运行。
view sourceprint?01 /*
02 程序功能:52系列单片机定时器计数器2作为串行口波特率发生器使用
03 程序设计:燕山大学 鲁信琼
04
05 晶振选择:24MHz, 如果晶振不匹配,请修改延时函数参数;P2^6口接数码管段选控制位; P2^7口接数码管位选控制位;
63 }
25 void delay_ms(uint xms)
26 {
27 uint x,y;
28 for(x=xms; x>0; x--)
29 for(y=248; y>0; y--);
30 }
31
32 // 主函数初始化,24MHz晶振 28800bps波特率,有误差,建议大家使用11.0592MHz或者22.1184MHz
STC89C52单片机定时器2的使用
STC89C52单片机定时器2的使用实现定时和计数的方法一般有:软件定时、专用电路和可编程定时器/计数器三种方法。
软件定时:执行一个循环程序进行时间延迟。
定时准确,不需要外加硬件电路,但会增加CPU 开销。
专用硬件电路定时:可以实现请精确的定时和计数,但参数调节不方波。
可编程定时器/计数器:不占用CPU 时间,能与CPU 并行工作,实现精确的定时和计数,又可以通过变成设置其工作方式和其他参数,使用方便。
以下说明仅试用宏晶的STC89C52!!定时器2:T2MOD,T2CON,TH2,TL2,RC2H,RC2L.T2MOD:0C9H(不可位寻址)000000T2OEDCENT2OE:定时器输出使能位DECN:向上/向下计数使能位。
定时器2 可配制成向上/向下计数器。
0:向上计数(模式状态) 1:向下计数(尽量不使用)T2CON:0XC8H(可位寻址)TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2TF2:7 上/下溢出标志位,定时器2 溢出时置位,必须有用软件清零!当RCLK 或TCLK=1 时,TF2 将不会置位。
EXF2:6 定时器2 外部标志,当EXEN2=1 且T2EX 的负跳变产生捕获或重装时,EXF2 置位。
定时器2 中断使能时,EXF2=1 将使CPU 从中断向量处执行定时器2 中断子程序。
EXF2 位必须用软件清零。
在递增/递减计数器模式(DCEN=1)中,EXF2 位不会引起中断。
RCLK:5 接收时钟标志。
RCLK 置位时,定时器2 的溢出脉冲作为串口模式1 和模式3 的接收时钟。
RCLK=0 时,将定时器1 的溢出脉冲作为串口模式1 和模式3 的接收时钟。
TCLK:4 发送时钟标志位。
TCLK 置位时,定时器2 的溢出脉冲作为串口模式1 和模式3 的发送时钟。
TCLK=0 时,将定时器1 的溢出脉冲作为串口模式1 和模式3 发送时钟。
EXEN2:3 定时器2 外部使能标志。
单片机定时器的使用
由于TL0既能作定时器也能作计数器使用,而 TH0只能作定时器使用而不能作计数器使用,因此在 方式3模式下,定时/计数器0可以构成二个定时器或 者一个定时器和一个计数器。
如果定时/计数器0工作于工作方式3,那么定时/ 计数器1的工作方式就不可避免受到一定的限制,因 为自己的一些控制位已被定时/计数器借用,只能工 作在方式0、方式1或方式2下,如果设置T1工作在方 式3,则T1停止工作,相当于其他方式时令TR1=0。
在工业检测、控制中,很多场合都要用到计数或者定 时功能。例如对外部脉冲进行计数、产生精确的定时时间、 作串行口的波特率发声器等。MCS-51单片机内部有两个 可编程的定时器/计数器,以满足这方面的需要。它们具 有 两种工作模数(计数器模式、 定时器模式)和四种工 作方式( 方式0、方式1、方式2、方式3),其控制字均 在相应的特殊功能寄存器(SFR)中,通过对它的SFR的 编程,可以方便的选择工作模数和工作方式。
C/T位:计数器模式和定时器模式的选择位。
C/T=0,为定时器模式,内部计数器对晶振脉冲12分频 后的脉冲计数,该脉冲周期等于机器周期,所以可以理 解为对机器周期进行计数。从计数值可以求得计数的时 间,所以称为定时器模式。
C/T=1,为计数器模式,计数器对外部输入引脚T0 (P3.4)或T1(P3.5)的外部脉冲(负跳变)计数,允许 的最高计数频率为晶振频率的1/24。
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF0、TF1分别是定时器/计数器T0、 T1 的溢出标志位, 加法计数器计满溢出时置 1, 申请中断, 在中断响应后自动复 0。TF产生的中断申请是否被接受, 还需要由中断是否开放 来决定。
TR1、TR0 分别是定时器 /计数器T1、 T0 的运行控制位, 通过软件置 1 后, 定时器 /计数器才开始工作, 在系统复位时 被清 0。
单片机定时器的使用方法
单片机定时器的使用方法在嵌入式系统的开发中,定时器是一种非常重要且常用的功能模块,它能够为我们提供时间计数和计时的功能,对于许多实时应用来说,定时器更是必不可少的。
本文将介绍单片机定时器的使用方法,帮助读者更好地掌握该功能。
一、概述定时器是单片机中的一个计数器,它能够按照一定的时钟源频率进行计时。
单片机中的定时器一般包括一个或多个计数寄存器以及相关的控制寄存器。
通过设置不同的参数,我们可以实现不同的定时功能。
二、定时器的基本操作流程1. 初始化:在使用定时器之前,首先需要对定时器进行初始化设置。
这包括选择时钟源、设置定时器的工作模式、设置计数器初值等。
具体的初始化步骤和寄存器配置会根据不同的单片机型号而有所不同,因此在使用前需要查阅相关的芯片手册。
2. 启动定时器:初始化完成后,我们需要将定时器启动,开始执行计时功能。
启动定时器的方式也会因芯片而异,有的需要设置特定的控制位,有的则是通过特定的命令来启动。
3. 定时中断处理:在定时器工作期间,当计数器的值达到设定的阈值时,定时器会触发中断。
这个中断可以用于执行用户自定义的操作,比如数据处理、状态更新等。
在中断服务程序中,我们需要进行相应的处理,并清除中断标志位,以确保下一次定时正常触发。
4. 停止定时器:当我们不再需要定时器时,可以通过相应的操作将其停止。
这样可以节省系统资源和功耗。
三、定时器的常见应用单片机的定时器功能非常灵活,可以应用于各种实际场景。
以下是一些常见的应用示例:1. 延时函数:通过定时器可以实现精确的延时功能,比如延时100毫秒后再执行某个操作。
这对于需要进行时间控制的任务非常有用。
2. 脉冲宽度调制(PWM):定时器可以通过设置不同的计数值和占空比,生成不同周期和占空比的脉冲信号。
这在控制电机、调光、音频发生器等场景中非常常见。
3. 计时功能:定时器可以用于实现计时功能,比如计算程序执行时间、测量信号的周期等。
这在需要精确时间测量的场景中非常有用。
stc32g12k128定时器0的用法范例
stc32g12k128定时器0的用法范例【stc32g12k128定时器0的用法范例】一、概述stc32g12k128是一款功能强大的单片机芯片,内置了多个定时器模块,其中定时器0作为其中之一的模块,在实际应用中有着广泛的用途。
二、基本原理定时器0是stc32g12k128中一个重要的定时器模块,它的主要作用是产生精确的定时信号,并可以根据需求进行配置和使用。
在实际应用中,定时器0常常被用来控制脉冲信号的产生、定时触发某些事件以及测量时间等。
三、配置方法1. 初始化定时器0在使用定时器0之前,首先需要对其进行初始化配置。
通过编程设置寄存器的值来配置定时器0的工作模式、计数器初值、定时器中断使能等,以确保其能够按照预期工作。
2. 设定工作模式定时器0支持多种工作模式,包括定时器模式和计数器模式。
根据具体需求,可以通过设置相关寄存器来选择定时器0的工作模式,并进行相应的参数设置。
3. 设置定时器中断定时器中断可以在定时器计数满足一定条件时触发,通过设置相应的中断使能位和中断优先级,可以实现定时器定时触发中断的功能。
四、使用范例以下是一个简单的使用范例,演示了如何使用stc32g12k128的定时器0模块来产生一定时间间隔的脉冲信号。
```c#include <stc89c.h>void timer0_init(){// 设置定时器0为工作模式1,16位定时器TMOD |= 0x01;TL0 = 0x00; // 初始值设置为0TH0 = 0x00;// 定时器0中断使能ET0 = 1;EA = 1; // 总中断使能TR0 = 1; // 启动定时器0}void timer0_isr() interrupt 1 {// 每次定时器0计数溢出时触发中断// 在中断服务程序中可以编写产生脉冲信号的相关操作}void main(){timer0_init(); // 初始化定时器0while(1){// 主函数中可以进行其他操作}}```通过上述范例,我们可以看到定时器0的基本使用方法,以及如何通过定时器中断来实现脉冲信号的生成。
stc8 定时器延时写法
stc8 定时器延时写法“stc8定时器延时写法”是关于使用STC8系列单片机的定时器来进行延时操作的方法。
在本文中,我们将一步一步地介绍如何使用stc8单片机的定时器来实现精确的延时功能。
第一步:了解STC8单片机的定时器功能STC8系列单片机具有多个定时器模块,常见的有定时器0(Timer0)、定时器1(Timer1)和定时器2(Timer2)。
这些定时器模块可以用于生成准确的延时,通过设置其相关寄存器可以调整定时器的计时周期和工作模式。
第二步:选择合适的定时器模块根据具体的应用需求,选择合适的定时器模块。
一般情况下,定时器0和定时器2经常被用来进行延时操作。
这是因为定时器0具有外部输入引脚T0,可以通过外部信号触发计时,而定时器2则有更高的计时精度。
定时器1通常用于产生PWM信号,不适合用于延时操作。
第三步:配置定时器的工作模式和计时周期在使用定时器之前,需要根据需求来配置定时器模块的工作模式和计时周期。
这可以通过设置相关的寄存器来实现。
具体的配置步骤如下:1. 选择定时器模式:根据定时器的工作需要,选择定时器模式。
STC8系列单片机的定时器模式包括定时器、计数器和捕获模式。
2. 设置计时周期:根据需要延时的时间和单片机的主频来计算定时器的计时周期。
定时器的计时周期由相关的寄存器来控制,具体的寄存器名称和寄存器位偏移量可以查看STC8系列单片机的相关文档。
第四步:编写延时函数编写用于延时的函数,可以通过调用定时器模块的相关寄存器来实现准确的延时。
以下是一个示例代码:cvoid delay_ms(unsigned int ms){unsigned int i;TMOD = 0x01; 选择定时器0为模式1for(i=0;i<ms;i++){TH0 = 0xFC; 定时器0计时周期为1ms时的高8位赋初值TL0 = 0x67; 定时器0计时周期为1ms时的低8位赋初值TR0 = 1; 启动定时器0while(TF0 == 0); 等待定时器0溢出TR0 = 0; 关闭定时器0TF0 = 0; 清除溢出标志位}}上述代码中,delay_ms函数通过循环调用定时器0来实现毫秒级的延时。
proteus与keil Cx51的单片机仿真(定时器应用2)
proteus 与keil Cx51 的单片机仿真(定时器应用2)使用定时器产生PWM 波调节P0 和P2 口VD 的亮度,当按下K01 时,VD 亮度减小,当按下K02 时,VD 亮度增加,设P0 和P2 口低高电平灯亮,反之灯灭。
电路图:C 程序:#include#includesbit K01=P1;//增加键sbit K02=P1 ; //减少键sbit BEEP=P3;//蜂鸣器unsigned char PWM=0x7f;//赋初值void Beep();void delayms(unsigned char ms);void delay(unsigned t);void main(){P0=0xff;P1=0xff;P2=0xff;P3=0xff;TMOD=0x21;TH0=0xfc;//1ms 延时常数12MTL0=0x18;//频率调节TH1=PWM;//脉宽调节TL1=0;EA=1;ET0=1;ET1=1;TR0=1;while(1){do{if(PWM!=0xff){PWM++;delayms (10);}else Beep();}while(K01==0);//K01 按下,亮度变暗do{if(PWM!=0x01) {PWM--;delayms(10);}else Beep();}while(K02==0);//K02 按下,亮度变亮} }void timer0() interrupt 1 //定时器0 中断服务程序{TR1=0;TH0=0xfc;TL0=0x66;TH1=PWM;TR1=1;P0=0x00;P2=0x00; //启动输出} void timer1() interrupt 3//定时器1 中断服务程序{TR1=0;P0=0xff;P2=0xff;}//结束输出void Beep()//蜂鸣器子程序{unsigned char i;for(i=0;itips:感谢大家的阅读,本文由我司收集整编。
单片机定时器方式2的工作原理
单片机定时器方式2的工作原理
单片机定时器方式2的工作原理如下:
在定时器方式2中,定时器/计数器被配置为一个16位的定时器模式。
当定时器/计数器的计数达到最大值(对于8051单片机,最大值为65535)时,计数器会自动回滚到0,并产生一个溢出事件。
当定时器/计数器溢出时,定时器/计数器的输出比较寄存器将被立即加载到输出比较寄存器中。
这意味着在溢出发生后,输出比较寄存器的值将立即被复制到输出比较寄存器中,并产生一个中断请求。
在定时器方式2中,输出比较寄存器的值可以通过编程来设置。
当输出比较寄存器的值被设置后,定时器/计数器的当前计数值将与输出比较寄存器的
值进行比较。
如果定时器/计数器的计数值小于输出比较寄存器的值,则定
时器/计数器的计数值将递增,直到定时器/计数器的计数值等于输出比较寄存器的值。
当定时器/计数器的计数值等于输出比较寄存器的值时,输出比较寄存器的
值将被复制到输出比较寄存器中,并产生一个中断请求。
此时,定时器/计
数器的计数值将被清零,并重新开始计数。
因此,通过设置输出比较寄存器的值,可以控制定时器/计数器的计数值何时达到溢出值,从而控制定时器的定时时间。
51单片机定时器的使用和详细讲解__特别是定时器2
1)禁止递增/递减计数模式 若DCEN = 0,则递增/递减计数选择被禁止,此时定 时器只能递增计数。工作原理如图 8-10 所示。
通用16定时 器寄存器
预分频 使能位
重载值 寄存器 27号引 脚 使能/禁止引入外 部信号控制T2
中断标 志位
图8-10 T2禁止递增/递减计数模式
若EXEN2 = 0,置位TR2 定时器开始递增计数, 计数至最大值FFFFH 后溢出并置位TF2,同 时将寄存器RC2 中的16 位重载值重新装入定 时器寄存器。 重载值由软件预先设置。新一轮计数循环开始, 定时器同上一轮计数循环一样,从重载值开始 递增计数。
程序清单如下(中断服务程序片段):
{
TF1=0;
TH1=0x15; TL1=0xA0; //重填初值
If (count!=0)
count--; else {count=10;P1_0=!P1_0;} }
8.4 定时器T2 8.4.1 概述 定时器2 是一个16 位通用计数器,其具有 两种操作模式:16 位自动重载模式和16 位 捕获模式。 如果预分频功能被禁止,定时器2工作时, 16 位通用加法计数器以12分频的周期脉冲 计数,每个周期16位通用加法计数器加1或 减1。
8.4.2 定时器T2控制寄存器
1.模式寄存器T2MOD 寄存器T2MOD 用来选择定时器2 的工作模式。其 组成如图8-8所示。
启动边沿 选择位
捕获模式/重载模式 的边沿选择位
预分频使能位
外部启动 使能位
计数器 递增/递 减使能位
图8-8 T2MOD各位功能
2.控制寄存器T2CON 寄存器T2CON 控制定时器2 的工作模式,其各位功 能如图8-9所示。
单片机定时器工作方式二实现精确定时概要
单片机定时器工作方式二实现精确定时概要1.选择适当的时钟源:定时器的工作需要一个时钟源来提供时钟信号。
通常可以选择内部RC振荡器、外部晶振或者其他外部时钟源作为定时器的时钟源。
选择适当的时钟源可以提高定时器的准确性。
2.设置定时器的预分频器:预分频器用于降低时钟源的频率,使得定时器的计数周期变长。
通过设置预分频器的值,可以调节定时器的计数速度。
如果需要更精确的定时,可以选择较小的预分频器值。
3.设置定时器的计数器初始值:定时器的计数器初始值是定时器开始计数时的初始值。
可以根据实际需要来设置初始值,如0或者其他合适的值。
4.开启定时器中断:定时器中断可以在计数达到预定值时触发,用于实现定时的精确控制。
通过开启定时器中断,可以在定时器达到预定值时触发中断程序,实现精确的定时操作。
5.编写中断服务程序:中断服务程序是在定时器中断触发时执行的一段代码,用于处理定时器中断。
在中断服务程序中,可以进行需要做的工作,如改变输出状态、采集数据等。
6.实现定时器重装载:当定时器计数达到预定值时,定时器会自动重装载初始值,并继续计数。
通过设置合适的重装载初始值,可以实现需要的定时周期。
重装载方式可以选择为自动重装载或者手动重装载。
7.在主程序中开启定时器:在主程序中,需要将定时器的开关位置为ON,使得定时器开始工作。
通过控制定时器的开关位置,可以启动和停止定时器的工作。
同时,需要确保定时器的中断使能被打开,以便触发定时器中断。
8.处理定时器中断:在主程序中需要添加处理定时器中断的代码。
当定时器中断触发时,会跳转到中断服务程序执行相关的处理。
在中断处理完成后,需要清除定时器中断标志位,以便下次定时器中断的触发。
通过以上步骤,就可以实现单片机定时器工作方式二的精确定时。
定时器可以根据预定的计数值,按照预定的时钟源和预分频器设置进行计数,并在达到预定值时触发中断,以实现精确的定时功能。
同时,还可以通过调整预分频器的值、计数器初始值和重装载初始值等参数,来调节定时器的计数速度和定时周期,以适应不同的需求。
STC89C52单片机定时器2的使用知识讲解
52单片机有3个定时器,T2是一个16位自动重载的,像T0和T1的方式2一样,只不过它是16位重载,如果作为计数器或定时用,中断用的是5,就是interrupt 5,T2的引脚是P1.0口。
P1.0作为I/O 口用了以后T2计数是不行了,不过定时或是作为串口时钟还是可以的。
T2CON(T2的控制寄存器),字节地址0C8H:0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8HTF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2 各位的定义如下:TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。
只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。
EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。
EXF2也是只能通过软件来清除的。
RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。
TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2C/T2:T2的定时方式或计数方式选择位。
只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。
CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。
单片机定时器的使用
单片机定时器的使用一、单片机定时器的基本原理定时器通常由一个时钟源提供脉冲信号来计数,这个时钟源可以是外部时钟源、内部时钟源或者其他外设提供的时钟源。
定时器以一个指定的时钟周期开始计数,并在达到预设的计数值时产生一个中断信号或触发一个相关事件。
二、单片机定时器的使用方法1.定时器的预分频设置在使用单片机的定时器之前,我们需要根据具体的应用需求设置定时器的预分频值。
预分频值的设置将影响定时器的计数速度。
常用的预分频值有1、2、4、8和16等,这意味着在一个计数周期内,定时器模块将接收几个时钟脉冲。
通过设置不同的预分频值,我们可以调整定时器的计数速度,从而实现不同的时间精度。
2.定时器计数值的设定在设置定时器的计数值之前,我们需要确定定时器的计数频率和所需的定时时间。
计数频率是由定时器的时钟源和预分频值决定的,而所需的定时时间是根据具体应用而确定的。
定时器计数值的设定通常是通过写入特定的寄存器来实现的。
根据单片机型号的不同,定时器计数值的位数可能有所不同。
一般来说,定时器的计数值越大,可以计时的时间就越长。
3.中断的使能与处理在使用定时器进行定时操作时,通常会设置一个中断服务程序,在定时器达到预设的计数值时触发中断。
中断服务程序中可以添加一些需要在定时器到达指定时间时执行的代码。
为了使中断能够正常工作,我们需要合理地设置中断向量、ISR(Interrupt Service Routine)等。
同时,我们也需要在程序的其他部分进行相关的中断控制设置,如打开或关闭中断、配置中断优先级等。
三、单片机定时器的常见应用案例1.时钟显示器时钟显示器是单片机定时器的一个常见应用案例,通过使用定时器和LED数码管等外设,可以实现一个精确计时的时钟显示器。
定时器以一定的频率计数,并在计数到一定值时触发中断,中断服务程序中可以更新数码管的显示值。
2.交通信号灯交通信号灯是城市道路交通管理中常用的设备,定时器可以用于控制交通信号灯的时序。
单片机实验二 定时器实验程序
sbit L3=P0^7;
unsigned char keynum;
unsigned int lasttime=100;
bit bset=0;
unsigned char keyscan();
void display();
unsigned char getkey();
void set();
code unsigned char table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
sbit H1=P3^6;
sbit H2=P3^7;
sbit L1=P0^5;
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
P1M1=0x00;
P1M0=0xff;
while(1)
{
keynum=keyscan();
display();
set();
}
}
void timer0() interrupt 1
{
P1=0X00;
W1=1;
W2=0;W3=1;W4=1;
P1=table[(unsigned char)(lasttime%1000/100)]|a;
}
else if(ct1<60)
{
P1=0X00;
W2=1;
W3=0;W4=1;W1=1;
P1=table[(unsigned char)(lasttime%1000%100/10)]|a;
STC89S52单片机定时器T2捕获
/****************************************************************************** ***************说明:定时器2捕获功能的使用。
由于只有三个三个数码管,帮只显示捕获的低八位,经验证,当P1.1(T2EX)用定时器0控制发出一个下降沿,用T2的P1^1;引脚进行捕获,从而得到高电平时间用以测量波形的宽度跳变时,数据被捕获/****************************************************************************** ***************//****************************************************************************** ****************/#include<reg52.h> //常用的头文件,52单片机包含定时器2#include <intrins.h> //51基本运算(包括_nop_空函数)#define uchar unsigned char#define ulong unsigned long#define uint unsigned intsbit STC_WR=P3^6;sbit IC138_C=P2^7;sbit IC138_B=P2^6;sbit IC138_A=P2^5;sbit p10=P1^0; //有定时器0控制从P2.0口输出一个信号bit flag=0;#define Port_Data P0uint tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar count=0; //注,使用扩展RAM时一定要注意初始化uchar temp[]={0,0,0,0,0,0,0,0}; //用于赋捕获值/****************************************************************************** ****************/void delay(uint z) //ms级延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/****************************************************************************** ****************/void BUZZ_Y5C(){STC_WR=0;IC138_C=1;IC138_B=0;IC138_A=1;}void we_Y6C(){STC_WR=0;IC138_C=1;IC138_B=1;IC138_A=0;}void du_Y7C(){STC_WR=0;IC138_C=1;IC138_B=1;IC138_A=1;}void up_we_Y6C(){STC_WR=1;IC138_C=1;IC138_B=1;IC138_A=0;}void up_du_Y7C(){STC_WR=1;IC138_C=1;IC138_B=1;IC138_A=1;}void display() //显示程序{du_Y7C();Port_Data=tab[temp[0]];up_du_Y7C();we_Y6C();Port_Data=0x01;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[1]]; up_du_Y7C();we_Y6C();Port_Data=0x02;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[2]]; up_du_Y7C();we_Y6C();Port_Data=0x04;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[3]]; up_du_Y7C();we_Y6C();Port_Data=0x08;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[4]]; up_du_Y7C();we_Y6C();Port_Data=0x10;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[5]];up_du_Y7C();we_Y6C();Port_Data=0x20;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[6]];up_du_Y7C();we_Y6C();Port_Data=0x40;up_we_Y6C();delay(1);du_Y7C();Port_Data=tab[temp[7]];up_du_Y7C();we_Y6C();Port_Data=0x80;up_we_Y6C();delay(1);}void gaibian(){uint x;x=RCAP2H*256+RCAP2L;temp[7]=x%10;x=x/10;temp[6]=x%10;x=x/10;temp[5]=x%10;x=x/10;temp[4]=x%10;x=x/10;temp[3]=x%10;x=x/10;temp[2]=x%10;x=x/10;temp[1]=x%10;temp[0]=x/10;RCAP2H=0;RCAP2L=0;TH2=0;TL2=0;flag=0;}/****************************************************************************** ****************/void time2_init(void) //捕获模式,当EXEN2=1,外部T2EX为负跳变时,则将定时器中的值捕获到RCAP2L和RCAP2H{TH2=0; //初值为0,不断自加,当溢出时中断,或者外部T2EX由1到0时产生中断TL2=0;RCAP2L=0;RCAP2H=0; // 允许T2定时器中断T2CON=0x09; //必须将T2CON.7位置1才能进行外部捕获/或者外部T2EX由1到0时产生中断}void time_init(){TMOD=0X12;TH0=256-12;TL0=256-12;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;ET2=1;TR0=1;TR1=1;TR2=1;}/****************************************************************************** ****************/void main(){time2_init();time_init();BUZZ_Y5C();Port_Data=0X00;while(1){if(flag==1)gaibian();display(); //只用来显示低八位}}void timer2(void) interrupt 5{if(TF2){TF2=0; //若定时器溢出则产生中断清0RCAP2H=0;RCAP2L=0;TH2=0;TL2=0;}else{TR0=0;TR2=0;flag=1;EXF2=0; //若外部负跳变时产生中断清0}}void timer0() interrupt 1{p10=~p10;}void timer1() interrupt 3{static uchar x=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;x++;if(x==20){TR2=1;TR0=1;x=0;RCAP2H=0;RCAP2L=0;TH2=0;TL2=0;}}。
51单片机的定时器应用解析
51单片机的定时器应用解析定时器是一种多功能的外设,可以在嵌入式系统中广泛应用。
在 51 单片机中,定时器分为两种:定时/计数器和串行接口定时器(SIT)。
这篇文档将着重介绍定时/计数器的应用。
定时器基础定时器由两个 8 位定时器(Timer0 和 Timer1)和一个 16 位定时器(Timer2)组成。
定时器通过计数器实现定时功能,计数器钟频为定时器输入时钟的一半。
定时器的定时时间可以通过改变计数器初始值和时钟源分频系数来实现。
定时器应用延时定时器可以用来实现延时功能,常见的延时方式是使用定时器产生中断,在中断服务程序中完成延时操作。
PWM定时器可以用来实现脉冲宽度调制(PWM)功能,PWM 的输出占空比可以通过改变计数器初始值和重载值来实现。
计数器定时器也可以作为计数器使用。
在计数器模式下,定时器向计数器输入信号计数,并将计数值存入寄存器中。
定时器使用示例中断延时void init_timer0(unsigned int ms){TMOD &= 0xF0;TMOD |= 0x01;TH0 = ( - FOSC / 1000 * ms) >> 8;TL0 = ( - FOSC / 1000 * ms) & 0xFF;ET0 = 1;TR0 = 1;}void timer0_isr() __interrupt (1){static unsigned char cnt = 0;TH0 = ( - FOSC / 1000 * ms) >> 8;TL0 = ( - FOSC / 1000 * ms) & 0xFF;if(cnt++ >= 20){cnt = 0;// do something every 20 ms}}PWMvoid init_timer1(unsigned int freq, unsigned char duty_cycle) {TMOD &= 0x0F;TMOD |= 0x10;TH1 = ( - FOSC / freq / 2) >> 8;TL1 = ( - FOSC / freq / 2) & 0xFF;// calculate duty cycleunsigned int reload = (unsigned int)(FOSC / freq * duty_cycle / 100 / 2);// set duty cycleRCAP2H = reload >> 8;RCAP2L = reload & 0xFF;TR1 = 1;}结论定时器是 51 单片机中常用的外设之一,可以实现延时、PWM 等多种功能。
51单片机定时器(二)
51单⽚机定时器(⼆)书接上回,下⾯是定时器的其他⼯作⽅式。
⼀、⼯作⽅式1:(还是拿t0做说明)定时/ 计数器的⼯作⽅式1⾃⼰经验是⽤的⽐较多的,它的结构图如下:TH0的⼋位和TL0的⼋位构成⼀个16位定时/计数器,可以定时时间最长在⼯作⽅式1下,计数器的计数值范围是:1—65536(216)当为定时⼯作⽅式1时,定时时间的计算公式为:(216—计数初值)╳晶振周期╳12或(216—计数初值)╳机器周期其时间单位与晶振周期或机器周期相同。
如果单⽚机的晶振选为6.000MHz,则最⼩定时时间为:[213—(216—1)]╳1/6╳10-6╳12=2╳10-6(s)=2(us)(216—0)╳1/6╳10-6╳12=131072╳10-6(s)=131072(us)。
⼯作⽅式1的使⽤,和⽅式0完全⼀样,不必赘⾔。
⼆、⼯作⽅式2⼯作⽅式2的结构图如下:从图中可以看出来,计数寄存器变成了⼀个——TL0,⼯作⽅式2下多了⼀个重装载寄存器,也就是原来的TH0。
在⼯作⽅式2下,如果TL0中的数据溢出,那么原先存储在TH0中的数据就会⾃动的装载到TL0中去,这是由单⽚机的硬件实现的,这样我们就不⽤在⼿动给定时器赋初值,⽽且硬件重装载不会耽误时间,所以⼯作⽅式2的计时是最准确的。
但是就是这样⼀来的计数结构只有8位,计数值有限,最⼤只能到255。
所以这种⼯作⽅式很适合于那些重复计数的应⽤场合。
例如我们可以通过这样的计数⽅式产⽣中断,从⽽产⽣⼀个固定频率的脉冲。
也可以当作串⾏数据通信的波特率发送器使⽤。
⼯作⽅式2下的其他使⽤和⼯作⽅式0,1相同。
三、⼯作⽅式3之前的3种⼯作⽅式中,定时器t0和t1的⼯作⽅式完全相同,⽽在⼯作⽅式3中终于有了个性的发挥不在相同了。
下⾯是⼯作⽅式3情况下t0的结构图。
可以看出,t0被分成了2个定时器,每个⼋位,定时/计数器0的TL0拆成的定时器和之前⽅式0,1⼀样,不过TH0拆成的就“因霸”了,它把原先定时器1的溢出标志位给占⽤了,⽽且还不受GATE门控的控制,这样以来,如果定时器0的TH0构成的8位定时器在使⽤,定定时器1就憋屈了,没有溢出位使⽤。
51单片机定时器模式2与波特率的应用
51单片机定时器模式2与波特率的应用单片机定时器模式2与波特率在通信领域有着广泛的应用。
定时器模式2是一种非常常见的定时器工作模式,可以精确地生成指定的时间间隔,而波特率则是通信中用来描述数据传输速率的参数。
在串口通信中,波特率是非常重要的一个参数。
波特率定义了单位时间内传输的比特数,通常以每秒钟传输的比特数(bps)来表示。
波特率越高,传输速度越快,但同时需要更高的传输能力和更高的抗干扰能力。
在通信中,发送端和接收端必须使用相同的波特率来进行通信,否则将无法正确地接收和发送数据。
单片机定时器模式2可以用来生成固定的时间间隔,通常用作定时器中断。
在串口通信中,定时器中断可以用来在发送和接收数据时定时产生中断,用来检测接收缓冲区中是否有数据到达或者发送缓冲区是否已经空闲,从而及时进行数据的接收或发送。
下面以串口通信为例,详细介绍单片机定时器模式2和波特率的应用。
首先,通过单片机定时器来设置波特率。
单片机的主时钟通常是一个固定的频率,比如12MHz。
通过定时器模式2,可以将主时钟的频率分频,从而得到一个与波特率相匹配的频率信号。
具体的分频系数计算公式为:分频系数=(2^SMOD)*(256-PRESCALER)其中,SMOD是特殊功能寄存器的位,如果设置为1,表示使用双倍波特率模式,否则为普通波特率模式;PRESCALER是定时器的预分频值,可以自由选择。
通过调整分频系数,可以得到与波特率相匹配的定时器溢出时间,从而实现波特率的设置。
例如,假设要设置波特率为9600bps,可以先计算得到分频系数,然后通过设置定时器的预分频值和计数器初值来实现。
接下来,在数据传输过程中,可以利用定时器模式2的中断功能来实现接收和发送的时机控制。
在接收数据时,可以使用定时器模式2的中断函数来检测接收缓冲区中是否有数据到达,如果有,则立即从缓冲区中读取数据。
在发送数据时,可以设置定时器的中断函数来检测发送缓冲区是否已经空闲,如果已经空闲,则将要发送的数据写入发送缓冲区。
STC89C52RC单片机存储以及引脚应用和定时器2及看门狗定时
表 4 定时器 2 工作方式
RCLK+TCLK 0 0 1 X 1、捕获模式Βιβλιοθήκη CP/RL2 0 1 X X
TR2 1 1 1 0
模式 16 位自动重装 16 位捕获 波特率发生器 (关闭)
在捕获模式中,通过 T2CON 中的 EXEN2 设置 2 个选项。如果 EXEN2=0, 定时 器 2 作为一个 16 位定时器或计数器(由 T2CON 中的 C/������2位选择) ,溢出时置位 TF2(定时器 2 溢出标志位) 。该位可用于产生中断(通过使能 IE 寄存器中的定 时器 2 中断使能位) 。如果 EXEN2=1,与以上描述相同,但增加了一个特性,即 外部输入 T2EX 由 1 变 0 时, 将定时器 2 中 TL2 和 TH2 的当前值各自捕获到 RCAP2L 和 RACP2H。另外,T2EX 的负跳变使 T2CON 中的 EXF2 置位,EXF2 也像 TF2 一样 能够产生中断 (其向量与定时器 2 溢出中断地址相同,定时器 2 中断服务程序通 过查询 TF2 和 EXF2 来确定引起中断的事件) , 捕获模式如图 X 所示。 在该模式中, TL2 和 TH2 勿重新装载值,甚至当 T2EX 产生捕获时间时,计数器仍以 T2EX 的负 跳变或振荡频率的 1/2(12 时钟模式)或 1/6(6 时钟模式)计数。
定时器 2 是一个 16 位定时/计数器。通过设置特殊功能寄存器 T2CON 中的 C/T2 位,可将其作为定时器或计数器(特殊功能寄存器 T2CON 的描述如表 2 所 列) 。定时器 2 有 3 种操作模式:捕获、自动重新装载(递增或递减计数)和波 特率发生器,这 3 种模式由 T2CON 中的位进行选择(如表 2 所列) 表1 STC89C52RC 的特殊功能寄存器
STC89C52单片机定时器2的使用
52单片机有3个定时器,T2是一个16位自动重载的,像T0和T1的方式2一样,只不过它是16位重载,如果作为计数器或定时用,中断用的是5,就是interrupt 5,T2的引脚是P1.0口。
P1.0作为I/O 口用了以后T2计数是不行了,不过定时或是作为串口时钟还是可以的。
T2CON(T2的控制寄存器),字节地址0C8H:0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H0C8HTF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2CP/RT2各位的定义如下:TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。
只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。
EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。
EXF2也是只能通过软件来清除的。
RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。
TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2C/T2:T2的定时方式或计数方式选择位。
只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。
CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。
CP/RT2=0时,选择重装载方式,这时若T2溢出(EXEN2=0时)或者T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2重装载;CP/RT2=1时,选择捕获方式,这时若T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2捕获操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*-----------------------------------------------定时器初始化子程序
------------------------------------------------*/
/*----------------------------------------------名称:定时器 2 内容:通过定时让 LED 灯闪烁,数据口为: P0 口 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//自动重装,无需再次赋初值! TF2=0;//!!!注意!!! 定时器 2 必须由软件对溢出标志位清零,硬件不能清零,这里与定 时器 0 和定时器 1 不60000)/256;//晶振 12M 60ms 16bit 自动重载
RCAP2L = (65536-6000)%256;
ET2=1;
//打开定时器中断
EA=1;
//打开总中断
TR2=1;
//打开定时器开关
}
/*-----------------------------------------------主程序
------------------------------------------------*/
main()
{
T2_init();
while(1);
}
/*-----------------------------------------------定时器中断子程序
------------------------------------------------*/ void T2_ISR(void) interrupt 5 using 1//定时器 2 中断 {
void T2_init(void)
{
T2CON=0;
//配置定时器 2 控制寄存器,这里其实不用配置,T2CON 上
电默认就是 0,这里赋值只是为了演示这个寄存器的配置
T2MOD=0;
//配置定时器 2 工作模式寄存器,这里其实不用配置,T2MOD
上电默认就是 0,这里赋值只是为了演示这个寄存器的配置