通过按键改变直流电机小风扇的转速,转速分为:停止、低档、中档和高档,各档转速应差异明显,档位可循环切换,改变风扇转速的脉冲信号由STC8H1K28单片机内部的PWM资源产生。
引用头文件和特殊功能寄存器定义:
使用 #include <stc8h.h> 引用STC8H单片机的头文件。
使用 "intrins.h" 引用内置函数头文件。
定义了一系列特殊功能寄存器的地址宏,用于配置和控制PWM模块。
定义全局变量:
定义了一个名为 turn 的数组,包含4个元素,用于存储不同的PWM占空比值。
定义了一个整数 i,用于选择不同的PWM占空比。
setup() 函数:
配置了P0、P1、P2、P3、P4、P5口为数字输入/输出口。
配置了外部中断0和中断1的触发方式为边沿触发,并使能了外部中断。
通过 P_SW2 配置选择了外部中断0和1的引脚。
外部中断0和中断1的中断处理函数 KEY1():
当外部中断0触发时,i 自增,并进行循环切换不同的PWM占空比。
当 i 达到4时,重新置为0。
LED() 函数:
根据变量 i 的值,设置P0口的输出状态,实现LED的亮灭效果。
main() 函数:
在 main() 函数中,首先调用 setup() 函数进行初始化设置。进入一个无限循环,不断执行以下操作:
调用 LED() 函数以控制LED的亮灭。
配置PWM模块:
关闭PWM通道(PWMA_CCER1)。
设置PWM输出模式(PWMA_CCMR1)。
使能PWM通道(PWMA_CCER1)。
设置PWM占空比时间(PWMA_CCR1)。
设置PWM周期时间(PWMA_ARR)。
使能PWM端口输出(PWMA_ENO)。
使能主输出(PWMA_BKR)。
开始计时(PWMA_CR1)。
#include <stc8h.h>
#include "intrins.h"
#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc)
#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8)
#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1)
#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd)
#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5)
#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2)
#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0)
unsigned long turn[4]={0,300,600,980};
unsigned int i=0;
void setup()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P_SW2 = 0x80;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;//总中断开关
}
void KEY1(void) interrupt 0
{
i++;
if(i>=4)
{
i=0;
}
}
void LED()
{
if(i==0)
{
P0=0xff;
}
if(i==1)
{
P0=0xfe;
}
if(i==2)
{
P0=0xfd;
}
if(i==3)
{
P0=0xfb;
}
}
void main()
{
setup();
while (1)
{
LED();
PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCERx 关闭通道
PWMA_CCMR1 = 0x60; //设置 CC1 为 PWMA 输出模式
PWMA_CCER1 = 0x01; //使能 CC1 通道
PWMA_CCR1 =turn[i]; //设置占空比时间
PWMA_ARR = 1000; //设置周期时间
PWMA_ENO = 0x01; //使能 PWM1P 端口输出
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 = 0x01; //开始计时
};
}