本帖最后由 STCAI-32位8051 于 2024-5-30 13:27 编辑
上面这个是官方给的范例程序,pwm呼吸灯
下面的是我改的,可以正常编译,没有错误,led不能呼吸,只能点亮。
- #include "reg51.h"
- #include "intrins.h"
-
- #define CYCLE 0x1000
-
- sfr P_SW2 = 0xba;
-
- sfr PWMSET = 0xF1;
- sfr PWMCFG01 = 0xF6;
- sfr PWMCFG23 = 0xF7;
- sfr PWMCFG45 = 0xFE;
-
- #define PWM0C (*(unsigned int volatile xdata *)0xFF00)
- #define PWM0CH (*(unsigned char volatile xdata *)0xFF00)
- #define PWM0CL (*(unsigned char volatile xdata *)0xFF01)
- #define PWM0CKS (*(unsigned char volatile xdata *)0xFF02)
- #define PWM0TADC (*(unsigned int volatile xdata *)0xFF03)
- #define PWM0TADCH (*(unsigned char volatile xdata *)0xFF03)
- #define PWM0TADCL (*(unsigned char volatile xdata *)0xFF04)
- #define PWM0IF (*(unsigned char volatile xdata *)0xFF05)
- #define PWM0FDCR (*(unsigned char volatile xdata *)0xFF06)
- #define PWM00T1 (*(unsigned int volatile xdata *)0xFF10)
- #define PWM00T1H (*(unsigned char volatile xdata *)0xFF10)
- #define PWM00T1L (*(unsigned char volatile xdata *)0xFF11)
- #define PWM00T2H (*(unsigned char volatile xdata *)0xFF12)
- #define PWM00T2 (*(unsigned int volatile xdata *)0xFF12)
- #define PWM00T2L (*(unsigned char volatile xdata *)0xFF13)
- #define PWM00CR (*(unsigned char volatile xdata *)0xFF14)
- #define PWM00HLD (*(unsigned char volatile xdata *)0xFF15)
-
- sfr P0M1 = 0x93;
- sfr P0M0 = 0x94;
- sfr P1M1 = 0x91;
- sfr P1M0 = 0x92;
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- sfr P3M1 = 0xb1;
- sfr P3M0 = 0xb2;
- sfr P4M1 = 0xb3;
- sfr P4M0 = 0xb4;
- sfr P5M1 = 0xc9;
- sfr P5M0 = 0xca;
-
- void PWM0_Isr() interrupt 22
- {
- static bit dir = 1;
- static int val = 0;
-
- if (PWMCFG01 & 0x08)
- {
- PWMCFG01 &= ~0x08; //清中断标志
- if (dir)
- {
- val++;
- if (val >= CYCLE) dir = 0;
- }
- else
- {
- val--;
- if (val <= 1) dir = 1;
- }
- _push_(P_SW2);
- P_SW2 |= 0x80;
- PWM00T2 = val;
- _pop_(P_SW2);
- }
- }
-
- void main()
- {
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
-
- PWMSET = 0x01; //使能PWM0模块(必须先使能模块后面的设置才有效)
-
- P_SW2 = 0x80;
- PWM0CKS = 0x00; // PWM0时钟为系统时钟
- PWM0C = CYCLE; //设置PWM0周期
- PWM00T1= 0x0000;
- PWM00T2= 0x0001;
- PWM00CR= 0x80; //使能PWM00输出
- P_SW2 = 0x00;
-
- PWMCFG01 = 0x05; //启动PWM0模块并使能PWM0中断
- EA = 1;
-
- while (1);
- }
-
复制代码
- #include "intrins.h"
- #include <STC8G.H>
-
-
- #define CYCLE 0x1000
-
- sbit LED=P3^3;
-
-
- void PWM0_Isr() interrupt 22
- {
- static bit dir = 1;
- static int val = 0;
-
- if (PWMCFG01 & 0x08)
- {
- PWMCFG01 &= ~0x08; //清中断标志
- if (dir)
- {
- val++;
- if (val >= CYCLE) dir = 0;
- }
- else
- {
- val--;
- if (val <= 1) dir = 1;
- }
- _push_(P_SW2);
- P_SW2 |= 0x80;
- PWM00T2 = val;
- _pop_(P_SW2);
- }
- }
-
- void main()
- {
-
- P3M0 = 0x00;
- P3M1 = 0x00;
-
-
- PWMSET = 0x01; //使能PWM0模块(必须先使能模块后面的设置才有效)
-
- P_SW2 = 0x80;
- PWM0CKS = 0x00; // PWM0时钟为系统时钟
- PWM0C = CYCLE; //设置PWM0周期
- PWM00T1= 0x0000;
- PWM00T2= 0x0001;
- PWM00CR= 0x80; //使能PWM00输出
- P_SW2 = 0x00;
-
- PWMCFG01 = 0x05; //启动PWM0模块并使能PWM0中断
- EA = 1;
-
- while (1)
- {
- LED=0;
- }
-
-
- }
-
复制代码
|