蓝桥杯(10)——定时器仿真PWM实现呼吸灯

版权声明:让结局不留遗憾,让过程更加完美。 https://blog.csdn.net/Xiaomo_haa/article/details/86726288

呼吸灯2s一循环,由暗到亮,再由亮到暗。

main.c

/*******************************************************************************
* 文件名:main.c
* 描  述:呼吸灯2s一循环,由暗到亮,再由亮到暗。
* 作  者:小默haa
* 版本号:v1.0.0
* 日  期: 2019年1月31日
* 备  注:呼吸灯
*         
*******************************************************************************/
#include <STC15F2K60S2.H>
#include "sys.h"

u8 Led_dat;				//led显示状态
u16 PWM = 0;

void main(void)
{
	u8 i;
	All_Init();
	Time0_Init();
	Time1_Init();
	Led_dat = 0x7f;
	EA = 1;
	while(1)
	{
	}
}

sys.c

#include "sys.h"

/*******************************************************************************
* 函数名	:All_Init
* 输入值	:无
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年1月15日
* 功能描述:外设初始化
* 备注		:关闭所有外设
*******************************************************************************/
void All_Init(void)
{
	P2 = (P2 & 0x1f) | 0x80;	//打开Y4C(LED)
	P0 = 0xff;					//关闭LED
	P2 = (P2 & 0x1f) | 0xe0;	//打开Y7C(数码管)
	P0 = 0xff;					//关闭数码管
	P2 = (P2 & 0x1f) | 0xa0;	//打开Y5C
	P0 = 0x00;					//关闭蜂鸣器、继电器
	P2 = P2 & 0x1f;		//关闭Y4C,Y5C,Y6C,Y7C
}

//定时器1初始化
void Time1_Init(void)
{
	AUXR |= 0x40;	//定时器时钟1T模式
	TMOD &= 0x0F;	//设置定时器模式
	TL1 = 0x91;		//设置定时初值10us
	TH1 = 0xff;		//设置定时初值10us
	TF1 = 0;		//清除TF0标志
	ET1 = 1;		//允许定时器0中断
    TR1 = 1;
    EA = 0;
}

/*******************************************************************************
* 函数名	:Timer1
* 输入值	:无
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年1月30日
* 功能描述:定时器1中断服务程序
* 备注		:实现呼吸灯
*******************************************************************************/
void Timer1(void) interrupt 3
{
	static u16 t = 0, n = 0, flag_pwm = 0;
	
	t ++;
	if(t == 1000)
		t = 0;
	
	n ++;
	if(n == 100)
	{
		n = 0;
		if (flag_pwm == 0)
		{
			PWM ++;
			if(PWM == 1000)
				flag_pwm = 1;
		}
		else if (flag_pwm == 1)
		{
			PWM --;
			if(PWM == 0)
				flag_pwm = 0;
		}
	}
	
	if(t < PWM)
		Led_illume(0x00);
	else
		Led_illume(0xff);
}

led.c

#include "sys.h"

/*******************************************************************************
* 函数名	:Led_illume
* 输入值	:led数据
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年1月20日
* 功能描述:LED点亮程序
* 备注		:根据传输进来的数据值,点亮相应LED
*******************************************************************************/
void Led_illume(u8 dat)
{
	P2 = (P2 & 0x1f) | 0x80;	//打开Y4C(LED)
	P0 = dat;				
	P2 = P2 & 0x1f;
}

猜你喜欢

转载自blog.csdn.net/Xiaomo_haa/article/details/86726288