51单片机点灯入门教程——2. 呼吸灯效果

基本说明

本章使用芯片:STC8H8K64U核心板

芯片手册:点此查看

Keil 开发环境配置:点此查看

本章学习内容:利用库函数,开发C程序,实现呼吸灯效果。

代码实例

需求:使用串口来控制呼吸灯效果,如果串口接收的数据为1,则奇数灯亮;如为0,则偶数位灯亮。

cpp 复制代码
#include "NVIC.h"
#include "GPIO.h"
#include "Config.h"
#include "Switch.h"
#include "STC8H_PWM.h"
#include "UART.h"
#include "Delay.h"


#define PEROID MAIN_Fosc/1000 //主频周期
#define LED_SW P45 //总开关接的P45引脚,要设置为低电平
#define LED1 P27
#define LED2 P26
#define LED3 P15
#define LED4 P14
#define LED5 P23
#define LED6 P22
#define LED7 P21
#define LED8 P20

PWMx_Duty duty;

void GPIO_Config(){
    GPIO_InitTypeDef init;
	init.Mode=GPIO_OUT_PP;//推挽输出
	init.Pin=GPIO_Pin_5;
    GPIO_Inilize(GPIO_P4, &init);

    init.Pin=GPIO_Pin_7 | GPIO_Pin_6 |GPIO_Pin_3 |GPIO_Pin_2 |GPIO_Pin_1 |GPIO_Pin_0 ;
    GPIO_Inilize(GPIO_P2, &init);

    init.Pin=GPIO_Pin_5 | GPIO_Pin_4;
    GPIO_Inilize(GPIO_P1, &init);

}

void UART_Config(){
    COMx_InitDefine init;
	init.UART_Mode = UART_8bit_BRTx;			
	init.UART_BRT_Use=BRT_Timer1;		
	init.UART_BaudRate=115200;		
	init.Morecommunicate=DISABLE;	
	init.UART_RxEnable=ENABLE;		
	init.BaudRateDouble=DISABLE;	
    UART_Configuration(UART1, &init);

    // UART会触发中断,所以要在NVIC中找到中断并配置优先级,URAT关系到写数据,所以优先级要高于其他任务
    NVIC_UART1_Init(ENABLE, Priority_3);
    // 切换引脚,本实验电路板默认就是PIN脚30、31 ,也可以不写,但有多组时必须配置
    UART1_SW(UART1_SW_P30_P31)	

}

void PWM_Config(){
    PWMx_InitDefine init;
    init.PWM_Mode=CCMRn_PWM_MODE1;			//模式,通常选择模式1或者模式2
	init.PWM_Period=PEROID-1;//周期时间,   0~65535	
	init.PWM_Duty=0;		//PWM占空比时间, 0~Period	
    init.PWM_DeadTime=0;	
    init.PWM_EnoSelect=ENO1P| ENO1N| ENO2P| ENO2N| ENO3P| ENO3N| ENO4P| ENO4N;		
    init.PWM_CEN_Enable=ENABLE;		
    init.PWM_MainOutEnable=ENABLE;
    // 配置PWMA和PWM1、PWM2、PWM3、PWM4
    PWM_Configuration(PWMA,&init);
    PWM_Configuration(PWM1,&init);
    PWM_Configuration(PWM2,&init);
    PWM_Configuration(PWM3,&init);
    PWM_Configuration(PWM4,&init);
    // 初始化PWMA的中断
    NVIC_PWM_Init(PWMA, DISABLE, Priority_0);
    //切换PWM引脚
    PWM1_SW(PWM1_SW_P20_P21);
    PWM2_SW(PWM2_SW_P22_P23);
    PWM3_SW(PWM3_SW_P14_P15);
    PWM4_SW(PWM4_SW_P26_P27);
}

void main(){
    int percent=0; //单片机中要使用的变量必须定义在离函数名最近的位置,否则编译时会报错未定义或重复定义
    int direction=1;
    EAXSFR(); //扩展寄存器访问使能, 使用PWM功能必须配置,且要配置在前面,否则可能无呼吸效果
    EA=1; //中断使能
    GPIO_Config();
    UART_Config();
    PWM_Config();
    // 总开关
    LED_SW=0;
    //点亮所有灯
    LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0;
    while (1)
    {
        // 倒计时5次确保缓冲区内此时没正在接收数据
        if (COM1.RX_TimeOut>0 &&--COM1.RX_TimeOut==0){
            // 判断缓冲区有数据
            if (COM1.RX_Cnt>0){
                if (RX1_Buffer[0]==0){
                     direction=1;
                     } 
                else if (RX1_Buffer[0]==1)
                    {
                        direction=-1;
                    }
                // 让duty_percent一直在0-100来回往返
                if (percent>=100){
                    percent=100;
                }else if(percent<=0){
                    percent=0;
                }
                percent +=direction;
                // 修改PWM的duty并更新
                duty.PWM1_Duty=PEROID*percent/100;
                duty.PWM2_Duty=PEROID*percent/100;
                duty.PWM3_Duty=PEROID*percent/100;
                duty.PWM4_Duty=PEROID*percent/100;
                UpdatePwm(PWMA, &duty);
                //缓冲区数据拿完后要将数据长度置为0
                COM1.RX_Cnt=0;
                //设置延时
                delay_ms(250);
                delay_ms(250);
                }
            }
        }
    }
    

}
相关推荐
清风6666664 小时前
基于STM32单片机的OneNet物联网粉尘烟雾检测系统
stm32·单片机·物联网·毕业设计·课程设计
文火冰糖的硅基工坊6 小时前
[硬件电路-192]:基级与发射极两端的电压超过1.5v可能是什么原因
单片机·嵌入式硬件·系统架构·电路·跨学科融合
源远流长jerry9 小时前
STM32之RTOS移植和使用
stm32·单片机·嵌入式硬件
2301_1472583699 小时前
STM32 单片机开发 - SPI 总线
单片机·嵌入式硬件
范纹杉想快点毕业16 小时前
ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)嵌入式编程 C语言 c++ 软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·51单片机
方圆工作室16 小时前
51单片机驱动数码管
单片机·嵌入式硬件·51单片机
范纹杉想快点毕业18 小时前
STM32 串口接收数据包(自定义帧头帧尾)
stm32·单片机·嵌入式硬件
茯苓gao18 小时前
STM32G4 电流环闭环
笔记·stm32·单片机·嵌入式硬件·学习
单片机系统设计19 小时前
基于stm32的环境监测系统/智能家居/空气质量监测系统
stm32·单片机·嵌入式硬件·毕业设计·智能家居
不知所云,20 小时前
5. STM32 时钟系统分配
stm32·单片机·嵌入式硬件