【Proteus仿真】51单片机定时器使用
- 🔖Proteus仿真基础实验-定时器使用。
- 🌿Proteus8.12平台
- 🌿本实验代码基于Keil
- 🎞Proteus仿真
定时器0 实现代码
/*-----------------------------------------------
名称:定时器0
内容:通过定时让LED灯闪烁
------------------------------------------------*/
#include <reg52.h>
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1ms timer
sbit LED = P2 ^ 0; //定义LED端口
unsigned int count = 0;
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TL0 = T1MS; //initial timer0 low byte
TH0 = T1MS >> 8; //initial timer0 high byte
TR0 = 1; //timer0 start running
ET0 = 1; //enable timer0 interrupt
EA = 1; //open global interrupt switch
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
Init_Timer0();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
if (count-- == 0) //1ms * 1000 -> 1s
{
count = 1000; //reset counter
LED = ! LED; //指示灯反相,可以看到闪烁
}
}
📝定时器1实现代码
/*-----------------------------------------------
名称:定时器1
内容:通过定时让LED灯闪烁
------------------------------------------------*/
#include "reg51.h"
/* define constants */
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode
/* define SFR */
sbit LED = P2^0; //work LED, flash once per second
/* define variables */
unsigned int count = 0; //1000 times counter
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10; //set timer1 as mode1 (16-bit)
TL1 = T1MS; //initial timer1 low byte
TH1 = T1MS >> 8; //initial timer1 high byte
TR1 = 1; //timer1 start running
ET1 = 1; //enable timer1 interrupt
EA = 1; //open global interrupt switch
}
//-----------------------------------------------
/* Timer0 interrupt routine */
void tm1_isr() interrupt 3
{
TL1 = T1MS; //reload timer1 low byte
TH1 = T1MS >> 8; //reload timer1 high byte
if (count-- == 0) //1ms * 1000 -> 1s
{
count = 1000; //reset counter
LED = ! LED; //work LED flash
}
}
void main()
{
Init_Timer1();
while (1); //loop
}
📝定时器2实现代码
- ⚡注意只有89C52以上的才有。
/*注意:89C52才有定时器2*/
#include "reg51.h"
//-----------------------------------------------
/* define constants */
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode
/* define SFR */
sbit ET2 = IE^5;
sfr T2CON = 0xc8; //timer2 control register
sbit TF2 = T2CON^7;
sbit TR2 = T2CON^2;
sfr T2MOD = 0xc9; //timer2 mode register
sfr RCAP2L = 0xca;
sfr RCAP2H = 0xcb;
sfr TL2 = 0xcc;
sfr TH2 = 0xcd;
sbit LED = P2^0; //work LED, flash once per second
/* define variables */
static unsigned int count = 0; //1000 times counter
//-----------------------------------------------
/* Timer2 interrupt routine */
void tm2_isr() interrupt 5
{
TF2 = 0;
if (count-- == 0) //1ms * 1000 -> 1s
{
count = 1000; //reset counter
LED = ! LED; //work LED flash
}
}
void main()
{
RCAP2L = TL2 = T1MS; //initial timer2 low byte
RCAP2H = TH2 = T1MS >> 8; //initial timer2 high byte
TR2 = 1; //timer2 start running
ET2 = 1; //enable timer2 interrupt
EA = 1; //open global interrupt switch
count = 0; //initial counter
while (1); //loop
}
🏳🌈程序说明
- 🌿根据启用不同的源文件来进行功能验证。
📚仿真资源和程序源码
链接: https://pan.baidu.com/s/1BmHWEG2hokL9JZb4hyzLdw
提取码: jnnq