按键控制小风扇——PWM调档

通过按键改变直流电机小风扇的转速,转速分为:停止、低档、中档和高档,各档转速应差异明显,档位可循环切换,改变风扇转速的脉冲信号由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; //开始计时

};
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值