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;
}