【STC15】通过PWM波实现呼吸灯效果


PWM采用查表方式输出不同的占空比值。pwm频率参数是固定的,可以修改。不是使用PCA寄存器实现。

示例代码

/*
*******************************************************************************
* 文件名:main.c
* 描  述:呼吸灯
* 备  注:T0用来产生PWM波,T1通过查表法改变占空比
*         不再使用while(1) 里面的做法
*******************************************************************************
*/#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define MAIN_Fosc       11059200uL  //定义主时钟
sbit PWMOUT = P1^0;u32 PeriodCnt = 0;
u8 HighRH = 0;
u8 HighRL = 0;
u8 LowRH = 0;
u8 LowRL = 0;
u8 T1RH = 0;
u8 T1RL = 0;void ConfigPWM(u16 fr, u8 dc);
void ConfigTimer1(u16 ms);void main()
{EA = 1;P1M1 &= 0xFE; P1M0 |= 0x01; //P1.0(推挽模式),为pwm输出引脚ConfigPWM(2000, 1);ConfigTimer1(100);    while(1);
}//========================================================================
// 函数: void ConfigPWM(u16 fr, u8 dc)
// 描述: pwm频率设置.
// 参数: fr频率参数,dc占空比初值
// 返回: none.
// 版本:
//========================================================================void ConfigPWM(u16 fr, u8 dc)
{u16 high, low;PeriodCnt = (MAIN_Fosc/12)/fr;high = (PeriodCnt*dc)/100;//占空比初值low = PeriodCnt - high;high = 65536 - high;low = 65536 - low;HighRH = (u8)(high>>8);HighRL = (u8)high;LowRH = (u8)(low>>8);LowRL = (u8)low;TMOD &= 0xF0;TMOD |= 0x01;TH0 = HighRH;TL0 = HighRL;ET0 = 1;TR0 = 1;PWMOUT = 1;
}
//========================================================================
// 函数: AdjustPWM(u8 dc)
// 描述: pwm占空比设置.
// 参数: dc当前占空比值
// 返回: none.
// 版本:
//========================================================================
void AdjustPWM(u8 dc)
{u16 high, low;high = (PeriodCnt*dc)/100;low = PeriodCnt - high;high = 65536 - high;low = 65536 - low;HighRH = (u8)(high>>8);HighRL = (u8)high;LowRH = (u8)(low>>8);LowRL = (u8)low;
}void ConfigTimer1(u16 ms)
{u32 tmp;tmp = MAIN_Fosc/12;tmp = (tmp*ms)/1000;tmp = 65536 - tmp;T1RH = (u8)(tmp >> 8);T1RL = (u8)tmp;TMOD &= 0x0F;TMOD |= 0x10;TH1 = T1RH;TL1 = T1RL;ET1 = 1;TR1 = 1;
}void InterruptTimer0() interrupt 1
{if(PWMOUT == 1){TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}
}void InterruptTimer1() interrupt 3
{static u8 dir = 0;static u8 index = 0;u8 xdata Table[] = {2, 3, 5, 11, 16, 25, 36, 44, 54, 66, 76, 87, 92, 96};//占空比分为13档AdjustPWM(Table[index]);//调节占空比if(dir == 0){index++;if(index == 13)dir = 1;}if(dir == 1){index--;if(index == 0)dir = 0;}}
  • 设置固定频率和固定占空比输出示例:

在中断3中将AdjustPWM(Table[index]);//调节占空比函数注释即可。

/*
*******************************************************************************
* 文件名:main.c
* 描  述:呼吸灯
* 备  注:T0用来产生PWM波,T1通过查表法改变占空比
*         不再使用while(1) 里面的做法
*******************************************************************************
*/#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define MAIN_Fosc       11059200uL  //定义主时钟
sbit PWMOUT = P1^0;u32 PeriodCnt = 0;
u8 HighRH = 0;
u8 HighRL = 0;
u8 LowRH = 0;
u8 LowRL = 0;
u8 T1RH = 0;
u8 T1RL = 0;void ConfigPWM(u16 fr, u8 dc);
void ConfigTimer1(u16 ms);void main()
{EA = 1;P1M1 &= 0xFE; P1M0 |= 0x01; //P1.0(推挽模式)ConfigPWM(2000, 50);ConfigTimer1(100);   while(1);
}//========================================================================
// 函数: void ConfigPWM(u16 fr, u8 dc)
// 描述: pwm频率设置.
// 参数: fr频率参数,当前占空比值
// 返回: none.
// 版本:
//========================================================================void ConfigPWM(u16 fr, u8 dc)
{u16 high, low;PeriodCnt = (MAIN_Fosc/12)/fr;high = (PeriodCnt*dc)/100;//占空比初值low = PeriodCnt - high;high = 65536 - high;low = 65536 - low;HighRH = (u8)(high>>8);HighRL = (u8)high;LowRH = (u8)(low>>8);LowRL = (u8)low;TMOD &= 0xF0;TMOD |= 0x01;TH0 = HighRH;TL0 = HighRL;ET0 = 1;TR0 = 1;PWMOUT = 1;
}
//========================================================================
// 函数: AdjustPWM(u8 dc)
// 描述: pwm占空比设置.
// 参数: dc当前占空比值
// 返回: none.
// 版本:
//========================================================================
void AdjustPWM(u8 dc)
{u16 high, low;high = (PeriodCnt*dc)/100;low = PeriodCnt - high;high = 65536 - high;low = 65536 - low;HighRH = (u8)(high>>8);HighRL = (u8)high;LowRH = (u8)(low>>8);LowRL = (u8)low;
}void ConfigTimer1(u16 ms)
{u32 tmp;tmp = MAIN_Fosc/12;tmp = (tmp*ms)/1000;tmp = 65536 - tmp;T1RH = (u8)(tmp >> 8);T1RL = (u8)tmp;TMOD &= 0x0F;TMOD |= 0x10;TH1 = T1RH;TL1 = T1RL;ET1 = 1;TR1 = 1;
}void InterruptTimer0() interrupt 1
{if(PWMOUT == 1){TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}
}void InterruptTimer1() interrupt 3
{static u8 dir = 0;static u8 index = 0;u8 xdata Table[] = {2, 3, 5, 11, 16, 25, 36, 44, 54, 66, 76, 87, 92, 96};//AdjustPWM(Table[index]);//调节占空比if(dir == 0){index++;if(index == 13)dir = 1;}if(dir == 1){index--;if(index == 0)dir = 0;}}
  • 参考来源:http://www.51hei.com/bbs/dpj-172705-1.html

【STC15】通过PWM波实现呼吸灯效果相关推荐

  1. STM32 定时器2 CH1 CH2 PWM输出 产生呼吸灯效果

    PWM一般用来驱动电机(控制速度),控制LED亮度,驱动开关电源电路等等,本实例通过改变PWM占空比的方式来驱动LED灯,形成呼吸灯的效果.用这种方式来学习STM32 TIM2输出PWM的配置. 以S ...

  2. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

  3. 【蓝桥杯单片机(14)】PWM波实现呼吸灯

    PWM:Pulse-Width Modulation的缩写,中文意思为脉冲宽度调制,它是一种占空比可控制的脉冲波形 占空比:一个完整的脉冲周期,是由高电平和低电平组成的,而占空比表示在一个脉冲周期里, ...

  4. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  5. Arduino ESP32利用PWM实现板载LED呼吸灯效果

    Arduino ESP32利用PWM实现板载LED呼吸灯效果 LEDC简介 LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的.它具有16个通道,可以生 ...

  6. STM32CubeMX学习教程之五:PWM实现呼吸灯效果

    完整源码下载: https://github.com/simonliu009/STM32CubeMX-PWM-Output 软件: STM32CubeMX V4.25.0 System Workben ...

  7. 使用STM32输出PWM波形LED呼吸灯的效果

    文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...

  8. 一个定时器实现IO模拟pwm,呼吸灯效果

    以定时器1为例 uchar time1_10ms = 0;     uchar time1_100ms = 0;     bit IS_10ms = 0;     bit IS_100ms = 0; ...

  9. STM32:PWM驱动LED达到呼吸灯效果(内含:1.接线原理图/实物图+2.代码部分+3.注意事项/补充知识点部分)

    1.接线原理图: LED正极接PA0,负极接GND,即高电平电亮,低电平熄灭.占空比越大,LED越亮:占空比越小,LED越暗. 实物图: LED在不断的改变亮度,实现呼吸灯效果.(是LED完全亮完全灭 ...

  10. 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯

    小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...

最新文章

  1. 随机模拟【1】:随机模拟的研究范围与特征
  2. NetJavaScriptFlex
  3. ResNet网络简单理解与代码
  4. 谭礼铨:3月21日阿里云北京峰会网络大神
  5. 二元函数极值问题:最小二乘法
  6. Python进阶练习题,新手快码起来
  7. PID闭环控制系统的Simulink仿真
  8. Linux批量转图,CMYK转RGB
  9. Golang——从入门到放弃
  10. html根据出生日期计算星座,0047 JavaScript实现根据输入日期计算所属星座
  11. 做什么样的软件才能赚钱? 学什么样的知识才能赚钱? 肖舸老师
  12. python launcher卸载不了_python2的卸载
  13. 算法提高 排队打水问题 无聊刷个水题
  14. Android学习--02(猜猜我的星座App源码+Android常用控件TextView+EditText+Button+ImangeView+DatePicker+App间通信+跳转页面)
  15. 文件夹同名EXE病毒
  16. 中忻嘉业:因抖音ccr指标异常的惩罚
  17. “希希敬敬对”团队作业——敏捷冲刺6
  18. 笔记本安装Ubuntu 无法使用 Broadcom(博通) 无线网卡实现wifi上网的解决方法
  19. Java写五子棋游戏(含人机对决,双人对决)
  20. SEO新手站长说说之网站更新频率多少才合适

热门文章

  1. qu32调音台说明书_调音台图解及使用说明
  2. chariot iperf使用_iperf局域网性能工具
  3. 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
  4. 保护眼睛——设置WIN7和XP 窗体、Chrome、IE网页背景颜色
  5. matlab 传函将s换为jw,已知单位负反馈系统开环传递函数为20 s(0.5s 1),
  6. 真机试用深度linux,推荐使用
  7. 2017年微商方向选择
  8. 手机坏点如何测试软件,怎么检测手机屏幕坏点
  9. linux如何配置本地yum,Linux配置本地yum源配置方法
  10. 图像处理ORL--训练集及测试集建立--Matlab实现