首页 > 其他分享 >51单片机--PWM

51单片机--PWM

时间:2023-12-13 09:01:25浏览次数:34  
标签:-- unsigned PWMA char 单片机 volatile xdata PWM define

芯片:STC8H1K28

目的:呼吸灯

这是一段官网下载的例程,配置了多路PWM,目前不知道具体寄存器赋值,先把能使用的代码贴上,后续再添加

#define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

#define PWMA_ENO     (*(unsigned char  volatile xdata *)  0xFEB1)
#define PWMA_PS      (*(unsigned char  volatile xdata *)  0xFEB2)
#define PWMB_ENO     (*(unsigned char  volatile xdata *)  0xFEB5)
#define PWMB_PS      (*(unsigned char  volatile xdata *)  0xFEB6)                               

#define PWMA_CR1     (*(unsigned char  volatile xdata *)  0xFEC0)
#define PWMA_CR2     (*(unsigned char  volatile xdata *)  0xFEC1)
#define PWMA_SMCR    (*(unsigned char  volatile xdata *)  0xFEC2) 
#define PWMA_ETR     (*(unsigned char  volatile xdata *)  0xFEC3) 
#define PWMA_IER     (*(unsigned char  volatile xdata *)  0xFEC4) 
#define PWMA_SR1     (*(unsigned char  volatile xdata *)  0xFEC5) 
#define PWMA_SR2     (*(unsigned char  volatile xdata *)  0xFEC6) 
#define PWMA_EGR     (*(unsigned char  volatile xdata *)  0xFEC7) 
#define PWMA_CCMR1   (*(unsigned char  volatile xdata *)  0xFEC8) 
#define PWMA_CCMR2   (*(unsigned char  volatile xdata *)  0xFEC9)
#define PWMA_CCMR3   (*(unsigned char  volatile xdata *)  0xFECA)
#define PWMA_CCMR4   (*(unsigned char  volatile xdata *)  0xFECB)
#define PWMA_CCER1   (*(unsigned char  volatile xdata *)  0xFECC)
#define PWMA_CCER2   (*(unsigned char  volatile xdata *)  0xFECD)
#define PWMA_CNTRH   (*(unsigned char  volatile xdata *)  0xFECE)
#define PWMA_CNTRL   (*(unsigned char  volatile xdata *)  0xFECF)
#define PWMA_PSCRH   (*(unsigned char  volatile xdata *)  0xFED0)
#define PWMA_PSCRL   (*(unsigned char  volatile xdata *)  0xFED1)
#define PWMA_ARRH    (*(unsigned char  volatile xdata *)  0xFED2)
#define PWMA_ARRL    (*(unsigned char  volatile xdata *)  0xFED3)
#define PWMA_RCR     (*(unsigned char  volatile xdata *)  0xFED4)
#define PWMA_CCR1H   (*(unsigned char  volatile xdata *)  0xFED5)
#define PWMA_CCR1L   (*(unsigned char  volatile xdata *)  0xFED6)
#define PWMA_CCR2H   (*(unsigned char  volatile xdata *)  0xFED7)
#define PWMA_CCR2L   (*(unsigned char  volatile xdata *)  0xFED8)
#define PWMA_CCR3H   (*(unsigned char  volatile xdata *)  0xFED9)
#define PWMA_CCR3L   (*(unsigned char  volatile xdata *)  0xFEDA)
#define PWMA_CCR4H   (*(unsigned char  volatile xdata *)  0xFEDB)
#define PWMA_CCR4L   (*(unsigned char  volatile xdata *)  0xFEDC)
#define PWMA_BKR     (*(unsigned char  volatile xdata *)  0xFEDD)
#define PWMA_DTR     (*(unsigned char  volatile xdata *)  0xFEDE)
#define PWMA_OISR    (*(unsigned char  volatile xdata *)  0xFEDF)

/*****************************************************************************/

#define PWM1_1      0x00    //P:P1.0  N:P1.1
#define PWM1_2      0x01    //P:P2.0  N:P2.1
#define PWM1_3      0x02    //P:P6.0  N:P6.1

#define PWM2_1      0x00    //P:P1.2/P5.4  N:P1.3
#define PWM2_2      0x04    //P:P2.2  N:P2.3
#define PWM2_3      0x08    //P:P6.2  N:P6.3

#define PWM3_1      0x00    //P:P1.4  N:P1.5
#define PWM3_2      0x10    //P:P2.4  N:P2.5
#define PWM3_3      0x20    //P:P6.4  N:P6.5

#define PWM4_1      0x00    //P:P1.6  N:P1.7
#define PWM4_2      0x40    //P:P2.6  N:P2.7
#define PWM4_3      0x80    //P:P6.6  N:P6.7
#define PWM4_4      0xC0    //P:P3.4  N:P3.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80

/*************  本地变量声明    **************/
bit B_1ms;          //1ms标志

u16 PWM1_Duty;
u16 PWM2_Duty;
u16 PWM3_Duty;
u16 PWM4_Duty;

bit PWM1_Flag;
bit PWM2_Flag;
bit PWM3_Flag;
bit PWM4_Flag;

void UpdatePwm(void);

/******************** 主函数 **************************/
void main(void)
{
    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    PWM1_Flag = 0;
    PWM2_Flag = 0;
    PWM3_Flag = 0;
    PWM4_Flag = 0;
    
        PWM1_Duty = 0;
        PWM2_Duty = 256;
        PWM3_Duty = 512;
        PWM4_Duty = 1024;

    //  Timer0初始化
    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload, 
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
    TR0 = 1;    //Tiner0 run

    P_SW2 |= 0x80;
        
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;
    PWMA_CCMR1 = 0x60; //通道模式配置
    PWMA_CCMR2 = 0x60;
    PWMA_CCMR3 = 0x60;
    PWMA_CCMR4 = 0x60;
    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;

    PWMA_ARRH = 0x03; //设置周期时间
    PWMA_ARRL = 0xff;

    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出
    PWMA_ENO |= ENO1N; //使能输出
    PWMA_ENO |= ENO2P; //使能输出
    PWMA_ENO |= ENO2N; //使能输出
    PWMA_ENO |= ENO3P; //使能输出
    PWMA_ENO |= ENO3N; //使能输出
    PWMA_ENO |= ENO4P; //使能输出
    PWMA_ENO |= ENO4N; //使能输出

    PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_3; //选择 PWM1_3 通道
    PWMA_PS |= PWM2_3; //选择 PWM2_3 通道
    PWMA_PS |= PWM3_3; //选择 PWM3_3 通道
    PWMA_PS |= PWM4_2; //选择 PWM4_3 通道

    PWMA_BKR = 0x80; //使能主输出
    PWMA_CR1 |= 0x01; //开始计时
    P_SW2 &= 0x7f;

    P40 = 0;        //给LED供电
    EA = 1;     //打开总中断

    while (1)
    {
        }
}


/********************** Timer0 1ms中断函数 ************************/
void timer0(void) interrupt 1
{
        if(!PWM1_Flag)
        {
                PWM1_Duty++;
                if(PWM1_Duty >= 2047) PWM1_Flag = 1;
        }
        else
        {
                PWM1_Duty--;
                if(PWM1_Duty <= 0) PWM1_Flag = 0;
        }

        if(!PWM2_Flag)
        {
                PWM2_Duty++;
                if(PWM2_Duty >= 2047) PWM2_Flag = 1;
        }
        else
        {
                PWM2_Duty--;
                if(PWM2_Duty <= 0) PWM2_Flag = 0;
        }

        if(!PWM3_Flag)
        {
                PWM3_Duty++;
                if(PWM3_Duty >= 2047) PWM3_Flag = 1;
        }
        else
        {
                PWM3_Duty--;
                if(PWM3_Duty <= 0) PWM3_Flag = 0;
        }

        if(!PWM4_Flag)
        {
                PWM4_Duty++;
                if(PWM4_Duty >= 2047) PWM4_Flag = 1;
        }
        else
        {
                PWM4_Duty--;
                if(PWM4_Duty <= 0) PWM4_Flag = 0;
        }
        
        UpdatePwm();
}


//========================================================================
// 函数: UpdatePwm(void)
// 描述: 更新PWM占空比. 
// 参数: none.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void UpdatePwm(void)
{
    P_SW2 |= 0x80;
    PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
    PWMA_CCR1L = (u8)(PWM1_Duty);
    PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
    PWMA_CCR2L = (u8)(PWM2_Duty);
    PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
    PWMA_CCR3L = (u8)(PWM3_Duty);
    PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //设置占空比时间
    PWMA_CCR4L = (u8)(PWM4_Duty);
    P_SW2 &= 0x7f;
}

 我只使用了1路PWM

代码如下:

 1 void PWMA_config(void)
 2 {
 3     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
 4     PWMA_CCER2 = 0x00;
 5     PWMA_CCMR4 = 0x60; //设置 CC1 为 PWMA 输出模式
 6     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
 7     PWMA_CCER2 = 0x55;
 8     PWMA_ARRH = 0x03; //设置周期时间
 9     PWMA_ARRL = 0xff;
10     PWMA_ENO = 0x00;
11     PWMA_ENO |= ENO4P; //使能输出
12     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
13     PWMA_PS |= 0x40; //选择 PWM4_3 通道
14     PWMA_BKR = 0x80; //使能主输出
15     PWMA_CR1 |= 0x01; //开始计时
16     P_SW2 &= 0x7f;
17 }
18 
19 void UpdatePwm(u16 duty)
20 {
21   P_SW2 |= 0x80;
22 
23   PWMA_CCR4H = (u8)(duty >> 8); //设置占空比时间
24   PWMA_CCR4L = (u8)(duty);
25   P_SW2 &= 0x7f;
26 }

 

标签:--,unsigned,PWMA,char,单片机,volatile,xdata,PWM,define
From: https://www.cnblogs.com/yianyan/p/17898260.html

相关文章

  • [ARC141C] Bracket and Permutation
    考虑假设已知括号序列\(s\),如何求出\(p,q\)。对于求\(p\),考虑从\(s_1\)到\(s_n\)逐个往里放,如果能放就直接放,肯定不劣,否则就从后面抽最近的左括号放过来,然后继续放。不难证明不存在更优方案,对于\(q\)同理。接下来我们发现,如果\(p\)中存在\(p_i<p_{i-1}\),\(s_{p_{i......
  • [20231207]开发不应该这样写sql4.txt
    [20231207]开发不应该这样写sql4.txt--//最近在优化sql语句,发现另外一种风格,实际上以前也遇到过,感觉这就像一种病,会传染只要一个这样写后面的要么跟进要么--//不改。我觉得开发应该感谢exadata,不然我们的生产系统估计会垮掉。1.环境:XXXXXX>@ver1PORT_STRING          ......
  • 【Centos】Centos 7.6 安装 XXL-JOB
    1  前言前面我们安装了JDK以及MySQL哈,我们继续安装XXL-JOB,官网详细教程。https://www.xuxueli.com/xxl-job/https://www.xuxueli.com/xxl-job/#1.5%20%E4%B8%8B%E8%BD%BD2 安装步骤2.1 下载源码https://gitee.com/xuxueli0323/xxl-job2.2 数据库初始化不需......
  • C++ Qt开发:RadioButton单选框分组组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QRadioButton单选框组件以及与之交互的QButtonGroup类的常用方法及灵活运用。QRadioButton是Qt框......
  • ubuntu系统使用vi编辑正常的解决办法
    ubuntu系统使用vi编辑出现无法正常使用 发现ubuntu下Vi编辑器在文本输入模式时,使用方向键和退格键不正常,或者按“i"后,仍是输入内容无法正常的内容 解决方法: 用vi打开/etc/vim/vimrc.tiny,输入以下两行: setnocompatible setbackspace=2 这样就切换到非兼容模式......
  • 轮询操作select和poll
    select和poll系统调用最终会使设备驱动中的poll()函数被执行,Linux2.5.45内核还引入和epoll()即extendedpoll。intselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)其中readfds、writefds、exceptfds分别是select()监视的读、......
  • 算法分析设计复习 (时间复杂度)
    目录前言求递推关系式例一汉诺塔算法简述求关系式例二分治法求最大值算法简述求关系式求时间复杂度例一汉诺塔扩展找规律大O表示法例二分治法求最大值扩展找规律大O表示法前言本文为JMU22级软件算法分析考前复习而总结归纳,讲解时间复杂度的计算。应该重点考察递归算法的拓......
  • JavawebDay2JavaScript
      1.脚本:不用经过编译2.与Java语言完全不同但是基础语法类似一:js引入方式   第一种:   第二种  1*alert:当进入文档时会跳出一个警告框。suchas:二:js基础语法    1书写语法   2输出语句window.可以省略三:基础语法1变量   var特点:a:......
  • DC-8靶场
    准备:目标:获得root权限攻击虚拟机:kali  DC-8靶场:DC:8~VulnHub 虚拟机:IP地址 192.168.88.130 靶场IP地址:192.168.88.129 第一步:信息收集通过arp-scan-l查看本网段的虚拟机也可以通过nmap或者 netdiscover-r192.168.88.0/24netdiscover-r192.168.88......
  • 二十、函数(三)
    二十、函数(三)1、函数重载函数重载技术运行我们创建函数名称相同的函数,但是为了编译器能够正确的编译这个程序,这些函数需要采用不同的参数列表来区分(即函数名相同,参数类型不同)。C语言中无法进行函数重载1)项目设计①设计一个函数,能够使得函数求出两个int值的平均值②设计一个......