【Proteus仿真】51单片机定时器使用

该文详细介绍了如何在Proteus8.12环境下,利用Keil编译器对51单片机的定时器0、1和(89C52以上芯片的)定时器2进行设置和中断处理,以实现LED灯的闪烁功能。代码包括了定时器初始化、中断服务子程序以及主程序的编写,提供了不同定时器的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值