基于C8051F340单片机的定时器0 工作在方式0 13位定时器的程序

一、前言

C8051F340单片的定时器0有4种工作方式,分别是:
方式0——13 位计数器/定时器
方式1——16 位计数器/定时器
方式2——自动重装载的 8 位计数器/定时器
方式3——两个 8 位计数器/定时器
本文介绍工作在方式0的情况。
在方式 0,定时器 0 被作为 13 位的计数器/定时器使用。TH0 寄存器保持 13 位计数器/定时器的 8 个 MSB,TL0 在 TL0.4-TL0.0 位置保持 5 个 LSB。TL0 的高 3 位在读计数值时,应屏蔽掉或忽略这 3 位。作为 13 位定时器寄存器,计到 0x1FFF(全 1)后再计一次将发生溢出,使计数值回到 0x0000,此时定时器溢出标志 TF0(TCON.5)被置位并产生一个中断(如果允许中断)。

二、程序展示

1、程序简介

通过定时器0计时,控制LED灯的闪烁(100ms闪烁一次)。使用单片机内部的12M晶振,进行硬件48分频,并进行软件8分频,目的是为了让计时器能够计100ms级。
X * 48*8/12000000=0.1(100ms) X=3125,也就是计数器需要计3125次数,定时器0总共可以计2的13次方次数,也就是8192次,因为是从0开始计,最多计导8191次,现需要计3125次,则计时器的初始值应该为8199-3125=5074

2、头文件部分

#include <C8051F340.h>
#define SYSCLK 12000000/8  //软件进行8分频
#define TIMER0_PRESCALE 48  //通过寄存器设置的分频数
#define LED_CHG_RATE 100 //设置LED灯的闪烁频率,100代表100ms
#define TIMER0_TICK_PER_MS  SYSCLK/TIMER0_PRESCALE/1000
#define REG1 TIMER0_TICK_PER_MS*LED_CHG_RATE
#define REG2 0x1FFF-REG1
#define REG3 REG2&0x001F  //截取低位的5位值
#define REG4 ((REG2&0x1FFF)>>5)  //取REG2的高8位给高位
#define RELOAD_HIGH  REG4  // 高位重载值
#define RELOAD_LOW   REG3  // 地位重载值
sbit LED1 = P2^2;  //通过P2.2输出驱动LED灯闪烁
void Port_Init (void);  //端口初始化
void Timer0_Init (void);    //定时器0初始化

3、主程序部分

main ()
{
   PCA0MD &= ~0x40;    // 关闭看门狗
   Timer0_Init ();     // 定时器0初始化
   Port_Init ();       // 端口初始化
   EA = 1;             // 允许中断

   while (1);       
}

4、端口初始化

void Port_Init (void)
{
   XBR1 = 0x40;
   P2MDOUT = 0x0C;     //设置P2.2推挽输出
}

5、定时器0初始化程序

void Timer0_Init(void)
{
   TH0 = RELOAD_HIGH;
   TL0 = RELOAD_LOW;
   TMOD = 0x00;                        // 设置工作在13位模式
   CKCON = 0x02;                       // 设置系统时钟48分频
   ET0 = 1;                            // 定时器0终端允许
   TCON = 0x10;                        // 定时器0打开
}

6、定时器0中断程序

void Timer0_ISR (void) interrupt 1
{
   LED1 = ~LED1;                // LED灯闪烁
   TH0 = RELOAD_HIGH;           // 重装寄存器的计数值
   TL0 = RELOAD_LOW;
}
  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xll_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值