关于PWN调节小灯泡亮暗

再次感谢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;
}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值