vb2002 发表于 2024-5-26 14:06:10

看了stc isp的软件上面的范例程序,怎么使用|已解决

本帖最后由 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 intvolatile 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 intvolatile 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 intvolatile 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 intvolatile 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;
    }

      
}



cjtdz 发表于 2024-5-26 14:10:16

本帖最后由 cjtdz 于 2024-5-26 14:13 编辑

STC8/STC32系列单片机必须要初始化端口,它的端口不是默认的通用51单片机的状态,用哪些端口,必须配置(即设定)哪些端口工作状态。

vb2002 发表于 2024-5-26 14:14:21

cjtdz 发表于 2024-5-26 14:10
STC8/STC32系列单片机必须要初始化端口,它的端口不是默认的通用51单片机的状态。 ...

我不是已经配置   P3M0 = 0x00;P3M1 = 0x00;了吗?
难道是要配置 pwm那个吗?

神农鼎 发表于 2024-5-26 15:26:46

用仿真功能,仿真调试,排查程序错在哪

仿真STC8,STC-USB Link1D支持STC32/STC8仿真及下载 !视频讲解 - 仿真/编译器/头文件 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

soma 发表于 2024-5-26 19:36:21

程序仿真一下看什么情况。或者直接下载例程看下

vb2002 发表于 2024-5-26 20:15:07

soma 发表于 2024-5-26 19:36
程序仿真一下看什么情况。或者直接下载例程看下

就是用的范例程序,不懂配置p33,pwm呼吸

vb2002 发表于 2024-5-27 01:12:02

懂了懂了,刚刚试了手册上的示例
终于用pwm点亮led了
弄了一晚上

vb2002 发表于 2024-5-27 08:20:39

还是不会调整亮度。。。手册写的很清楚,就是不会换算了,
64位/PCA时钟频率

乘风飞扬 发表于 2024-5-27 09:21:02

vb2002 发表于 2024-5-27 08:20
还是不会调整亮度。。。手册写的很清楚,就是不会换算了,
64位/PCA时钟频率
...

这是PCA型PWM模式介绍,而你在1楼帖的代码是15位增强型PWM的设置。
增强型PWM通过PWMxxT1, PWMxxT2两个寄存器设置占空比,PWMxxT1=0的话只要调整PWMxxT2寄存器即可,注意这是扩展寄存器,设置时要确保扩展寄存器访问使能已经打开。
建议将你代码里面的P_SW2 = 0x00;指令删掉,扩展寄存器访问使能在初始化前面开启后就不需要关闭了。

angmall 发表于 2024-5-27 09:42:10

vb2002 发表于 2024-5-26 20:15
就是用的范例程序,不懂配置p33,pwm呼吸

你是不是还用这个stc8g1k08a做实验?

stc8g1k08a是没有增强型PWM的。



页: [1] 2
查看完整版本: 看了stc isp的软件上面的范例程序,怎么使用|已解决