看了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:13 编辑
STC8/STC32系列单片机必须要初始化端口,它的端口不是默认的通用51单片机的状态,用哪些端口,必须配置(即设定)哪些端口工作状态。 cjtdz 发表于 2024-5-26 14:10
STC8/STC32系列单片机必须要初始化端口,它的端口不是默认的通用51单片机的状态。 ...
我不是已经配置 P3M0 = 0x00;P3M1 = 0x00;了吗?
难道是要配置 pwm那个吗?
用仿真功能,仿真调试,排查程序错在哪
仿真STC8,STC-USB Link1D支持STC32/STC8仿真及下载 !视频讲解 - 仿真/编译器/头文件 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
程序仿真一下看什么情况。或者直接下载例程看下 soma 发表于 2024-5-26 19:36
程序仿真一下看什么情况。或者直接下载例程看下
就是用的范例程序,不懂配置p33,pwm呼吸 懂了懂了,刚刚试了手册上的示例
终于用pwm点亮led了
弄了一晚上 还是不会调整亮度。。。手册写的很清楚,就是不会换算了,
64位/PCA时钟频率
vb2002 发表于 2024-5-27 08:20
还是不会调整亮度。。。手册写的很清楚,就是不会换算了,
64位/PCA时钟频率
...
这是PCA型PWM模式介绍,而你在1楼帖的代码是15位增强型PWM的设置。
增强型PWM通过PWMxxT1, PWMxxT2两个寄存器设置占空比,PWMxxT1=0的话只要调整PWMxxT2寄存器即可,注意这是扩展寄存器,设置时要确保扩展寄存器访问使能已经打开。
建议将你代码里面的P_SW2 = 0x00;指令删掉,扩展寄存器访问使能在初始化前面开启后就不需要关闭了。 vb2002 发表于 2024-5-26 20:15
就是用的范例程序,不懂配置p33,pwm呼吸
你是不是还用这个stc8g1k08a做实验?
stc8g1k08a是没有增强型PWM的。
页:
[1]
2