NO8 蓝桥杯单片机实践之定时器实现PWM

本文详细介绍了PWM的调节原理,通过占空比控制灯的亮度,涉及单片机的定时器结构、HC138通道选择、按键处理和消抖。作者给出了一个实际应用的示例,展示了如何通过定时器控制不同占空比以实现灯的10%、50%和90%亮度,以及使用独立按键切换模式。

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

1 回顾

PWM的调节原理是通过控制占空比来实现调节功能的。

占空比为一个周期高电平占总电平的比例。

2实践

2.1任务

2.2 思路

任务中涉及到的模块有:

点亮L1 :  故涉及到HC138通道选择, L1可用sbit来表示

独立按键S7: 需要一个按键操作函数,为了消抖,故还要一个延时函数。S7可用sbit表示,

PWM信号实现调节灯的亮度: 需要用到定时器的结构。

这里的核心主要是如何通过定时器来实现PWM调制。

PWM信号频率为100HZ,故周期等于1 / 100 = 0.1s = 10ms

即PWM脉冲一个周期为10ms,根据题目,有四种不同的模式(熄灭,亮10%,亮50%,亮90%),则可以用占空比的不同来表示。

由于在单片机中低电平为亮,占空比是高电平占总电平的比。则亮10%可以表示为占空比为90%,即低电平占一个周期的10%。

同理,亮50%表示为占空比为50%,  亮90%表示占空比为10%。<

### 第七届蓝桥杯省赛单片机试题分析 #### LED 显示控制 在第七届蓝桥杯省赛中,LED显示是一个重要的考点。通过合理的编程逻辑可以实现对多个LED的精确控制。例如,在某些情况下可能需要根据特定条件点亮或熄灭指定编号的LED。 ```c void led_control(int num, int state){ if(state == ON){ GPIO_SetBits(GPIOA, (1 << num)); // 假设使用STM32系列MCU }else{ GPIO_ResetBits(GPIOA, (1 << num)); } } ``` 此函数用于设置某个GPIO引脚的状态来控制对应的LED亮起或是关闭[^1]。 #### 按键检测机制 对于按键部分的设计,则涉及到如何有效地读取外部输入信号并作出响应。通常会采用轮询方式定期扫描各个按键状态变化情况;也可以利用中断服务程序处理更复杂的交互需求。 ```c int key_scan(void){ static unsigned char last_key = NO_KEY; unsigned char current_key; /* 获取当前按下的键 */ current_key = get_current_pressed_key(); /* 判断是否有新的按下事件发生 */ if(current_key != last_key && current_key != NO_KEY){ last_key = current_key; return current_key; } return NO_KEY; } ``` 上述代码片段展示了简单的按键扫描流程,其中`get_current_pressed_key()`负责获取实际硬件上的按键值。 #### 数码管驱动方法 数码管作为常见的字符型显示器之一,在竞赛里经常被用来展示数值信息等内容。为了提高刷新效率以及减少视觉闪烁现象,一般采取动态扫描的方式逐位更新数据至各段选线上。 ```c void display_digit(uint8_t digit[], uint8_t position, uint8_t value){ segment_data[position] = number_to_segment[value]; } void refresh_display(){ for(int i=0;i<NUM_DIGITS;++i){ select_digit(i); output_segments(segment_data[i]); delay_us(SCAN_DELAY); } } ``` 这里定义了两个辅助性的子过程:一个是将十进制数转换成适合数码管表示形式的数据序列;另一个则是按照一定周期循环调用以维持稳定画面效果。 #### PWM 调光技术应用 PWM(脉宽调制)是调节输出功率的有效手段,尤其适用于灯光亮度调整方面。尽管该知识点相对抽象难以直观理解,但在具体实践中只需掌握基本原理即可灵活运用到项目当中去。 ```c TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_OCInitStructDef TIM_OCInitStruct; /* 初始化定时器配置结构体 */ TIM_StructInit(&TIM_InitStruct); /* 配置自动重装载寄存器初值 */ TIM_InitStruct.TIM_Period = ARR_VALUE; /* ...其他必要初始化操作 */ /* 设置比较匹配通道模式为PWM1 */ TIM_OCStructInit(&TIM_OCInitStruct); TIM_OCInitStruct.TIM_OCMode = TIM_OCMODE_PWM1; /* 设定占空比DutyCycle */ TIM_OCInitStruct.TIM_Pulse = DUTY_CYCLE * ARR_VALUE / 100; /* 应用以上设定 */ TIM_OC1Init(TIMx,&TIM_OCInitStruct); TIM_Cmd(TIMx, ENABLE); ``` 这段C语言源码实现了基于定时计数器外设产生的PWM波形输出功能,能够方便地改变连接负载的工作强度。 #### 温度传感器 DS18B20 接口通信协议 最后提到的是温度测量元件DS18B20的应用实例。这类器件遵循One-Wire总线标准进行串行通讯,并且具备较高的精度特性。下面给出一段简化版的一次性读温算法: ```c float read_temperature(void){ float temperature_celsius; uint8_t raw_data[9]; OneWireReset(); SendCommand(SKIP_ROM_CMD); SendCommand(CONVERT_T_CMD); while(IsBusy()); OneWireReset(); SendCommand(SKIP_ROM_CMD); SendCommand(READ_SCRATCHPAD_CMD); ReadBytes(raw_data,sizeof(raw_data)); temperature_celsius=(raw_data[1]<<8 | raw_data[0]) * 0.0625f; return temperature_celsius; } ``` 整个过程中包含了发送命令、等待完成标志清除还有最终解析二进制编码得到摄氏度量纲的结果等几个主要环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值