找回密码
 立即注册

QQ登录

只需一步,快速开始

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

各位大佬,这个是一个PWM呼吸灯的程序,调用的是P1.0口,一直不成功,不知道哪里的...

[复制链接]
跳转到指定楼层
楼主
ID:882620 发表于 2021-6-22 17:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stc8g.h"
#include "intrins.h"


#define     PWM1C      (*(unsigned int volatile xdata *)0xff50)
#define     PWM10T1      (*(unsigned int volatile xdata *)0xff60)
#define     PWM10T2      (*(unsigned int volatile xdata *)0xff62)
#define CYCLE 0x1000


void PWM1_Isr() interrupt 28 // PWM1中断服务函数
{
static bit dir = 1;
static int val = 0;

if(PWMCFG01 & 0x80)
{
  PWMCFG01 &= ~0x80;     //清中断标志
  if(dir)
  {
   val++;
   if(val >= CYCLE) dir = 0;
  }
  else
  {
   val--;
   if(val <= 1) dir = 1;
  }
  PWM10T2 = val;
}
}

void main()
{
P1M1 = 0x00;
P1M0 = 0x01;
/*增强型PWM全局配置寄存器(PWMSET)*/
PWMSET = 0X02; //使能PWM1模块 (必须先使能模块后面的设置才有效)
/*外设端口切换寄存器2(P_SW2)*/
P_SW2 = 0x80; //打开扩展RAM区特殊功能寄存器(EAXFR)
/*PWM时钟选择寄存器(PWMnCKS)*/
PWM1CKS = 0X00; // 选择PWM时钟源为系统时钟 无分频
/*PWM计数器寄存器(PWMnCH.PWMnCL)*/
PWM1C = CYCLE; // 设置PWM1时钟周期  该地址是由两个8位CH,CL组合为int类型定义的16位地址
/*PWM输出电平计时寄存器*/
PWM10T1 = 0X0100; // 计时时间等于它输出低电平  与设置时钟周期同理
PWM10T2 = 0X0500; // 计时时间等于它输出高电平 与设置时钟周期同理
/*PWM通道控制寄存器*/
PWM10CR = 0x80; // 使能PWM10输出
P_SW2 = 0x00;
/*PWM配置寄存器*/
PWMCFG01 = 0x50;//启动PWM1使能PWM1中断
EA = 1; //打开总中断
while(1);

}

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

使用道具 举报

沙发
ID:123289 发表于 2021-6-23 10:57 | 只看该作者
先直接送0、1看看灯是明暗。
而后再做PWM。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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