专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
51产生pwm的最佳算法
2020-02-03 10:10
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
9287
35
35
用51产生脉冲宽度调节(pwm)有哪些思路和算法,最好有示例,大家一起探讨最好最优的算法!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
35条回答
chengzepeng
2020-02-06 17:18
/*
程序说明:
由P2_0输出PWM,12M时输出100Hz,
LED接在P2_0上,每0.1秒钟改变一次亮度。
制作者;bbsniua
2012/9/1
*/
#include<AT89X51.H> // AT89X51专属库
#define uint8_t unsigned char
#define LED P2_0 // PWM输出
uint8_t P_S,PWM,d_ms;
void mcu_init() // mcu初始化子函数
{
TMOD = 0x02; // T0为8位自动重装定时器
TH0 = 256-100; // T0自动重装值,12M晶体时100uS中断一次
TL0 = 256-100; // T0预装值
ET0 = 1; // 开T0中断
TR0 = 1; // 启动T0
EA = 1; // 开总中断
P_S = 1; // PWM计数
PWM = 0; // PWM占空比
P2 = 0xFF;
}
void int_t0(void) interrupt TF0_VECTOR // T0中断函数,12M晶体时100uS中断一次
{
++P_S;
if(P_S>100)
{
P2_0 = 1;
P_S = 1;
if(d_ms)
{
--d_ms;
}
}
if(P_S>PWM)
{
P2_0 = 0;
}
}
void delay_ms(uint8_t xms)
{
d_ms = xms;
while(d_ms);
}
void main() // 主函数
{
mcu_init(); // mcu寄存器初始化
while(1)
{
delay_ms(10); // 每100mS更改一次PWM占空比
++PWM;
if(PWM>100)
{
PWM = 0;
}
}
}
复制代码
加载中...
查看其它35个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- /*
- 程序说明:
- 由P2_0输出PWM,12M时输出100Hz,
- LED接在P2_0上,每0.1秒钟改变一次亮度。
- 制作者;bbsniua
- 2012/9/1
- */
- #include<AT89X51.H> // AT89X51专属库
- #define uint8_t unsigned char
- #define LED P2_0 // PWM输出
- uint8_t P_S,PWM,d_ms;
- void mcu_init() // mcu初始化子函数
- {
- TMOD = 0x02; // T0为8位自动重装定时器
- TH0 = 256-100; // T0自动重装值,12M晶体时100uS中断一次
- TL0 = 256-100; // T0预装值
- ET0 = 1; // 开T0中断
- TR0 = 1; // 启动T0
- EA = 1; // 开总中断
- P_S = 1; // PWM计数
- PWM = 0; // PWM占空比
- P2 = 0xFF;
- }
- void int_t0(void) interrupt TF0_VECTOR // T0中断函数,12M晶体时100uS中断一次
- {
- ++P_S;
- if(P_S>100)
- {
- P2_0 = 1;
- P_S = 1;
- if(d_ms)
- {
- --d_ms;
- }
- }
- if(P_S>PWM)
- {
- P2_0 = 0;
- }
- }
- void delay_ms(uint8_t xms)
- {
- d_ms = xms;
- while(d_ms);
- }
- void main() // 主函数
- {
- mcu_init(); // mcu寄存器初始化
- while(1)
- {
- delay_ms(10); // 每100mS更改一次PWM占空比
- ++PWM;
- if(PWM>100)
- {
- PWM = 0;
- }
- }
- }
复制代码一周热门 更多>