10-PWM脉宽调制信号的发生与控制

PWM脉冲调制信号的发生与控制

20231006141006

1、代码思路:

(1)我们可以利用定时器规定周期为10ms(100HZ),通过调节高电平时间来产生想要的PWM波,不同的亮度对应着不同占空比。

(2)首先我们先通过定时器产生四种不同的亮度,然后编写可以转换四种不同状态的按键,走后把他们整合起来

copy
#include <REGX52.H> sbit L1 = P0^0; sbit S7 = P3^0; unsigned char count = 0; unsigned char pwm_duty = 0; void Delay(unsigned int t) { while(t--); } void _74HC138(unsigned char n) { switch(n) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } void sysInit(void) { _74HC138(5); P0 = 0x00; _74HC138(4); P0 = 0xFF; } void Timer0Init(void) { TMOD = 0x02; // 100us TH0 = 256 - 100; TL0 = 256 - 100; EA = 1; ET0 = 1; // TR0 = 1; } unsigned char state = 0; void Scan_Key(void) { if(S7 == 0) { Delay(300); if(S7 == 0) { switch(state) { case 0: TR0 = 1; // 开启定时器 L1 = 0; pwm_duty = 10; state = 1; break; case 1: pwm_duty = 50; state = 2; break; case 2: pwm_duty = 90; state = 3; break; case 3: L1 = 1; state = 0; TR0 = 0; break; } while(S7 == 0); } } } void Timer0Rountine () interrupt 1 { count++; // 20 20 if(count == pwm_duty) { // 即对占空比的切换 L1 = 1; // count == pwm_duty 由低电平置为高电平 }else if(count == 100) { L1 = 0; count= 0; } } void main(void) { sysInit(); _74HC138(4); // 默认关灯 L1 = 1; Timer0Init(); while(1) { Scan_Key(); } }
posted @   夏日清凉~  阅读(69)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起