标题:
关于PWM控制LED灯的程序,有几个问题不懂
[打印本页]
作者:
wulingjie
时间:
2018-5-3 22:56
标题:
关于PWM控制LED灯的程序,有几个问题不懂
单片机小白,网上找的程序,有几点问题不懂,希望大神解答:这段程序中a的值是多少,为什么最小亮度设置是1,最大是100,而总等级数是101,这应该怎么理解,不应该是100吗。万分感谢。
单片机源码:
#include <REG51.h>//51头文件
/****************************************************************/
//定义亮度变化
#define DY_PORT P2 //设置LED连接的I/O组
#define DY_PWM 101 //设置明亮的总级数(级数过大会出现闪烁)
(值域:0~65535)
#define DY_MAX 100 //设置最大亮度(值域:小于明亮总级数)
#define DY_MIN 1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
sbit DY_KEY1 = P1 ^ 0; //亮度加
sbit DY_KEY2 = P1 ^ 1; //亮度减
/****************************************************************/
// 1ms延时程序(12MHz 10倍于51单片机速度时)
void delay (unsigned inta){
unsigned char i;
while( --a != 0){
for(i = 0; i < 12; i++);
}
}
/****************************************************************/
//显示程序(50ms的PWM宽度)
void display (unsignedint a){
DY_PORT = 0x00; //LED小灯亮
delay (a); //延时a的长度
DY_PORT = 0xff; //LED小灯灭
delay (DY_PWM-a); //延时总PWM长度减a
}
/****************************************************************/
//主程序
void main (void){
unsigned int k=5;
while (1){
display(k); //
if(DY_KEY1 == 0){ //如果按键按下则继续
delay(20); //消抖延时20mS
if(DY_KEY1 == 0){ //如果按键按下则继续
k++;
if(k>DY_MAX){
k = DY_MAX;
}
while(DY_KEY1 == 0); //等待按键松开
}
}
if(DY_KEY2 == 0){ //如果按键按下则继续
delay(20); //消抖延时20mS
if(DY_KEY2 == 0){ //如果按键按下则继续
k--;
if(k<DY_MIN){
k = DY_MIN;
}
while(DY_KEY2 == 0); //等待按键松开
}
}
}
}
复制代码
作者:
st5ltn
时间:
2018-5-4 08:59
这个和他的程序处理方式有关, delay (DY_PWM-a); 是为了保证DY_PWM-a>0;你在仔细看看delay函数的写法,参数的如果等于0会有问题。
作者:
余晖
时间:
2018-5-4 09:32
本帖最后由 余晖 于 2018-5-4 09:35 编辑
a为一个形参,你可以理解为一个参数,初始值由main中指令unsigned int k=5;得出k=5,由指令
display(k);将k传递给a;
作者:
余晖
时间:
2018-5-4 09:33
由这条指令 display(k);将k值传递给a
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1