天宁宁 发表于 2024-6-13 14:03:37

复制范例程序STC8G PWM中断 IO口指示灯没亮


添加了两个输出观察LED
sbit    PWM1   =   P3^5;
sbit    PWM2   =   P3^7;


    P3M0 = 0xF0; //
    P3M1 = 0x00;

P3.4 P3.5 P3.6 P3.7强推挽

第一次学习测试STC8GPWM

发现和定时器控制差不多
没有特殊的地方需要设置
IO口目测无反应


#include "reg51.h"
#include "intrins.h"

sfr   P_SW2   =   0xba;

sfr   PWMSET=   0xF1;
sfr   PWMCFG01 =0xF6;

#define PWM0CH      (*(unsigned char volatile xdata *)0xFF00)
#define PWM0CL      (*(unsigned char volatile xdata *)0xFF01)
#define PWM0CKS   (*(unsigned char volatile xdata *)0xFF02)

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;
sbit    PWM1   =   P3^5;
sbit    PWM2   =   P3^7;
sbit    P10   =   P1^0;
sbit    P11   =   P1^1;

void PWM0_Isr() interrupt 22
{
    if (PWMCFG01 & 0x08)
    {
      PWMCFG01 &= ~0x08;                      //清中断标志
      P10 = !P10;      
                               //测试端口
      PWM1=~PWM1;
      PWM2=~PWM2;
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x03;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0xF0; //
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    PWMSET = 0x01;                              //使能PWM0模块(必须先使能模块后面的设置才有效)

    P_SW2 = 0x80;                              //使能访问XFR特殊功能寄存器
    PWM0CKS = 0x0f;                           //PWM0时钟为系统时钟/16
    PWM0CH = 0x01;                              //设置PWM0周期为256个PWM0时钟
    PWM0CL = 0x00;
    P_SW2 = 0x00;                              //禁止访问特殊功能寄存器

    PWMCFG01 = 0x05;                            //启动PWM0模块并使能PWM0计数器中断
    EA = 1;

    while (1);
}



_奶咖君_ 发表于 2024-6-13 15:35:14

有一个问题啊,,你自己算过你这里设置的PWM的周期么?

xxxevery 发表于 2024-6-13 16:21:59

就是,你先确定PWM程序能跑起来,再看周期是多少,快了你也看不见啊

xxkj2010 发表于 2024-6-13 17:09:05

PWM这一块很难,我弄了好久才明白一点儿。
页: [1]
查看完整版本: 复制范例程序STC8G PWM中断 IO口指示灯没亮