标题:
新手关于单片机呼吸灯PWM程序的调试问题
[打印本页]
作者:
压线帽
时间:
2020-12-9 22:59
标题:
新手关于单片机呼吸灯PWM程序的调试问题
新手仿照网上教程写了个PWM点亮一个LED小灯(sbit led = P1^2)程序。当我把一个LED小灯换成直接换成整个P1(连接8个led小灯)口,结果只有P1.0口的小灯由暗到亮,再从亮到暗,其余7个灯常亮,PWM一次只能驱动一位吗?还望高手指教。
单片机源程序如下:
/***********************
PWM-呼吸灯
*************************/
#include<reg52.h>
//sbit led = P1^2;
unsigned char t_count ; //累计每个周期中断次数的个数,满20清零,20*100us=2ms(pwm的周期)
unsigned int count ; //累计占空比需要修改(增加还是减少)的中断次数的个数 1200*100us=120ms
unsigned char t ; //累计高电平的个数
bit flag ; //标志位 0增加,1减少
void timer0init(void)
{
EA = 1;
TMOD = 0X02;
TH0 = 0Xa3;
TL0 = 0Xa3;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
t_count = 0;
count = 0;
t =10; //占空比总50%开始
// led = 1;
timer0init();
while(1);
}
/*每100us进入一次中断*/
void timer0() interrupt 1
{
t_count++;
count++;
if(t_count == t)
{
P1 = 0;
}
if(t_count == 19)
{
t_count = 0;
P1 = 1;
}
if((count == 1200)&&(flag == 0))
{
count = 0;
t++;
if(t == 19) //增加最大占空比 95%
{
flag = 1;
}
}
if((count ==1200)&&(flag == 1))
{
count = 0;
t--;
if(t ==10) //减小到最低占空比 50%
{
flag = 0;
}
}
}
作者:
wulin
时间:
2020-12-10 05:37
错误写法:P1 = 0; P1 = 1;
正确写法:P1 = 0x00; P1 = 0xff;
作者:
suncat0504
时间:
2020-12-10 10:10
本帖最后由 suncat0504 于 2020-12-10 10:14 编辑
楼上正解。楼主没搞懂P1口赋值和P1口的位赋值的区别;
led=1,表示对P1口Bit2管脚赋值1。
P1=1,表示对整个P1口赋值,二进制值=00000001B,相当于对P1口的Bit0管脚赋值1,其它位赋值0。
作者:
陈润源home
时间:
2020-12-10 15:40
1楼正解,P1指的是8位,也就是P1.0-P1.7 正确的赋值是 P1=0x00;P1=0xff;
作者:
压线帽
时间:
2020-12-10 22:47
对一位赋值和对一个字节赋值确实不一样,修改后跟预期的效果一样,感谢楼上几位的回复。
作者:
人人学会单片机
时间:
2020-12-31 15:23
这是我分享到51hei的 STC89单片机 定时器做PWM程序,
http://www.51hei.com/bbs/dpj-200820-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1