单片机学习笔记————51单片机累计中断次数使LED灯闪烁

一、使用proteus绘制简单的电路图,用于后续仿真

单片机学习笔记————51单片机累计中断次数使LED灯闪烁_第1张图片

二、编写程序

/********************************************************************************************************************
----	@Project:	LED
----	@File:	main.c
----	@Edit:	ZHQ
----	@Version:	V1.0
----	@CreationTime:	20200505
----	@ModifiedTime:	20200505
----	@Description:	累计中断次数使LED灯闪烁
----	单片机:AT89C52
********************************************************************************************************************/
#include "reg52.h"

/*——————宏定义——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000)   /*1ms timer calculation method in 12Tmode*/
#define const_time_level 500  /*设置LED闪烁频率*/

/*——————变量函数定义及声明——————*/
/*定义LED口*/
sbit LED = P3^5;
/*步骤变量*/
unsigned char ucLedStep=0; 
/*统计定时中断次数的延时计数器*/
unsigned int  uiTimeCnt=0;
/**
* @brief  定时器0初始化函数
* @param  无
* @retval 初始化T0
**/
void Init_T0(void)
{
	TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/
	TL0 = T1MS;                     /*initial timer0 low byte*/
	TH0 = T1MS >> 8;                /*initial timer0 high byte*/
}
/**
* @brief  定时器0中断函数
* @param  无
* @retval 无
**/
void ISR_T0(void)	interrupt 1
{
	TF0=0;  /*清除中断标志*/
  TR0=0; /*关中断*/
  if(uiTimeCnt<0xffff)  /*设定这个条件,防止uiTimeCnt超范围*/
  {
      uiTimeCnt++;  /*累加定时中断的次数*/
  }	
	TL0 = T1MS;                     /*initial timer0 low byte*/
	TH0 = T1MS >> 8;                /*initial timer0 high byte*/
  TR0=1; /*开中断*/	
}
/**
* @brief  外围初始化函数
* @param  无
* @retval 初始化外围
**/
void Init_Peripheral(void)
{
	ET0 = 1;/*允许定时中断*/
	TR0 = 1;/*启动定时中断*/
	EA = 1;/*开总中断*/
	LED = 0;
}

/**
* @brief  初始化函数
* @param  无
* @retval 初始化单片机
**/
void	Init(void)
{
	Init_T0();
}
/**
* @brief  LED闪烁函数
* @param  无
* @retval 控制LED闪烁
**/
void Led_Flicker(void)
{
	switch(ucLedStep)
	{
		case 0:
			if(uiTimeCnt >= const_time_level) /*时间到,灯亮*/
			{
				ET0 = 0; /*禁止定时中断*/
				uiTimeCnt = 0; 
				LED = 1;
				ucLedStep = 1;/*切换到下一步*/
				ET0 = 1; /*允许定时中断*/
			}
		break;
		case 1:
			if(uiTimeCnt >= const_time_level) /*时间到,灯灭*/
			{
				ET0 = 0; /*禁止定时中断*/
				uiTimeCnt = 0; 
				LED = 0;
				ucLedStep = 0;/*返回到上一步*/
				ET0 = 1; /*允许定时中断*/
			}
		break;			
	}
}

/**
* @brief  延时函数
* @param  无
* @retval 无
**/
void Delay_Long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;
   for(i=0;i

三、仿真实现

把编译出的hex文件写入单片机,点击运行,LED实现闪烁。

单片机学习笔记————51单片机累计中断次数使LED灯闪烁_第2张图片

修改程序中的LED闪烁频率的宏,可改变LED闪烁的频率。

你可能感兴趣的:(单片机)