江西智能网站建设哪里有上城区商城网站建设
一、前言
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;}
}