定时器方式0的使用
通过设置TMOD寄存器中的M1M0为00选择定时方式0,方式0的计数位数是13位,对T0来说,有TL0寄存器的低5位,和TH0的8位组成
那么最多能装入2^13=8192个数,也就是说,经过8192个计数,寄存器就会溢出,向CPU发出中断请求。
所以计算公式为
TH0=(8192-X)/32
TL0=(8192-X)2
程序例子:
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0X00; //设置定时器0为工作方式;
TH0=(8192-4607)/32; //装初值
TL0=(8192-460)2;
EA=1;
ET0=1; //开定时器0;
TR0=1; //启动定时器0;
while-(1)
{
if(num==200)
{
num=0; //如果到了200次,说明1秒时间到
led1=~led1; //让发光管状态反接
}
}
}
void T0_time() interrupt 1
{
TH0=(8192-4607)/32; //重装初始值
TL0=(8192-4607)2;
num++;
}
定时器方式2的使用
方式2被称为自动重装的八位定时器/计数器。
原理:THX被作为常数缓冲器,当TLX计数器溢出时,在溢出标志TFX置1的同时,还自动地将THX中的常数重新装入TLX中,使TLX从初始值开始重新计数,这样就避免了认为的软件重装初始值带来的时间误差,从而提高定时精度。
适用范围:方式2特别适用于做较精确的脉冲信号发生器,因为其只有8位计数器。
缺点:当定时较长的时间是同时给编写程序带来麻烦,同时还会影响精度
公式:
THX=256-N;
TLX=256-N;
程序列子:
#include
#define MOTOR P2^0; //定义电机的输出口
int PWMcount,PWM;
void main()
{
TMOD=0X02; //设置定时器0的工作模式2
TH0=156; //转载初始值
TL0=156;
EA=0;
ET0=1; //开启内部定时器中断0;
TR0=1; //启动定时器中断0;
PWM=50; //以50的PWM输出
while(1){;}
}
void PWM_output() interrupt 1
{
PWM_count++;
if(PWM_count MOTOR=1;
else MOTOR=0;
if(PWM_count==100) PWM_count=0;
}
关键字:51单片机 定时器 计数器
引用地址:
51单片机定时器/计数器提高
推荐阅读最新更新时间:2024-03-16 13:50
51单片机中什么是bit和sbit?_bit和sbit区别
回顾C语言发现在单片机中有bit sbit sfr 等一些类型! 问题:什么是bit和sbit?他们有什么区别? bit : 编译时分配空间 sbit 只能在外部定义全局变量。 sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。 bit 动态分配的,有编译器来指定内存地址。 bit和sbit都是C51扩展的变量类型。 sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit sbit更像是类型定义,不像是变量定义。 sbit: 指示说明性说明 bit 可以在外部或内部定义。
[单片机]
51单片机做的智能时钟具有闹钟功能(DS1302+DS18B20+LCD1602)
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。 使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。 单片机源程序如下: #include reg52.h #include key.h #include LCD1602.h #include DS1302.h #include music.h #include DS18B20.H #define no
[单片机]
动态扫描方法和定时器1在数码管的前三位显示出秒表
/* 用动态扫描方法和定时器1在数码管的前三位显示出秒表 */ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uint closedu,closewe; uchar code wetable ={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar code dutable ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}
[单片机]
51单片机内部资源
通过这篇博客对这一段时间对51单片机的学习做一定总结,这是对单片机内部资源的一定总结:单片机的内部资源总体上分为两部分:基本功能和服务性功能。如下图所示; 对于基本的器件有:LED灯,蜂鸣器、继电器、步进电机和按键。其中通过LED的不同组合方式可以扩展出LED流水灯、数码管和点阵。其实基本的器件的工作方式是基本相同的,只是对电平表现出的不同输出方式。其中数码管可以通过动态和静态两种方式显示;静态显示为一对一形式,动态显示为一对多形式的循环显示。其中点阵的表现方式其实和数码管的动态显示是相同的,只是点阵和数码管的LED灯的排列方式不同而已。对于X*Y形式的按键扫描方法是:行列交叉取点发。 上述都为一些基本器件,为了方便和更加
[单片机]
NRF52840学习历程(六)RTC 实时计数器(滴答定时器)
开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用) 版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0 参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图) nRF5_SDK_17.0.2_d674dde(官方例程) nRF5_SDK_17.0.0_offline_doc(官方文档) nRF52840_PS_v1.1.pdf(官方数据手册) RTC 实时计数器 32.768KH
[单片机]
51单片机I/O口使用经验
按常规,在51端口(P1、P2、P3)某位用作输入时,必须先向对应的锁存器写入1,使FET截止。一般情况是这样,也有例外。所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场效应管并联在一起:一个FET为负载管,其阻值固定;另一个FET可工作在导通或截止两种状态(姑且叫可变FET)。使其总电阻值变化近似为0或阻值较大(20千欧--40千欧)两种情况。当和端口锁存器相连的FET由导通至截止时,该阻值近似为0,可将引脚快速上拉至高电平;当和锁存器相连的FET由截止至导通时,该电阻呈现较大阻值,限制了和端口锁存器相连的FET的导通电流。 51I/O口作为输入端和外部信号相连有时必须考虑上述特性,本人在设计LT
[单片机]
51单片机-按键部分(3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 1
[单片机]
c51中定时器工作时如何使用T0脚输入脉冲信号?
嵌入式系统中,定时器是一种常用的设备,可以实现各种时间控制功能,如计时、计数、产生中断等。8051单片机中有两个定时器:T0和T1,其中T0定时器主要用于计时和计数操作,可以通过T0脚输入脉冲信号来控制定时器的工作。 T0脚是单片机的P3.4口,既可以作为普通的输入输出口,也可以作为T0定时器的外部输入引脚。当T0脚作为定时器的外部输入引脚时,可以通过输入的脉冲信号来控制定时器的计数。在使用T0脚输入脉冲信号时,需要采取一些措施来确保信号的稳定性和正确性。 首先,需要确定输入脉冲信号的频率。在使用T0脚输入脉冲信号时,需要将信号的频率与定时器的工作频率相匹配。具体来说,当定时器使用外部时钟源时,其工作频率为外部时钟源频率的一半,因
[单片机]