蓝桥杯之单片机设计与开发(12)——呼吸灯改进

main.c

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

u8 Led_dat = 0x00;				//led显示状态
u32 PWM_cnt = 0;	//PWM计数值
u8 HighRH = 0, HighRL = 0;		//高电平重载值的高、低字节
u8 LowRH = 0, LowRL = 0;		//低电平重载值的高、低字节


void main(void)
{
	All_Init();
	ConfigPWM(100, 10);
	Time1_Init(50);
	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
}

/*******************************************************************************
* 函数名	:Timer0
* 输入值	:无
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年1月30日
* 功能描述:定时器0中断服务程序
* 备注		:产生PWM输出
*******************************************************************************/
void Timer0(void) interrupt 1
{
	if(Led_dat == 0xff)
	{
		TH0 = HighRH;
		TL0 = HighRL;
		Led_dat = 0x00;
	}
	else
	{
		TH0 = LowRH;
		TL0 = LowRL;
		Led_dat = 0xff;
	}
	Led_illume(Led_dat);
}

/*******************************************************************************
* 函数名	:Time1_Init
* 输入值	:无
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年2月2日
* 功能描述:定时器1初始化程序
* 备注		:根据输入的所需计数值初始化定时器1
*******************************************************************************/
void Time1_Init(u16 ms)
{
	u32 tmp;
	
	tmp = FOSC / 12;						//定时器计数频率
	tmp = (ms * tmp) / 1000;
	tmp = 65536 - tmp;					//计算定时器重载值
	
	AUXR &= 0xBF;								//定时器时钟12T模式
	TMOD &= 0x0F;								//设置定时器模式
	
	TH1 = (u8)(tmp >> 8);				//设置定时器1初值
	TL1 = (u8)tmp;							//设置定时器1初值
	
	TF1 = 0;										//清除TF0标志
	TR1 = 1;
	ET1 = 1;										//允许定时器1中断
}				

/*******************************************************************************
* 函数名	:Timer1
* 输入值	:无
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年1月30日
* 功能描述:定时器1中断服务程序
* 备注		:实现呼吸灯
*******************************************************************************/
void Timer1(void) interrupt 3
{	
	static bit dir = 0;
	static u8 index = 0;
	u8 code table[13] = {5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95};
	
	AdjustDutyCycle(table[index]);		//调整PWM的占空比
	
	P35 = !P35;
	if(dir == 0)
	{
		index ++;
		if(index >= 12)
			dir = 1;
	}
	else
	{
		index --;
		if(index == 0)
			dir = 0;
	}
}

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;					//关闭LED
	P2 = P2 & 0x1f;
}

/*******************************************************************************
* 函数名	:ConfigPWM
* 输入值	:PWM频率fr,PWM占空比dc
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年2月2日
* 功能描述:PWM配置程序
* 备注		:根据传输进来的数据值,配置PWM
*******************************************************************************/
void ConfigPWM(u16 fr, u8 dc)
{
	u16 high, low;
	
	PWM_cnt = FOSC / 12;
	PWM_cnt = PWM_cnt / fr;				//计算一个周期需要的时间(12T模式)
	high = (PWM_cnt * dc) / 100;	//计算高电平所需的计数值
	low = PWM_cnt - high;					//计算低电平所需的计数值
	high = 65536 - high;					//计算高电平的定时器重载值
	low = 65536 - low;						//计算低电平的定时器重载值
	HighRH = (u8)(high >> 8);			//高电平重载值拆分为高低字节
	HighRL = (u8)high;
	LowRH = (u8)(low >> 8);				//低电平重载值拆分为高低字节
	LowRL = (u8)low;
	AUXR &= 0x7F;									//定时器时钟12T模式
	TMOD &= 0xF0;									//设置定时器0模式为16位自动装载模式
	TH0 = HighRH;
	TL0 = HighRL;
	ET0 = 1;
	TR0 = 1;
	
	Led_illume(Led_dat);
}

/*******************************************************************************
* 函数名	:AdjustDutyCycle
* 输入值	:PWM占空比dc
* 返回值	:无
* 作者		:小默haa
* 时间		:2019年2月2日
* 功能描述:PWM占空比调节函数
* 备注		:根据传输进来的数据值,配置PWM占空比
*******************************************************************************/
void AdjustDutyCycle(u8 dc)
{
	u16 high, low;
	
	high = (PWM_cnt * dc) / 100;	//计算高电平所需的计数值
	low = PWM_cnt - high;					//计算低电平所需的计数值
	high = 65536 - high;					//计算高电平的定时器重载值
	low = 65536 - low;						//计算低电平的定时器重载值
	HighRH = (u8)(high >> 8);			//高电平重载值拆分为高低字节
	HighRL = (u8)high;
	LowRH = (u8)(low >> 8);				//低电平重载值拆分为高低字节
	LowRL = (u8)low;
}






 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值