10-PWM脉宽调制信号的发生与控制
1.01-LED指示灯的基本控制2.02-蜂鸣器与继电器的基本控制3.05-独立按键的基本操作与扩展应用4.04-共阳数码管的动态显示5.03-共阳极数码管的静态显示6.06-矩阵键盘的基本操作7.07-中断系统与外部中断应用8.08-定时器的基本原理与应用9.09-定时器的进阶综合案例
10.10-PWM脉宽调制信号的发生与控制
11.11-串口通信的基本原理与应用12.12-串行接口的进阶应用13.13-io扩展技术与存储器映射扩展14.14-基础技能综合实训案例15.15-DS18B20温度传感器的基本应用16.16-DS1302的基本应用17.17-基于NE555的信号发生与频率测量18.18-PCF8591模块的基本使用19.19-AT24C02的基本应用PWM脉冲调制信号的发生与控制
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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步