再次感谢ReCclay大佬文章的启迪:

《觉得自己再有必要开一篇PWM的文章了》 作者:ReCclay
[如果想要更深入详细了解PWN,请务必点击这篇文章↑↑↑↑]

实验原理:

关于PWN调节小灯泡亮暗关于PWN调节小灯泡亮暗关于PWN调节小灯泡亮暗

通过上图就可以 看出,占空比越高,高电平越久,小灯泡就越暗
(这里高电平小灯泡灭,低电平小灯泡亮)

所以只要控制占空比,就可以控制小灯泡的亮暗

代码:

先设置一个10us的定时器

void Timer0Init()		//[email protected]
{
		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()		//[email protected]
{
		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;
}

相关文章:

  • 2022-12-23
  • 2021-09-09
  • 2021-12-04
  • 2021-11-22
  • 2021-05-23
  • 2022-02-18
  • 2021-09-26
  • 2021-10-26
猜你喜欢
  • 2022-01-17
  • 2021-04-30
  • 2022-12-23
  • 2021-06-11
  • 2022-03-06
  • 2021-04-03
  • 2022-12-23
相关资源
相似解决方案