【STC15】通过PWM波实现呼吸灯效果
【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波实现呼吸灯效果相关推荐
- STM32 定时器2 CH1 CH2 PWM输出 产生呼吸灯效果
PWM一般用来驱动电机(控制速度),控制LED亮度,驱动开关电源电路等等,本实例通过改变PWM占空比的方式来驱动LED灯,形成呼吸灯的效果.用这种方式来学习STM32 TIM2输出PWM的配置. 以S ...
- 通用定时器输出PWM波实现呼吸灯
STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...
- 【蓝桥杯单片机(14)】PWM波实现呼吸灯
PWM:Pulse-Width Modulation的缩写,中文意思为脉冲宽度调制,它是一种占空比可控制的脉冲波形 占空比:一个完整的脉冲周期,是由高电平和低电平组成的,而占空比表示在一个脉冲周期里, ...
- stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果
实验的STM32型号: STM32F103C8T6 48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...
- Arduino ESP32利用PWM实现板载LED呼吸灯效果
Arduino ESP32利用PWM实现板载LED呼吸灯效果 LEDC简介 LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的.它具有16个通道,可以生 ...
- STM32CubeMX学习教程之五:PWM实现呼吸灯效果
完整源码下载: https://github.com/simonliu009/STM32CubeMX-PWM-Output 软件: STM32CubeMX V4.25.0 System Workben ...
- 使用STM32输出PWM波形LED呼吸灯的效果
文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...
- 一个定时器实现IO模拟pwm,呼吸灯效果
以定时器1为例 uchar time1_10ms = 0; uchar time1_100ms = 0; bit IS_10ms = 0; bit IS_100ms = 0; ...
- STM32:PWM驱动LED达到呼吸灯效果(内含:1.接线原理图/实物图+2.代码部分+3.注意事项/补充知识点部分)
1.接线原理图: LED正极接PA0,负极接GND,即高电平电亮,低电平熄灭.占空比越大,LED越亮:占空比越小,LED越暗. 实物图: LED在不断的改变亮度,实现呼吸灯效果.(是LED完全亮完全灭 ...
- 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯
小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...
最新文章
- 随机模拟【1】:随机模拟的研究范围与特征
- NetJavaScriptFlex
- ResNet网络简单理解与代码
- 谭礼铨:3月21日阿里云北京峰会网络大神
- 二元函数极值问题:最小二乘法
- Python进阶练习题,新手快码起来
- PID闭环控制系统的Simulink仿真
- Linux批量转图,CMYK转RGB
- Golang——从入门到放弃
- html根据出生日期计算星座,0047 JavaScript实现根据输入日期计算所属星座
- 做什么样的软件才能赚钱? 学什么样的知识才能赚钱? 肖舸老师
- python launcher卸载不了_python2的卸载
- 算法提高 排队打水问题 无聊刷个水题
- Android学习--02(猜猜我的星座App源码+Android常用控件TextView+EditText+Button+ImangeView+DatePicker+App间通信+跳转页面)
- 文件夹同名EXE病毒
- 中忻嘉业:因抖音ccr指标异常的惩罚
- “希希敬敬对”团队作业——敏捷冲刺6
- 笔记本安装Ubuntu 无法使用 Broadcom(博通) 无线网卡实现wifi上网的解决方法
- Java写五子棋游戏(含人机对决,双人对决)
- SEO新手站长说说之网站更新频率多少才合适
热门文章
- qu32调音台说明书_调音台图解及使用说明
- chariot iperf使用_iperf局域网性能工具
- 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
- 保护眼睛——设置WIN7和XP 窗体、Chrome、IE网页背景颜色
- matlab 传函将s换为jw,已知单位负反馈系统开环传递函数为20 s(0.5s 1),
- 真机试用深度linux,推荐使用
- 2017年微商方向选择
- 手机坏点如何测试软件,怎么检测手机屏幕坏点
- linux如何配置本地yum,Linux配置本地yum源配置方法
- 图像处理ORL--训练集及测试集建立--Matlab实现