51单片机利用pwm做出呼吸灯并用串口每隔一秒(用定时器)打印亮度(百分比)于电脑上。

突然想到的一个问题,但尝试了许久,没有得出一个结论。想来问问大神的做法,借以参考。


#include<reg51.h>
 
#define uint unsigned int
 
#define uchar unsigned char
 
 
sbit PWM=P2^0;// P2.0输出pwm
uchar flag;//用于标识亮度增大/减小
uchar v;//亮度值满值255
uchar flag2;//一秒标识
uchar count;//用于一秒计数
 
void main()
 
{
    flag=1;
    flag2=0;
    count=0;
    v=0;
    TMOD=0x01;//定时器0工作方式1
    TH0=0xf8;//赋初值定时
    TL0=0x2f;//6MHz主频下4ms
    EA=1;//开总中断
    ET0=1;//开定时器0中断
    TR0=1;//启动定时器0

while(1)
 
{
    light(v);
    if(flag2){//串口发送亮度
        flag2=0;
        send_byte(v);
    }
    
}
 
}

void light(uint l)

{
    PWM=1;
    delayus(l);
    PWM=0;
    delayus(1000-l);
}
 
void delayus(uint x)

{

    while(x--);

}

void tim0() interrupt 1
 
{
    
 
    TR0=0;//赋初值时,关闭定时器
 
    TH0=0xf8;//赋初值定时
 
    TL0=0x2f;
 
    TR0=1;//打开定时器
 
    if(flag){//每ms更改v值
        v++;
    }
    else{
        v--;
    }
    if(v>254){
        flag=0;
    }
    if(v<1){
        flag=1;
    }
    count++;
    if(count==250){//一秒计数
        count=0;
        flag2=1;
    }
}

void send_byte(uchar by){
    SBUF = by;
    while(!TI);//等待发送完毕
    TI = 0;    
}

 

额(=_=),今天要交了对吧。

就26号

哈哈哈哈哈哈哈

我用这个程序结果是闪烁而不是呼吸灯