51单片机定时器方式1晶振频率
时间: 2023-09-19 12:10:07 浏览: 118
51单片机的定时器方式1是指定时器工作在16位定时/计数模式,由定时器高字节(TH)和定时器低字节(TL)组合成一个16位的计数器。在方式1中,定时器的计数范围为0-65535。
晶振频率是指单片机外部晶体的振荡频率,它决定了单片机内部时钟的频率。对于51单片机,常见的晶振频率有12MHz、11.0592MHz、6MHz等。具体使用哪个频率的晶振需要根据具体的应用需求来确定。
在使用方式1定时器时,需要根据晶振频率来设置适当的计数值,以实现所需的定时功能。例如,如果晶振频率为12MHz,我们可以选择将定时器的计数值设置为46080(65536 - 12MHz / 12),这样每个计数周期相当于1ms的时间。通过设置适当的计数值,可以实现不同精度和时间范围的定时功能。
相关问题
51单片机定时器计数1ms
51单片机定时器计数1ms的方法如下:
1. 首先需要了解机器周期的概念,它是CPU完成一个基本操作所需要的时间,其计算公式是:机器周期=1/单片机的时钟频率。
2. 51单片机内部时钟频率是外部时钟的12分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ晶振,那么单片机内部的时钟频率就是12/12MHZ。
3. 当你使用12MHZ的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时1ms,初值是多少呢?1ms/1us=1000。也就是要计数1000个,初值=65535-1000+1(因为实际上计数器计数到66636(2的16次方)才溢出,所以后面要加1)=64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。
4. 配置定时器工作方式,设定1ms初值,开启定时器计数功能以及总中断。
```c
void Timer0Init() {
TMOD |= 0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0 = 0XFC; //给定时器赋初值,定时1ms
TL0 = 0X18;
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断
TR0 = 1; //打开定时器
}
```
C51单片机定时器1延时程序
C51单片机定时器1延时程序的实现步骤如下:
1. 设置定时器1的计数初值,使其开始计数。
2. 等待定时器1计数到指定的值,即延时时间。
3. 定时器1计数到指定值后,清零计数器,并结束延时程序。
下面是一个简单的C51单片机定时器1延时程序的例子:
```c
#include <reg52.h>
void timer1_delay(unsigned int ms)
{
unsigned int i, j;
TMOD &= 0x0F; // 设置定时器1为16位定时器
TMOD |= 0x10;
TH1 = 0xFC; // 设置定时器1的计数初值,使其开始计数
TL1 = 0x18;
TR1 = 1; // 启动定时器1
for (i = 0; i < ms; i++) // 等待定时器1计数到指定的值,即延时时间
{
for (j = 0; j < 125; j++);
}
TR1 = 0; // 停止定时器1
}
void main()
{
while (1)
{
P1 = 0xFF; // 点亮LED
timer1_delay(1000); // 延时1秒
P1 = 0x00; // 熄灭LED
timer1_delay(1000); // 延时1秒
}
}
```
在上面的例子中,我们使用定时器1来控制LED的闪烁,每隔1秒交替点亮和熄灭LED。其中,timer1_delay()函数用来实现延时功能,参数ms表示要延时的时间,单位为毫秒。在函数内部,我们使用了一个简单的for循环来等待定时器1计数到指定的值,即延时时间。
需要注意的是,定时器的计数值需要根据系统时钟频率和所需的延时时间来计算。在上面的例子中,我们使用了11.0592MHz的晶振,并将定时器1的计数初值设置为0xFC18,这样定时器1每计数65536次(0xFFFF+1),就会产生一个1秒的中断。因此,我们在for循环中等待的时间是125次,即125ms。