关于PWN调节小灯泡亮暗

该博客受ReCclay大佬文章启迪,介绍单片机PWM相关内容。阐述实验原理,指出通过控制占空比可控制小灯泡亮暗,占空比越高、高电平越久,小灯泡越暗。还给出设置10us定时器、在中断里控制PWM的代码,最后提及PWM在呼吸灯上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### 使用Arduino通过PWM调节LED灯亮度 #### 1. PWM基本概念 脉宽调制(Pulse Width Modulation,简称PWM)是一种常见的电子控制技术,用于模拟信号的生成。其核心思想是通过对数字信号占空比调整,在一定频率下实现对设备功率的有效控制[^2]。 #### 2. 硬件准备 为了实现通过PWM调节LED灯的亮度,需要以下硬件组件: - Arduino开发板(如Uno、Nano等) - LED灯 - 电阻(通常为220欧姆,防止电流过大损坏LED) - 连接线若干 - 面包板(可选) 将LED的正极连接到Arduino的一个PWM引脚(标记有`~`符号),负极通过限流电阻接地。例如,可以使用第11号引脚作为PWM输出端口[^3]。 #### 3. 软件编程 以下是完整的代码示例,展示如何通过串口输入字符来动态改变LED灯的亮度: ```cpp #define Led 11 // 定义Led引脚,支持PWM输出 int LedLight = 0; // 初始化LED灯光亮度变量 char now; // 存储当前接收的串口数据 void setup() { pinMode(Led, OUTPUT); // 设置LED引脚为输出模式 Serial.begin(9600); // 启动串口通信,设置波特率为9600bps } void loop() { if (Serial.available() > 0) { // 判断是否有可用的数据等待读取 now = Serial.read(); // 获取串口中的一字节数据 LedLight = now - 'a'; // 将'a'-'j'映射成数值范围0-9 Serial.print("原始亮度值: "); Serial.println(LedLight); // 映射亮度值从0-9扩展到0-255 LedLight = map(LedLight, 0, 9, 0, 255); Serial.print("实际亮度值: "); Serial.println(LedLight); analogWrite(Led, LedLight); // 输出对应的PWM波形,控制LED亮度 } } ``` 这段程序的功能如下: - `pinMode()`函数配置指定引脚的工作模式。 - `analogWrite()`函数接受两个参数:目标引脚编号以及期望的PWM占空比(范围为0至255)。它利用定器产生不同宽度的方波从而达到模拟电压的效果[^4]。 #### 4. 实验现象说明 当向串口发送字母'a',代表最低亮度;而发送'h'则表示较亮度水平。每次更新都会打印出计算得到的具体数值以便观察效果变化情况[^1]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值