timers.c
来自「太欣单片机STK6031的测试程序」· C语言 代码 · 共 195 行
C
195 行
#include "STK6031.h"
//********************************************************************************
//定义数据类型
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit P4_0 = P4^0; //P4.0 口产生固定频率的方波
//以下宏定义用来选择定时计数器,工作方式,以及是否使用中断方式
#define USE_INT 0 // 1 为查询方式,0为中断方式
#define USE_T0M1 0 // 使用TIMER0 模式1
#define USE_T1M2 1 // 使用TIMER1 模式2
/*
********************************************************************************
* 函 数 名:InitMCU
* 功能描述:初始化MCU,其中包括初始化各I/O口,CHIPCON,
CKCON,选择I/O口的功能
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void InitMcu(void)
{
P0 = 0xFF; //初始化各I/O 口
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
P4 = 0x0F;
// 当STK6031 用来替换传统12T 的MCU 使用时,这两个时序控制寄存器可以设置如下:
CHIPCON = 0x1A; // 设置CPUCLK=XTAL1/3,允许访问片内AUX 存储器,禁止ALE 输出,允许低电压复位
CKCON = 0x39; // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4, 设置MOVX 指令访问外部AUX 存储器的时间为3 个机器周期
// 当STK6031 用于充分发挥其4T 高处理速度时,这两个时序控制寄存器可以设置如下:
//CHIPCON = 0x1C; // 设置CPUCLK=2XTAL1,这时STK6031 执行相同指令的时间缩短为传统12T 8051 的1/6,
//CKCON = 0x39; // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4, 这时由于CPUCLK=2XTAL1 ,所以定时计数器的频率为传统12T MCU的6 倍
}
#if USE_T0M1
#if USE_INT
/*
********************************************************************************
* 函 数 名:
* 功能描述:定时/ 计数器程序,查询方式
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//Timer0 Mode1 , 设晶振为24M,需要定时时间为5 ms
void main(void)
{
InitMcu();
TMOD = 0x01; // Timer 0, Mode 1, 16 bit, 计数范围0--65535
TH0 = 0xD8; // 装入16 位计数初值,要产生5ms的定时需要计数10000次
TL0 = 0xFE; // 65536-10000=55536=D8F0H,但是要除去指令执行的延迟,大概14 个机器周期
TR0 = 1; // 开启TIMER0,开始定时
while(1)
{
if(TF0) // 查询溢出标志位有没变化
{
TF0 = 0; // 清除TF0 溢出标志位
P4_0 = ~P4_0;
TH0 = 0xD8; //重新装入16 位计数初值
TL0 = 0xFE; //
}
}
}
#else
/*
********************************************************************************
* 函 数 名:
* 功能描述:定时/ 计数器程序,中断方式
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//Timer0 Mode1 , 设晶振为24M,需要定时时间为5 ms
void main(void)
{
InitMcu();
TMOD = 0x01; // Timer 0, Mode 1, 16 bit, 计数范围0--65535
TH0 = 0xD8; // 装入16 位计数初值,要产生10ms的定时需要计数10000次
TL0 = 0xFE; // 65536-10000=55536=D8F0H,但是要除去指令执行的延迟,大概14 个机器周期
ET0 = 1; // 允许T0 中断
EA = 1; // CPU 开中断
TR0 = 1; // 开启TIMER0,开始定时
while(1); // 等待中断
}
//中断程序1,定时中断0
void ISR_T0(void) interrupt INTERRUPT_TIMER0
{
TF0 = 0; // 清除TF0 溢出标志位
P4_0 = ~P4_0;
TH0 = 0xD8; //重新装入16 位计数初值
TL0 = 0xFE; //
}
#endif
#endif
#if USE_T1M2
#if USE_INT
/*
********************************************************************************
* 函 数 名:
* 功能描述:定时/ 计数器程序,查询方式
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//Timer1 Mode2 , 设晶振为24M,需要定时时间为0.1 ms
void main(void)
{
InitMcu();
TMOD = 0x20; // Timer 1, Mode 2, 8 bit, 计数范围0--255
TH1 = 0x38; // 装入8 位计数初值,要产生0.1ms的定时需要计数200次,256-200=56=38H
TL1 = 0x38; // 当TL1 计满时自动装载TH1 中的初值
TR1 = 1; // 开启TIMER1,开始定时
while(1)
{
if(TF1) // 查询溢出标志位有没变化
{
TF1 = 0; // 清除TF1 溢出标志位
P4_0 = ~P4_0;
}
}
}
#else
/*
********************************************************************************
* 函 数 名:
* 功能描述:定时/ 计数器程序,中断方式
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//Timer0 Mode1 , 设晶振为24M,需要定时时间为0.1 ms
void main(void)
{
InitMcu();
TMOD = 0x20; // Timer 1, Mode 2, 8 bit, 计数范围0--255
TH1 = 0x38; // 装入8 位计数初值,要产生0.1ms的定时需要计数200次,256-200=56=38H
TL1 = 0x38; // 当TL1 计满时自动装载TH1 中的初值
ET1 = 1; // 允许T1 中断
EA = 1; // CPU 开中断
TR1 = 1; // 开启TIMER1,开始定时
while(1); //等待中断
}
//中断程序1,定时中断0
void ISR_T1(void) interrupt INTERRUPT_TIMER1
{
TF1 = 0; // 清除TF1 溢出标志位
P4_0 = ~P4_0;
}
#endif
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?