再次感谢ReCclay大佬文章的启迪:
《觉得自己再有必要开一篇PWM的文章了》 作者:ReCclay
[如果想要更深入详细了解PWN,请务必点击这篇文章↑↑↑↑]
实验原理:
通过上图就可以 看出,占空比越高,高电平越久,小灯泡就越暗
(这里高电平小灯泡灭,低电平小灯泡亮)
所以只要控制占空比,就可以控制小灯泡的亮暗了
代码:
先设置一个10us的定时器
void Timer0Init() //10us@12.000MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x88;
TH0 = 0xFF;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
中断里控制PWN
void T0_time() interrupt 1
{
static uint count = 0,n = 0;
TL0 = 0x88;
TH0 = 0xFF;
if(++count >= 1000) //周期10ms
{
count = 0;
}
if(count<PWN) //亮 ,PWN越高,小灯泡越亮
{
ShowLed(0x00);
}
else //灭
{
ShowLed(0xff);
}
}
应用:
呼吸灯:
main.c
******************************************************************************
* 文件名:呼吸灯
* 描 述:
* 作 者:思索与猫
* 日 期: 19/3/17
* 备 注:
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>
void main()
{
CloseFucker();
Timer0Init();
while(1)
{
;
}
}
sys.h
#ifndef __SYS_H_
#define __SYS_H_
#include<stc15f2k60s2.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void Timer0Init();
void CloseFucker();
void ShowLed(uchar led_dat);
#endif
sys.c
#include<sys.h>
bit flag_pwn;
void Timer0Init() //10us@12.000MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x88;
TH0 = 0xFF;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void T0_time() interrupt 1
{
static uint count = 0,n = 0,pwn = 0;
TL0 = 0x88;
TH0 = 0xFF;
if(++count >= 1000) //周期10ms
{
count = 0;
}
if(++n >= 100) //每隔1ms变化一次pwn
{
n = 0;
if(flag_pwn == 0)
{
pwn++; //PWN增加,灯泡由亮到暗
if(pwn == 1000)
{
flag_pwn = 1;
}
}
else if(flag_pwn == 1)
{
pwn--; //PWN减少,灯泡由暗到亮
if(pwn == 0)
{
flag_pwn = 0;
}
}
}
if(count > pwn) //亮
{
ShowLed(0x00);
}
else //暗
{
ShowLed(0xff);
}
}
void CloseFucker()
{
P2 = P2&0x1f|0xa0;
P0 = 0xaf;
P2 = P2&0x1f;
}
display.c
#include<sys.h>
void ShowLed(uchar led_dat)
{
P2 = P2&0x1f|0x80;
P0 = led_dat;
P2 = P2&0x1f;
}