STC8H系列MCU的PWM做呼吸灯IC解密
- IC解密/* --- STC MCU Limited ------------------------------------------------*/
- IC解密/* --- STC 1T Series MCU Demo Programme -------------------------------*/
- IC解密/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- IC解密/*---------------------------------------------------------------------*/
- /************* 功能说明 **************
- 本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试,STC8H系列芯片可通用参考.
- 高级PWM定时器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每个通道都可独立实现PWM输出,或者两两互补对称输出.
- 8个通道PWM设置对应P6的8个端口.
- 通过P6口上连接的8个LED灯,利用PWM实现呼吸灯效果.
- PWM周期和占空比可以根据需要自行设置,最高可达65535.
- 下载时, 选择时钟 24MHZ (用户可自行修改频率).
- ******************************************/
- #include "stc8h.h" //包含此头文件后,不需要再包含"reg51.h"头文件
- #include "intrins.h"
- #define MAIN_Fosc 24000000L //定义主时钟
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- /****************************** 用户定义宏 ***********************************/
- #define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒
- /*****************************************************************************/
- #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
- #define PWM_PERIOD 1023 //设置周期值
- /************* 本地变量声明 **************/
- 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)
- {
- P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
- P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P1M1 = 0x30; P1M0 = 0x30; //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
- 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
- PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
- PWMA_CCER2 = 0x00;
- PWMA_CCMR1 = 0x68; //通道模式配置
- PWMA_CCMR2 = 0x68;
- PWMA_CCMR3 = 0x68;
- PWMA_CCMR4 = 0x68;
- PWMA_CCER1 = 0x55; //配置通道输出使能和极性
- PWMA_CCER2 = 0x55;
- PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
- PWMA_ARRL = (u8)PWM_PERIOD;
- 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_3; //选择 PWM4_3 通道
- PWMA_BKR = 0x80; //使能主输出
- PWMA_CR1 |= 0x01; //开始计时
- P40 = 0; //给LED供电
- EA = 1; //打开总中断
- while (1)
- {
- }
- }

芯片解密