新手小白,做了个led的一键开关,调亮度的pwm
最开始单片机和mos管分别供电,老是出问题,单片机不能在高档运行,低档正常没有问题。后面统一用 18650供电以后问题解决,但是发现除了高档,其他档位都有频闪
有什么办法可以解决吗?
有原理图和代码吗,发出来帮你看一下 后期我的目标就是做一个手电驱动,可以实现电子开关调档
另外一个程序是自锁开关,
慢慢学吧
全部用stc搞定 晓飛飛 发表于 2024-5-17 13:35
有原理图和代码吗,发出来帮你看一下
晚点我回家了发出来,现在在上班。
最近一段时间,一直是想着这个事情的,,自己动手做得东西是真的好有成就感 原理图,画的不好,第一次画。
代码在下面
晓飛飛 发表于 2024-5-17 13:35
有原理图和代码吗,发出来帮你看一下
#include <STC8G.H>
#include "Delay.h"
#include "Key.h"
#include "Timer0.h"
sbit LED=P3^3;
unsigned char Counter, Compare;
unsigned char KeyNum, Speed;
void main()
{
LED=0;
P3M0 = 0x08; P3M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
Timer0_Init();// 初始化定时器 0 和其中断
// Compare = 66; // 设置初始占空比
while(1)
{
KeyNum = Key(); // 读取按键值
if(KeyNum == 1) // 假设 Key() 返回 1 表示某个特定按键被按下
{
Speed++;
Speed %= 8; // 限制 Speed 的值在 0 到 3 之间
switch(Speed)
{
case 0: Compare = 0; break;
case 1: Compare = 1; break;
case 2: Compare = 10; break;
case 3: Compare = 20; break;
case 4: Compare = 30; break;
case 5: Compare = 40; break;
case 6: Compare = 80; break;
case 7: Compare = 100; break;
}
// 去除不必要的 Delay 调用,因为按键检测和处理应该是即时的
}
}
}
void Timer0_Routine() interrupt 1 // 定时器 0 的中断服务程序
{
TL0 = 0xF4; // 设置定时初始值(根据定时器的配置和需要的频率来计算)
TH0 = 0xFF;
Counter++;
Counter = Counter % 100; // 确保 Counter 在 0 到 99 之间循环
if(Counter < Compare)
{
LED = 1; // LED 亮
}
else
{
LED = 0; // LED 灭
}
}
用硬件PWM吧,好多例子呢 xiangzichen 发表于 2024-5-17 23:23
用硬件PWM吧,好多例子呢
还没学到呢{:5_271:}
现在主要是频闪想解决 你的代码倒是没啥问题,不过你说的高档是什么?频率吗?
还有一点P33驱动mos管,改成推挽试试看,准双向会不会驱动能力较差.
vb2002 发表于 2024-5-18 01:57
还没学到呢
现在主要是频闪想解决
都是夜猫子呀{:titter:}
页:
[1]
2