找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2180|回复: 9
打印 上一主题 下一主题
收起左侧

STC8G单片机PWM呼吸灯无输出什么原因?

[复制链接]
跳转到指定楼层
楼主
求助: STC8G1K08 DIP20用PWM实现呼吸灯效果,无输出是什么原因?

第一次调PWM,用的STC-ISP官方呼吸灯代码,手里只有万用表和LED灯,10K电阻,搞了一上午,灯也没呼吸,很是郁闷,因此来论坛求助。测量除地以外的所有管脚都是高电平,电压不变。可以肯定的是,电路板、MCU都没问题(刷正常的程序是好的,点灯测试也亮)。LED负极接P1.1,正极串10K电阻接+5V。

问题可能有点低级,大神勿喷哦。



单片机源程序如下:
#include "reg52.h"
#include "intrins.h"

#define CYCLE       0x1000

sfr     P_SW2   =   0xba;

sfr     PWMSET      =   0xF1;
sfr     PWMCFG01    =   0xF6;
sfr     PWMCFG23    =   0xF7;
sfr     PWMCFG45    =   0xFE;

sbit LED=P1^1;

#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;
           // LED=0; //点灯测试
          while (1);
        
}








PWM 呼吸灯代码.rar

885 Bytes, 下载次数: 8

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2022-10-19 14:33 | 只看该作者
这个是我自己用的一个PWM控制LED灯的程序
没有呼吸灯的效果,但是,是有PWM效果的,你参考一下,我手上没有这个单片机了,没有办法验证你的代码

PWM端口为P3.3

void stc8g_pwm1_init()//stc8g_pwm初始化
{
        CCON=0x00;                //先关闭PCA计数器
        CMOD=0x80;                //pwm时钟为系统时钟/12,空闲模式下停止PCA计数
        CCAPM1=0x42;        //PWM模式,无中断
        CL=0x00;                //
        CH=0x00;                //
        PCA_PWM1=0x00;        //输出为8位PWM
        CCAP1L=100;                 //比较值,当CL的值小于CCAP1L时,输出低电平
        CCAP1H=254;                 //重载值,CCAP1L=CCAP1H
        P_SW1=0x00;
        CR=1;
}


更改占空比
CCAP1H=64;                //75%占空比
CCAP1H=115;                //55%占空比
CCAP1H=180;                //30%占空比
首先,你要能输出PWM,这才是最重要的,能输出PWM了,呼吸灯就相对简单了,更改几次占空比,对比一下LED的亮度,就知道能不能输出PWM了
不需要什么其它工具的
回复

使用道具 举报

板凳
ID:25310 发表于 2022-10-19 15:25 | 只看该作者
c初始化PCA   CR=1;
回复

使用道具 举报

地板
ID:68189 发表于 2022-10-19 16:35 | 只看该作者
串接的电阻阻值太大了,可以串接500欧左右的电阻,官方代码一般直接烧写以后都能正常使用.......
回复

使用道具 举报

5#
ID:1034262 发表于 2022-10-19 17:18 | 只看该作者
直接烧写STC的例程里的HEX测试即可。
回复

使用道具 举报

6#
ID:1044091 发表于 2022-10-19 18:36 | 只看该作者
首先感谢各位回复! 我下的代码好像是“增强型PWM”的代码(里面有P_SW2寄存器),但我这款芯片STC8G1K08应该是没有“增强型PWM”。所以我又找了一个代码“PCA 输出PWM6/7/8/10位”,和前面Y_G_G 兄发的代码差不多,烧入芯片,这回LED亮了,改占空比亮度也变了。这个就是PWM么?我想实现调频率的效果要怎么操作呢?

感觉有一个范例叫“STC8G系列-增强型PWM-频率可调-脉冲计数”可能挺适合我的需求,可是在我这块芯片上还是不能用,难道要再换芯片么?


回复

使用道具 举报

7#
ID:401564 发表于 2022-10-19 22:22 | 只看该作者
ningsy 发表于 2022-10-19 18:36
首先感谢各位回复! 我下的代码好像是“增强型PWM”的代码(里面有P_SW2寄存器),但我这款芯片STC8G1K08应 ...

看数据手册呀
这个PWM是有一个寄存器是决定了频率的
数据手册有点恐怖,但认真看,再写几个验证一下就能理解了
STC几乎所有的PWM数据手册都是乱乱的一团.........
回复

使用道具 举报

8#
ID:1044091 发表于 2022-10-19 23:20 | 只看该作者
Y_G_G 发表于 2022-10-19 22:22
看数据手册呀
这个PWM是有一个寄存器是决定了频率的
数据手册有点恐怖,但认真看,再写几个验证一下就能 ...

感谢建议!那个数据手册真的很恐怖~

在论坛里翻出另一个大佬的代码,就是在您代码基础上加个定时器,已经有脉冲输出了。

没有示波器,现在只能看闪灯~
回复

使用道具 举报

9#
ID:1044091 发表于 2022-10-20 08:31 来自手机 | 只看该作者
wpppmlah 发表于 2022-10-19 16:35
串接的电阻阻值太大了,可以串接500欧左右的电阻,官方代码一般直接烧写以后都能正常使用.......

感谢回复!后来换成1K电阻,灯也亮了。主要原因应该是我这个型号的MCU没有“增强型PMW”功能,而我烧入了“增强型PMW”的代码。
回复

使用道具 举报

10#
ID:624769 发表于 2022-10-20 10:06 | 只看该作者
ningsy 发表于 2022-10-20 08:31
感谢回复!后来换成1K电阻,灯也亮了。主要原因应该是我这个型号的MCU没有“增强型PMW”功能,而我烧入了 ...

所以说,要看手册,要看手册,要看手册!!!  重要的事情说三遍。
你到现在还是“应该”,有就有,没有就没有,应该算什么?

手册中增强型PWM的第一页就明确表示了哪些型号有这个功能。内容是不是恐怖我们撇开不说,你但凡翻过手册,就不会出现“应该”两字。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表