基于C8051F340单片机的精确定时1S的C程序
一、前言
C8051F340单片的定时器2 是一个 16 位的计数器/定时器,由两个 8 位的 SFR 组成:TMR2L(低字节)和TMR2H(高字节)。定时器 2 可以工作在 16 位自动重装载方式、8 位自动重装载方式(两个 8位定时器),文本通过16 位自动重装载方式,实现精确定时1S。在P4口和P2口可以分别接上一个LED灯来感知时间的变化。
二、程序展示
1、头文件部分
#include <C8051F340.h>
#define SYSCLK 24000000 // 系统时钟:24000000 = 24MHz
#define TMR2_PRESCALER 12 // Timer2分频数
#define TMR2_PER_MS SYSCLK/TMR2_PRESCALER/1000
#define TMR2_ISR_INTELVAL 1 // Timer2中断间隔(ms)
#define TMR2_RELOAD 65536 - TMR2_PER_MS * TMR2_ISR_INTELVAL
#define TMR2_INIT_VAL TMR2_RELOAD // Timer2初始值
void Port_Init (void); //端口初始化
void Timer2_Init (void); //定时器2初始化
void sysclk_Init(void);
void set_time(uint time);
bit is_time(void);
void delay(unsigned int time)
sfr16 TMR2RL = 0xCA;
sfr16 TMR2 = 0xCC;
bit time_over; // 定时到标志
unsigned int timer2_ISR_count;
2、主程序部分
main()
{
count=0;
PCA0MD&= ~0x40; //关看门狗
sysclk_Init();
Port_Init();
Timer2_Init();
while(1)
{
set_time(5000);
while(!is_time());
P4=0xff;P2=0xff;
set_time(2000);
while(!is_time());
P4=0x00;P2=0x00;
}
}
3、延时函数
软件延时,用于时钟初始化
void delay(unsigned int t)
{
unsigned int m,n;
for(x=t;m>0;m--)
for(n=1200;n>0;n--);
}
4、系统时钟初始化函数
系统时钟设置24MHz,选择4倍时钟乘法器/2。
void sysclk_Init()
{
OSCICN|=0x03;
CLKMUL|=0x00;
CLKMUL|=0x80;
delay(1);
CLKMUL|=0xC0;
while(!(CLKMUL&0x20));
CLKSEL|=0x02;
IE = 0x88;
EA=1;
}
5、端口初始化
void PORT_Init()
{
XBR1=0x40;
P2MDOUT|=0x3F;
P4MDOUT|=0xff;
P4=0x00;
P2=0x00;
}
6、定时器2初始化函数
void Timer2_Init(void)
{
TMR2 = TMR2_INIT_VAL; // 初始化值
TMR2RL = TMR2_RELOAD; // 溢出后重装值
ET2 = 1; // 使能定时器2
}
7、定时完成判断
bit is_time(void)
{
return time_over;
}
8、定时器2终端程序
void Timer2_ISR(void) interrupt 5
{
TMR2CN &= ~0xC0;
timer2_ISR_count--;
if (timer2_ISR_count == 0)
{
time_over = true;
TR2 = 0;
TMR2 = TMR2_INIT_VAL;
}
}