活动介绍

/******************* 流水灯功能 ********************/ #ifndef LED_H_ #define LED_H_ typedef unsigned char uchar; typedef unsigned int uint; #define LED1 0 #define LED2 1 #define LED0_PRO P1_0 #define LED1_PRO P1_1 #define ON 1 #define OFF 0 void DelayMS(uint msec); void InitLED(uchar LEDx); void SetLED(uchar LEDx,uchar state); #endif

时间: 2023-07-23 22:55:19 浏览: 138
这是一个头文件,定义了LED的相关操作函数。该头文件中使用了条件编译,保证该头文件只会被编译一次,防止重复定义。其中定义了两个类型别名uchar和uint,分别代表unsigned char和unsigned int。另外定义了LED1和LED2的编号,以及LED0_PRO和LED1_PRO表示LED的控制引脚。同时定义了ON和OFF表示LED的亮灭状态,以及DelayMS函数用于延时,InitLED函数用于初始化LED,SetLED函数用于设置LED的状态。
相关问题

int main(void) { int i; unsigned int* p_sfr; /** 使能GPIOC口时钟 */ p_sfr = (void*)0x40023830; /**< RCC_AHB1ENR([4]P117) */ *p_sfr = 0x04ul; /** GPIOC0引脚设为输出模式 */ p_sfr = (void*)0x40020800; /**< GPIOC_MODER([4]P157) */ *p_sfr = 0x01ul; while(1) { /** GPIOC0引脚输出高电平 */ p_sfr = (void*)0x40020818; /**< GPIOC_BSRR([4]P160) */ *p_sfr = 0x01ul; /** 延时 */ for(i = 0ul; i < 5000000; i++); /** GPIOC0引脚输出低电平 */ *p_sfr = 0x10000; /** 延时 */ for(i = 0ul; i < 5000000; i++); } } 参考案例STM32F411RCT6开发板“led_v0.1”,使用寄存器地址方式在学习板上实现流水灯 功能,控制引脚PC0-PC7,低电平有效要设置PC0-PC7为输出模式 可使用for循环+位操作-(1<<i)(严格依照案例的代码与开发板内置代码进行修改完成功能)

以下是基于您的需求完成的代码及其详细解释: ```c int main(void) { int i; unsigned int* p_sfr; // 1. 使能GPIOC口时钟 p_sfr = (unsigned int*)0x40023830; // RCC_AHB1ENR 寄存器地址,使能GPIOC时钟 *p_sfr |= 0x04ul; // 设置第2位(对应PC),开启GPIOC时钟 // 2. 配置GPIOC的引脚PC0~PC7为输出模式 p_sfr = (unsigned int*)0x40020800; // GPIOC_MODER 寄存器地址 for (i = 0; i <= 7; i++) { *p_sfr &= ~(0x3 << (i * 2)); // 清除原有配置 *p_sfr |= (0x1 << (i * 2)); // 设置为输出模式(0b01) } while(1) { // 流水灯效果:依次点亮PC0到PC7 for (i = 0; i <= 7; i++) { // 输出低电平有效信号 p_sfr = (unsigned int*)0x40020818; // GPIOC_BSRR 寄存器地址 *p_sfr = (1u << i); // 设置对应的bit位置1,表示该引脚输出低电平 // 延时 for(int j = 0; j < 5000000; j++); // 撤销低电平 p_sfr = (unsigned int*)0x4002081C; // GPIOC_BRR 寄存器地址 *p_sfr = (1u << i); // 清零对应的比特位,恢复高电平 // 再次延时 for(int j = 0; j < 5000000; j++); } } } ``` ### **代码解析** 1. **寄存器初始化** - `p_sfr` 被赋值为不同的外设寄存器地址,并通过指针访问这些硬件寄存器。 - 使用了 STM32 的内部寄存器地址表,分别对 `RCC_AHB1ENR`, `GPIOC_MODER`, 和 `GPIOC_BSRR/BRR` 进行操作。 2. **配置 PC0-PC7 引脚为输出模式** - MODER 寄存器中每两位定义了一个引脚的功能模式。将每个引脚清零并设置为 `0b01` 表示输出模式。 3. **流水灯实现** - BSRR(复位/置位寄存器)用于直接设置或清除某个引脚的状态。 - `(1u << i)` 将对应引脚拉低。 - BRR(复位寄存器)则负责撤回这个状态,回到默认高电平。 4. **延迟处理** - 简单地使用嵌套 for 循环来模拟软件延时。 --- ####

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2025 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include "string.h" #include "stdint.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ unsigned char KEY1_Status; unsigned char KEY1_Status_old=1; unsigned char KEY2_Status; unsigned char KEY2_Status_old=1; unsigned char KEY3_Status; unsigned char KEY3_Status_old=1; unsigned char KEY4_Status; unsigned char KEY4_Status_old=1; uint16_t Duty=20; uint16_t Step=20; uint8_t Mode = 0; uint8_t key1Pressed = 0; uint8_t led_index = 2; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ void LED_contorl(unsigned char led_num,unsigned char led_on); void KEY_Scan(void); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM3_Init(); MX_TIM4_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 200); KEY_Scan(); // for(int i=2;i<=8;i++) // { // HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET); // LED_contorl(i,1); // HAL_Delay(1000); // } // for(Duty=0;Duty<=200;Duty=Duty+Step) // { // __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,Duty); // HAL_Delay(200); // } // for (Duty = 200; Duty > 0; Duty -= Step) // { // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Duty); // HAL_Delay(100); // } } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Configure the main internal regulator output voltage */ HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV6; RCC_OscInitStruct.PLL.PLLN = 85; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } /** Initializes the peripherals clocks */ PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ void LED_contorl(unsigned char led_num,unsigned char led_on) { if(led_on){ HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8 << (led_num-1),GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8 << (led_num-1),GPIO_PIN_SET); } HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); } void KEY_Scan(void) { KEY1_Status=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); KEY2_Status=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1); KEY3_Status=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2); KEY4_Status=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); if(KEY1_Status==0&&KEY1_Status_old==1) { Mode++; if(Mode > 4) Mode = 1; switch(Mode) { case 1: LED_contorl(2,1); HAL_Delay(20); // while(1) { // for(Duty=0;Duty<=200;Duty=Duty+Step) // { // __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,Duty); // HAL_Delay(200); // // KEY1_Status=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); // if(KEY1_Status == 0) break; // } // if(KEY1_Status == 0) break; // for (Duty = 200; Duty > 0; Duty -= Step) // { // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Duty); // HAL_Delay(100); // // KEY1_Status=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); // if(KEY1_Status == 0) break; // } // // if(KEY1_Status == 0) break; // } break; case 2: // LED_contorl(2,0); break; case 3: HAL_Delay(20); LED_contorl(3,1); KEY2_Status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); if(KEY2_Status == 0&&KEY2_Status_old==1) { LED_contorl(3, 0); // HAL_Delay(20); // if(KEY2_Status == 0 && Duty < 200) { // Duty += Step; // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Duty); // } } KEY2_Status_old=KEY2_Status; while(1) { KEY2_Status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); KEY3_Status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2); KEY1_Status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 200); if(KEY1_Status == 0) { HAL_Delay(20); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 200); break; } if(KEY3_Status == 0&&KEY3_Status_old==1) { LED_contorl(3, 0); // HAL_Delay(20); // if(KEY3_Status == 0 && Duty >0) { // Duty -= Step; // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Duty); // } } KEY1_Status_old=KEY1_Status; KEY2_Status_old=KEY2_Status; KEY3_Status_old=KEY3_Status; HAL_Delay(50); } LED_contorl(5,1); break; case 4: HAL_Delay(20); LED_contorl(3,0); break; } } KEY1_Status_old=KEY1_Status; KEY2_Status_old=KEY2_Status; KEY3_Status_old=KEY3_Status; KEY4_Status_old=KEY4_Status; } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t led_index = 2; if (htim->Instance == TIM4) { LED_contorl(led_index, 0); led_index++; if (led_index > 8) { led_index = 2; } LED_contorl(led_index, 1); } } /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 在case2那里写一下函数,使得可以利用定时器控制流水灯

### 修改后的代码 在 `case 2` 中,我们可以通过定时器中断来控制流水灯的效果。以下是修改后的代码: ```c case 2: LED_contorl(2, 0); // 关闭 LED 2 HAL_Delay(20); // 防抖处理 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 200); // 设置 PWM 占空比为 200 // 启动定时器 4 的中断以实现流水灯效果 HAL_TIM_Base_Start_IT(&htim4); while (1) { // 检测按键 1 是否按下 if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0) { HAL_Delay(20); // 防抖处理 if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0) { break; // 跳出循环进入模式 3 } } // 等待定时器中断触发 LED 流水灯效果 HAL_Delay(50); // 减少 CPU 占用率 } // 停止定时器中断 HAL_TIM_Base_Stop_IT(&htim4); Mode = 3; // 进入模式 3 break; ``` --- ### 定时器中断服务程序 为了实现流水灯效果,需要在定时器中断服务程序中更新 LED 状态。以下是定时器中断服务程序的代码: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t led_index = 2; // 当前点亮的 LED 索引 if (htim->Instance == TIM4) { // 判断是否是定时器 4 的中断 // 关闭当前 LED LED_contorl(led_index, 0); // 更新到下一个 LED led_index++; if (led_index > 8) { led_index = 2; // 循环回到 LED 2 } // 打开下一个 LED LED_contorl(led_index, 1); } } ``` --- ### 解释 1. **定时器配置**: - 使用 `HAL_TIM_Base_Start_IT(&htim4)` 启动定时器 4 的中断。 - 定时器 4 的中断周期决定了 LED 流水灯的切换速度。 2. **LED 流水灯逻辑**: - 在定时器中断服务程序中,通过 `led_index` 变量控制当前点亮的 LED。 - 每次中断触发时,关闭当前 LED 并打开下一个 LED,形成流水灯效果。 3. **按键检测**: - 在主循环中检测按键 1 的状态,如果按键被按下,则跳出循环,进入模式 3。 4. **退出定时器中断**: - 在离开 `case 2` 时,调用 `HAL_TIM_Base_Stop_IT(&htim4)` 停止定时器中断,避免对其他模式产生干扰。 5. **模式切换**: - 如果按键 1 被按下,则将 `Mode` 设置为 3,直接进入模式 3。 --- ### 测试与验证 1. **测试 LED 流水灯效果**: - 观察 LED 是否按照流水灯效果依次点亮和熄灭。 2. **测试按键功能**: - 按下按键 1,观察程序是否正确进入模式 3。 3. **调试输出**: - 可以通过 UART 输出调试信息,确认程序逻辑是否正确执行。 --- ### 相关问题
阅读全文

相关推荐

#include "stm32f10x.h" /*******************************************************************************/ #define LED_RCC RCC_APB2Periph_GPIOB #define LED_PORT GPIOB //PB #define LED_PIN GPIO_Pin_1 //1 /******************************************************************************* * @brief ʱ * @param None * @retval None *******************************************************************************/ void Delay(u16 x) { u32 a,b; for(a = x;a > 0;a--) { for(b = 0x0001FFFF;b > 0;b--); } } /******************************************************************************* * @brief LED ʼ * @param None * @retval None *******************************************************************************/ void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);//ʹ GPIOEʱ GPIO_InitStructure.GPIO_Pin = LED_PIN ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO ٶ Ϊ50MHz GPIO_Init(LED_PORT, &GPIO_InitStructure); // ʼ GPIOE.3~5 GPIO_SetBits(LED_PORT, LED_PIN );//PB1灭 } /******************************************************************************* * @brief * @param None * @retval None *******************************************************************************/ int main(void) { LED_Init(); while(1) { GPIO_ResetBits(LED_PORT,LED_PIN); //PB1亮 Delay(116); GPIO_SetBits(LED_PORT, LED_PIN); //PB1灭 Delay(116); } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { while (1) { } } #endif /** * @} */ /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/(8) 基于参考程序(只控制PB1的亮灭)进行修改,控制PB0和PB1两个灯处于流水灯运行模式(交替亮灭) (9) 每位同学根据自己学号的后2位(比如XY),设置PB0和PB1交替亮灭的间隔时间为(100+XY)毫秒,并编译程序下载至控制板进行观察和记录。

#ifndef _led_H #define _led_H #include "stm32f10x.h" /* LED时钟端口、引脚定义 */ #define LED1_PORT GPIOB #define LED1_PIN GPIO_Pin_5 #define LED1_PORT_RCC RCC_APB2Periph_GPIOB #define LED2_PORT GPIOE #define LED2_PIN GPIO_Pin_5 #define LED2_PORT_RCC RCC_APB2Periph_GPIOE void LED_Init(void); #endif #include "led.h" /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量 RCC_APB2PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE); GPIO_InitStructure.GPIO_Pin=LED1_PIN; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(LED1_PORT,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(LED1_PORT,LED1_PIN); //将LED端口拉高,熄灭所有LED GPIO_InitStructure.GPIO_Pin=LED2_PIN; //选择你要设置的IO口 GPIO_Init(LED2_PORT,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(LED2_PORT,LED2_PIN); //将LED端口拉高,熄灭所有LED } #include "stm32f10x.h" #include "led.h" /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,通过while循环占用CPU,达到延时功能 * 输 入 : i * 输 出 : 无 *******************************************************************************/ void delay(u32 i) { while(i--); } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { LED_Init(); while(1) { GPIO_ResetBits(LED1_PORT,LED1_PIN);//点亮DS0 delay(6000000); GPIO_SetBits(LED1_PORT,LED1_PIN); delay(6000000); } } 对以上代码进行改写,将其由原本的一个灯亮变为8个流水灯亮

#include "reg52.h" #include "intrins.h" typedef unsigned int u16; typedef unsigned char u8; sbit BEEP = P2^5; // 蜂鸣器控制引脚 // 独立按键定义 sbit KEY1 = P3^1; sbit KEY2 = P3^0; sbit KEY3 = P3^2; // 外部中断0 sbit KEY4 = P3^3; // 外部中断1 // LED定义 sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7; #define LED_PORT P2 // 全局变量 bit flag_key1 = 0; bit flag_key2 = 0; bit flag_key3 = 0; bit flag_key4 = 0; bit flow_interrupted = 0; // 新增标志位,表示流水灯被中断 /******************************************************************************* * 函 数 名 : delay_10us * 函数功能 : 延时函数,ten_us=1时,大约延时10us * 输 入 : ten_us * 输 出 : 无 *******************************************************************************/ void delay_10us(u16 ten_us) { while(ten_us--); } /******************************************************************************* * 函 数 名 : led_flow * 函数功能 : 流水灯函数,向右循环点亮LED一次 *******************************************************************************/ void led_flow() { u8 i = 0; LED_PORT = ~0x01; // 初始状态,点亮LED1,熄灭其他LED delay_10us(50000); // 延时约100ms for(i = 0; i < 7; i++) { // 将LED左移一位,实现向右流水效果 if(flow_interrupted) // 检查是否被中断 { flow_interrupted = 0; LED_PORT = 0xFF; // 关闭所有LED return; } ​​LED_PORT = _crol_(LED_PORT, 1); // 循环左移一位,相当于LED向右移动一位 delay_10us(50000); // 延时约100ms } LED_PORT = 0xFF; // 关闭所有LED } /******************************************************************************* * 函 数 名 : beep_alarm * 函数功能 : 蜂鸣器报警函数,循环5次 *******************************************************************************/ void beep_alarm() { u8 i; for(i=0; i<5; i++) { BEEP = 0; // 蜂鸣器响 delay_10us(50000); BEEP = 1; // 蜂鸣器停 delay_10us(50000); } } /******************************************************************************* * 函 数 名 : key1_process * 函数功能 : 按键1处理函数,LED1闪烁10次 *******************************************************************************/ void key1_process() { u8 i; for(i=0; i<10; i++) { LED1 = 0; // LED1亮 delay_10us(50000); LED1 = 1; // LED1灭 delay_10us(50000); // 检查是否被中断打断 if(flag_key3 || flag_key4) break; } flag_key1 = 0; } /******************************************************************************* * 函 数 名 : key2_process * 函数功能 : 按键2处理函数,所有LED闪烁10次 *******************************************************************************/ void key2_process() { u8 i; for(i=0; i<10; i++) { LED_PORT = 0x00; // 所有LED亮 delay_10us(50000); LED_PORT = 0xFF; // 所有LED灭 delay_10us(50000); // 检查是否被中断打断 if(flag_key3 || flag_key4) break; } flag_key2 = 0; } /******************************************************************************* * 函 数 名 : Int0Init * 函数功能 : 设置外部中断0 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void exti0_init() { IT0 = 1; // 设置外部中断0为边沿触发方式 EX0 = 1; // 打开外部中断0允许 EA = 1; // 打开总中断 } /******************************************************************************* * 函 数 名 : Int1Init * 函数功能 : 设置外部中断1 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void exti1_init() { IT1 = 1; // 设置外部中断1为边沿触发方式 EX1 = 1; // 打开外部中断1允许 EA = 1; // 打开总中断 PX1 = 1; // 设置外部中断1为高优先级 } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { LED_PORT = 0xFF; // 关闭所有LED BEEP = 1; // 关闭蜂鸣器 exti0_init(); // 初始化外部中断0 exti1_init(); // 初始化外部中断1 while(1) { // 检测按键1按下 if(KEY1 == 0) { delay_10us(1000); // 消抖 if(KEY1 == 0) { flag_key1 = 1; while(!KEY1); // 等待按键释放 } } // 检测按键2按下 if(KEY2 == 0) { delay_10us(1000); // 消抖 if(KEY2 == 0) { flag_key2 = 1; while(!KEY2); // 等待按键释放 } } // 处理按键1任务 if(flag_key1 && !flag_key3 && !flag_key4) { key1_process(); } // 处理按键2任务 if(flag_key2 && !flag_key3 && !flag_key4) { key2_process(); } // 处理按键3任务 if(flag_key3 && !flag_key4) { led_flow(); flag_key3 = 0; } // 处理按键4任务 if(flag_key4) { beep_alarm(); flag_key4 = 0; } } } /******************************************************************************* * 函 数 名 : Int0_Routine * 函数功能 : 外部中断0服务函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void exti0() interrupt 0 { flag_key3 = 1; // 设置按键3标志 } /******************************************************************************* * 函 数 名 : Int1_Routine * 函数功能 : 外部中断1服务函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void exti1() interrupt 2 { flag_key4 = 1; // 设置按键4标志 ​ if(flag_key3) // 如果正在执行按键3的任务 { flow_interrupted = 1; // 设置中断标志 flag_key3 = 0; // 清除按键3标志 }

/************************************************************************************** 深圳市普中科技有限公司(PRECHIN 普中) 技术支持:www.prechin.net 实验名称:LED流水灯实验 接线说明: 实验现象:下载程序后“LED模块”的D1-D8指示左右点亮 注意事项: ***************************************************************************************/ #include "reg52.h" #include "intrins.h" typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; #define LED_PORT P2 //使用宏定义P2端口 /******************************************************************************* * 函 数 名 : delay_10us * 函数功能 : 延时函数,ten_us=1时,大约延时10us * 输 入 : ten_us * 输 出 : 无 *******************************************************************************/ void delay_10us(u16 ten_us) { while(ten_us--); } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { u8 i=0; LED_PORT=~0x01; delay_10us(50000); while(1) { //方法1:使用移位+循环实现流水灯 // for(i=0;i<8;i++) // { // LED_PORT=~(0x01<<i); //将1右移i位,然后取反将结果赋值到LED_PORT // delay_10us(50000); // } //方法2:使用循环+_crol_或_cror_函数实现流水灯 for(i=0;i<7;i++) //将led左移一位 { LED_PORT=_crol_(LED_PORT,1); delay_10us(50000); } for(i=0;i<7;i++) //将led右移一位 { LED_PORT=_cror_(LED_PORT,1); delay_10us(50000); } } }画出对应的Proteus图像

/*********************************************************************************** Filename: light_switch.c Description: This application function either as a light or a switch toggling the ligh. The role of the application is chosen in the menu with the joystick at initialisation. Push S1 to enter the menu. Choose either switch or light and confirm choice with S1. Joystick Up: Sends data from switch to light ***********************************************************************************/ /*********************************************************************************** * INCLUDES */ #include <hal_lcd.h> #include <hal_led.h> #include <hal_joystick.h> #include <hal_assert.h> #include <hal_board.h> #include <hal_int.h> #include "hal_mcu.h" #include "hal_button.h" #include "hal_rf.h" #include "util_lcd.h" #include "basic_rf.h" /*********************************************************************************** * CONSTANTS */ // Application parameters #define RF_CHANNEL 25 // 2.4 GHz RF channel // BasicRF address definitions #define PAN_ID 0x2126 #define SWITCH_ADDR 0x2520 #define LIGHT_ADDR 0xBEEF #define APP_PAYLOAD_LENGTH 1 #define LIGHT_TOGGLE_CMD 0 // Application states #define IDLE 0 #define SEND_CMD 1 // Application role #define NONE 0 #define SWITCH 1 #define LIGHT 2 #define APP_MODES 2 /*********************************************************************************** * LOCAL VARIABLES */ static uint8 pTxData[APP_PAYLOAD_LENGTH]; static uint8 pRxData[APP_PAYLOAD_LENGTH]; static basicRfCfg_t basicRfConfig; // Mode menu static menuItem_t pMenuItems[] = { #ifdef ASSY_EXP4618_CC2420 // Using Softbaugh 7-seg display " L S ", SWITCH, " LIGHT ", LIGHT #else // SRF04EB and SRF05EB "Switch", SWITCH, "Light", LIGHT #endif }; static menu_t pMenu = { pMenuItems, N_ITEMS(pMenuItems) }; #ifdef SECURITY_CCM // Security key static uint8 key[]= { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, }; #endif /*********************************************************************************** * LOCAL FUNCTIONS */ static void appLight(); static void appSwitch(); static uint8 appSelectMode(void); /*********************************************************************************** * @fn appLight * * @brief Application code for light application. Puts MCU in endless * loop waiting for user input from joystick. * * @param basicRfConfig - file scope variable. Basic RF configuration data * pRxData - file scope variable. Pointer to buffer for RX data * * @return none */ static void appLight() { halLcdWriteLine(HAL_LCD_LINE_1, "Light"); halLcdWriteLine(HAL_LCD_LINE_2, "Ready"); #ifdef ASSY_EXP4618_CC2420 halLcdClearLine(1); halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1); #endif // Initialize BasicRF basicRfConfig.myAddr = LIGHT_ADDR; if(basicRfInit(&basicRfConfig)==FAILED) { HAL_ASSERT(FALSE); } basicRfReceiveOn(); // Main loop while (TRUE) { while(!basicRfPacketIsReady()); if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { if(pRxData[0] == LIGHT_TOGGLE_CMD) { halLedToggle(1); } } } } /*********************************************************************************** * @fn appSwitch * * @brief Application code for switch application. Puts MCU in * endless loop to wait for commands from from switch * * @param basicRfConfig - file scope variable. Basic RF configuration data * pTxData - file scope variable. Pointer to buffer for TX * payload * appState - file scope variable. Holds application state * * @return none */ static void appSwitch() { halLcdWriteLine(HAL_LCD_LINE_1, "Switch"); halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push"); halLcdWriteLine(HAL_LCD_LINE_3, "Send Command"); #ifdef ASSY_EXP4618_CC2420 halLcdClearLine(1); halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1); #endif pTxData[0] = LIGHT_TOGGLE_CMD; // Initialize BasicRF basicRfConfig.myAddr = SWITCH_ADDR; // 示例:扩展为流水灯效果 if(pRxData[0] == LIGHT_TOGGLE_CMD) { static uint8_t ledPattern = 0; ledPattern = (ledPattern + 1) % 4; // 假设使用4个LED // 根据模式控制多个LED switch(ledPattern) { case 0: halLedSet(1); halLedClear(2); halLedClear(3); halLedClear(4); break; case 1: halLedClear(1); halLedSet(2); halLedClear(3); halLedClear(4); break; case 2: halLedClear(1); halLedClear(2); halLedSet(3); halLedClear(4); break; case 3: halLedClear(1); halLedClear(2); halLedClear(3); halLedSet(4); break; } } if(basicRfInit(&basicRfConfig)==FAILED) { HAL_ASSERT(FALSE); } // Keep Receiver off when not needed to save power basicRfReceiveOff(); // Main loop while (TRUE) { //if( halJoystickPushed() ) { if(halButtonPushed()==HAL_BUTTON_1){ basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH); // Put MCU to sleep. It will wake up on joystick interrupt halIntOff(); halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global // interrupt enable halIntOn(); } } } /*********************************************************************************** * @fn main * * @brief This is the main entry of the "Light Switch" application. * After the application modes are chosen the switch can * send toggle commands to a light device. * * @param basicRfConfig - file scope variable. Basic RF configuration * data * appState - file scope variable. Holds application state * * @return none */ void main(void) { //uint8 appMode = NONE; uint8 appMode = LIGHT; // Config basicRF basicRfConfig.panId = PAN_ID; basicRfConfig.channel = RF_CHANNEL; basicRfConfig.ackRequest = TRUE; #ifdef SECURITY_CCM basicRfConfig.securityKey = key; #endif // Initalise board peripherals halBoardInit(); halJoystickInit(); // Initalise hal_rf if(halRfInit()==FAILED) { HAL_ASSERT(FALSE); } // Indicate that device is powered halLedSet(1); // Print Logo and splash screen on LCD //utilPrintLogo("Light Switch"); // Wait for user to press S1 to enter menu //while (halButtonPushed()!=HAL_BUTTON_1); halMcuWaitMs(350); halLcdClear(); // Set application role //appMode = appSelectMode(); halLcdClear(); // Transmitter application if(appMode == SWITCH) { // No return from here appSwitch(); } // Receiver application else if(appMode == LIGHT) { // No return from here appLight(); } // Role is undefined. This code should not be reached HAL_ASSERT(FALSE); } /**************************************************************************************** * @fn appSelectMode * * @brief Select application mode * * @param none * * @return uint8 - Application mode chosen */ static uint8 appSelectMode(void) { halLcdWriteLine(1, "Device Mode: "); return utilMenuSelect(&pMenu); } /**************************************************************************************** Copyright 2007 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. ***********************************************************************************/ 改为无线开关LED流水灯

下面是我的led代码,#include "led.h" /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LED_Init() { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 RCC_AHB1PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE); //使能端口时钟 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_Pin=LED1_PIN;//管脚设置 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉 GPIO_Init(LED1_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED1_PORT,LED1_PIN); GPIO_InitStructure.GPIO_Pin=LED2_PIN;//管脚设置 GPIO_Init(LED2_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED2_PORT,LED2_PIN); } 下面是我的主函数代码: /******************************************************************************* * * 普中科技 -------------------------------------------------------------------------------- * 实 验 名 : 定时器中断实验 * 实验说明 : * 连接方式 : * 注 意 : 定时器驱动程序在time.c内 *******************************************************************************/ #include "system.h" #include "SysTick.h" #include "led.h" //#include "time.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { u8 i=0; SysTick_Init(168); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); // TIM4_Init(5000-1,8400-1); //定时500ms while(1) { } } 请更改我的主函数代码 实现流水灯效果,要求每个灯间隔50毫秒

下面是我的led代码 #include "system.h" #include "SysTick.h" #include "led.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { LED_Init(); // 初始化LED SysTick_Init(168); // 初始化SysTick,假设系统时钟为168MHz while (1) { // 假设LED1和LED2是两个LED,分别控制 GPIO_ResetBits(LED1_PORT, LED1_PIN); // 点亮LED1 delay_ms(50); // 延时50ms GPIO_SetBits(LED1_PORT, LED1_PIN); // 熄灭LED1 GPIO_ResetBits(LED2_PORT, LED2_PIN); // 点亮LED2 delay_ms(50); // 延时50ms GPIO_SetBits(LED2_PORT, LED2_PIN); // 熄灭LED2 // 如果还有更多LED,可以继续添加 } } 下面是我的主函数代码 #include "system.h" #include "SysTick.h" #include "led.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { LED_Init(); // 初始化LED SysTick_Init(168); // 初始化SysTick,假设系统时钟为168MHz while (1) { // 假设LED1和LED2是两个LED,分别控制 GPIO_ResetBits(LED1_PORT, LED1_PIN); // 点亮LED1 delay_ms(50); // 延时50ms GPIO_SetBits(LED1_PORT, LED1_PIN); // 熄灭LED1 GPIO_ResetBits(LED2_PORT, LED2_PIN); // 点亮LED2 delay_ms(50); // 延时50ms GPIO_SetBits(LED2_PORT, LED2_PIN); // 熄灭LED2 // 如果还有更多LED,可以继续添加 } } 请通过改变RCC或者复位频率,该变流水灯闪烁频率

这是主函数 #include "system.h" #include "SysTick.h" #include "led.h" #include "core_cm4.h" // 定义LED闪烁周期(单位:毫秒) #define LED_INTERVAL 50 int main() { LED_Init(); // 初始化LED SysTick_Init(168); // 初始化SysTick,假设系统时钟为168MHz uint32_t last_time = 0; // 上次时间戳 // 定义LED状态 uint8_t led1_state = 0; // 0:灭,1:亮 uint8_t led2_state = 0; // 流水灯状态 uint8_t pattern = 0; // 0: LED1亮,LED2灭;1: LED2亮,LED1灭 while (1) { uint32_t current_time = SysGetTick(); // 获取当前时间(毫秒) // 控制LED状态 if (current_time - last_time >= LED_INTERVAL) { // 根据pattern切换LED状态 switch (pattern) { case 0: // 点亮LED1,熄灭LED2 GPIO_ResetBits(LED1_PORT, LED1_PIN); GPIO_SetBits(LED2_PORT, LED2_PIN); led1_state = 1; led2_state = 0; break; case 1: // 熄灭LED1,点亮LED2 GPIO_SetBits(LED1_PORT, LED1_PIN); GPIO_ResetBits(LED2_PORT, LED2_PIN); led1_state = 0; led2_state = 1; break; } // 更新流水灯状态 pattern = !pattern; last_time = current_time; // 更新时间戳 } } } 这是led代码 #include "led.h" /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LED_Init() { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 RCC_AHB1PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE); //使能端口时钟 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_Pin=LED1_PIN;//管脚设置 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉 GPIO_Init(LED1_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED1_PORT,LED1_PIN); GPIO_InitStructure.GPIO_Pin=LED2_PIN;//管脚设置 GPIO_Init(LED2_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED2_PORT,LED2_PIN); } 请修改主函数代码,让led成流水灯亮灭,50毫秒

以下是主函数代码 #include "system.h" #include "SysTick.h" #include "led.h" #include "core_cm4.h" // 定义LED闪烁周期(单位:毫秒) #define LED1_INTERVAL 500 #define LED2_INTERVAL 200 int main() { LED_Init(); // 初始化LED SysTick_Init(168); // 初始化SysTick,假设系统时钟为168MHz uint32_t led1_last_time = 0; uint32_t led2_last_time = 0; uint8_t led1_state = 0; // 0:灭,1:亮 uint8_t led2_state = 0; while (1) { uint32_t current_time = SysGetTick(); // 获取当前时间(毫秒) // 控制LED1 if (current_time - led1_last_time >= LED1_INTERVAL) { led1_state = !led1_state; if (led1_state) GPIO_ResetBits(LED1_PORT, LED1_PIN); // 点亮LED1 else GPIO_SetBits(LED1_PORT, LED1_PIN); // 熄灭LED1 led1_last_time = current_time; // 更新时间戳 } // 控制LED2 if (current_time - led2_last_time >= LED2_INTERVAL) { led2_state = !led2_state; if (led2_state) GPIO_ResetBits(LED2_PORT, LED2_PIN); // 点亮LED2 else GPIO_SetBits(LED2_PORT, LED2_PIN); // 熄灭LED2 led2_last_time = current_time; // 更新时间戳 } } } 以下是led代码 #include "led.h" /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LED_Init() { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 RCC_AHB1PeriphClockCmd(LED1_PORT_RCC|LED2_PORT_RCC,ENABLE); //使能端口时钟 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_Pin=LED1_PIN;//管脚设置 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉 GPIO_Init(LED1_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED1_PORT,LED1_PIN); GPIO_InitStructure.GPIO_Pin=LED2_PIN;//管脚设置 GPIO_Init(LED2_PORT,&GPIO_InitStructure); //初始化结构体 GPIO_SetBits(LED2_PORT,LED2_PIN); } 请修改主函数代码,让led灯成流水线,间隔50毫秒,发给我主函数

#include "system.h" #include "led.h" #include "key.h" void delay1(u32 ms)//延时函数 { while(--ms); } int main() { u8 i,j,k,l,p;//定义局部变量 // RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//2分频 4倍 //自定义时钟函数,即将时钟频率更改为XX MHZ 即8/2=4 4*4=16M led_init();//LED初始化 while(1) { //管脚操作LED // GPIO_ResetBits(LED_port,LED_Pin);//将引脚拉低 点亮LED // delay(5000000); // GPIO_SetBits(LED_port,LED_Pin);//将引脚拉高 熄灭 // delay(5000000); //位带操作LED for(i=0;i<5;i++)//每种状态循环8次 { led_1();//第一种状态 } for(j=0;j<5;j++) { led_2();//第二种状态 } for(k=0;k<5;k++) { led_3();//第三种状态 } for(k=0;l<5;l++) { led_4();//第4种状态 } for(p=0;p<5;p++) { led_5();//第5种状态 } } } #include "system.h" /******************************************************************************* * 函 数 名 : RCC_HSE_Config * 函数功能 : 自定义系统时钟,可以通过修改PLL时钟源和倍频系数实现时钟调整 * 输 入 : div:RCC_PLLSource_HSE_Div1/RCC_PLLSource_HSE_Div2 pllm:RCC_PLLMul_2-RCC_PLLMul_16 * 输 出 : 无 *******************************************************************************/ void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时钟(可以修改时钟) { RCC_DeInit(); //将外设RCC寄存器重设为缺省值 RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE) if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振 { RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK) RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1) RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2) RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数 RCC_PLLCmd(ENABLE); //使能或者失能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK) while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟 } } #include "led.h" #include "system.h" void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体 RCC_APB2PeriphClockCmd(LED_port_rcc,ENABLE);//LED时钟 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Pin=LED_Pin;//引脚 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度 GPIO_Init(LED_port,&GPIO_InitStructure);//初始化端口 GPIO_SetBits(LED_port,LED_Pin); //初始电平为高 } void delay(u32 ms)//延时函数 { while(--ms); } void led_1(void) //流水灯第一种状态 从左到右依次点亮 { LED1=0; delay(100000); LED1=1; LED2=0; delay(100000); LED2=1; LED3=0; delay(100000); LED3=1; LED4=0; delay(100000); LED4=1; LED5=0; delay(100000); LED5=1; LED6=0; delay(100000); LED6=1; LED7=0; delay(100000); LED7=1; LED8=0; delay(100000); LED8=1; } void led_2(void) //流水灯第2种状态 从右到左依次点亮 { LED8=0; delay(100000); LED8=1; LED7=0; delay(100000); LED7=1; LED6=0; delay(100000); LED6=1; LED5=0; delay(100000); LED5=1; LED4=0; delay(100000); LED4=1; LED3=0; delay(100000); LED3=1; LED2=0; delay(100000); LED2=1; LED1=0; delay(100000); LED1=1; } void led_3(void) //流水灯第3种状态 全部点亮后再倒回熄灭 { LED8=0; delay(100000); LED7=0; delay(100000); LED6=0; delay(100000); LED5=0; delay(100000); LED4=0; delay(100000); LED3=0; delay(100000); LED2=0; delay(100000); LED1=0; delay(100000); LED1=1; delay(100000); LED2=1; delay(100000); LED3=1; delay(100000); LED4=1; delay(100000); LED5=1; delay(100000); LED6=1; delay(100000); LED7=1; delay(100000); LED8=1; delay(100000); } void led_4(void) //流水灯第4种状态 由中间向两边点亮 再倒回来熄灭 { LED4=LED5=0; delay(100000); LED3=LED6=0; delay(100000); LED2=LED7=0; delay(100000); LED1=LED8=0; delay(100000); LED1=LED8=1; delay(100000); LED2=LED7=1; delay(100000); LED3=LED6=1; delay(100000); LED4=LED5=1; delay(100000); } void led_5(void) //流水灯第5种状态 由两边向中间点亮 再由中间向两边熄灭 { LED1=LED8=0; delay(100000); LED2=LED7=0; delay(100000); LED3=LED6=0; delay(100000); LED4=LED5=0; delay(100000); LED4=LED5=1; delay(100000); LED3=LED6=1; delay(100000); LED2=LED7=1; delay(100000); LED1=LED8=1; delay(100000); } 根据上述代码,输出其代码运行流程

大家在看

recommend-type

美敦力BIS监护仪串口通讯协议手册

Document Title: BIS, MONITORING SYSTEMS, SERIAL PORT TECHNICAL SPEC
recommend-type

Cisco Enterprise Print System-开源

一组使大量打印机的管理和支持变得更加容易的工具。
recommend-type

web仿淘宝项目

大一时团队做的一个仿淘宝的web项目,没有实现后台功能
recommend-type

只输入固定-vc实现windows多显示器编程的方法

P0.0 只输入固定 P0.1 P0CON.1 P0.2 P0CON.2 PORT_SET.PORT_REFEN P0.3 P0CON.3 自动“偷”从C2的交易应用程序在. PORT_SET.PORT_CLKEN PORT_SET.PORT_CLKOUT[0] P0.4 P0CON.4 C2调试的LED驱动器的时钟输入,如果作为 未启用. P0.5 PORT_CTRL.PORT_LED[1:0] 输出港口被迫为.阅读 实际LED驱动器的状态(开/关) 用户应阅读 RBIT_DATA.GPIO_LED_DRIVE 14只脚 不能用于在开发系统中,由于C2交易扰 乱输出. 参考区间的时钟频率 对抗 控制控制 评论评论 NVM的编程电压 VPP = 6.5 V 矩阵,和ROFF工业* PORT_CTRL 2 GPIO 1 矩阵,和ROFF工业* PORT_CTRL 3 参考 clk_ref GPIO 矩阵 4 C2DAT 产量 CLK_OUT GPIO 5 C2CLK LED驱动器 1 2 工业* PORT_CTRL 1 2 3 1 2 6 产量 CLK_OUT GPIO 1 2 1 1 1 PORT_SET.PORT_CLKEN PORT_SET.PORT_CLKOUT[1] P0.6 P0CON.6 P0.7 P0CON.7 P1.0 P1CON.0 P1.1 P1CON.1 7 8 9 GPIO GPIO GPIO 14只脚 14只脚 14只脚 *注:工业注:工业 代表“独立报”设置. “ 矩阵矩阵 and Roff 模式控制模拟垫电路. 116 修订版修订版1.0
recommend-type

小游戏源码-端午节龙舟大赛.rar

小游戏源码-端午节龙舟大赛.rar

最新推荐

recommend-type

数字集成电路实现流水灯设计

"数字集成电路实现流水灯设计" 本文主要介绍了数字集成电路实现流水灯设计的方法和原理。该设计采用数字集成电路的控制方法,结合十进制计数器/译码电路设计了该流水灯控制系统。 首先,设计了异步八进制加法或...
recommend-type

硬件课程设计流水灯实验报告.doc

【硬件课程设计流水灯实验报告】是一份详细记录了电子设计实验过程的文档,主要针对51单片机的硬件课程设计,特别是花样流水灯的实现。这份报告涵盖了实验要求、配置、焊接调试步骤以及编程思想等多个方面,旨在让...
recommend-type

2022年网站美工个人年度工作总结(1).doc

2022年网站美工个人年度工作总结(1).doc
recommend-type

获取本机IP地址的程序源码分析

从给定文件信息中我们可以提取出的关键知识点是“取本机IP”的实现方法以及与之相关的编程技术和源代码。在当今的信息技术领域中,获取本机IP地址是一项基本技能,广泛应用于网络通信类的软件开发中,下面将详细介绍这一知识点。 首先,获取本机IP地址通常需要依赖于编程语言和操作系统的API。不同的操作系统提供了不同的方法来获取IP地址。在Windows操作系统中,可以通过调用Windows API中的GetAdaptersInfo()或GetAdaptersAddresses()函数来获取网络适配器信息,进而得到IP地址。在类Unix操作系统中,可以通过读取/proc/net或是使用系统命令ifconfig、ip等来获取网络接口信息。 在程序设计过程中,获取本机IP地址的源程序通常会用到网络编程的知识,比如套接字编程(Socket Programming)。网络编程允许程序之间进行通信,套接字则是在网络通信过程中用于发送和接收数据的接口。在许多高级语言中,如Python、Java、C#等,都提供了内置的网络库和类来简化网络编程的工作。 在网络通信类中,IP地址是区分不同网络节点的重要标识,它是由IP协议规定的,用于在网络中唯一标识一个网络接口。IP地址可以是IPv4,也可以是较新的IPv6。IPv4地址由32位二进制数表示,通常分为四部分,每部分由8位构成,并以点分隔,如192.168.1.1。IPv6地址则由128位二进制数表示,其表示方法与IPv4有所不同,以冒号分隔的8组16进制数表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。 当编写源代码以获取本机IP地址时,通常涉及到以下几个步骤: 1. 选择合适的编程语言和相关库。 2. 根据目标操作系统的API或系统命令获取网络接口信息。 3. 分析网络接口信息,提取出IP地址。 4. 将提取的IP地址转换成适合程序内部使用的格式。 5. 在程序中提供相应功能,如显示IP地址或用于网络通信。 例如,在Python中,可以使用内置的socket库来获取本机IP地址。一个简单的示例代码如下: ```python import socket # 获取主机名 hostname = socket.gethostname() # 获取本机IP local_ip = socket.gethostbyname(hostname) print("本机IP地址是:", local_ip) ``` 在实际应用中,获取本机IP地址通常是为了实现网络通信功能,例如建立客户端与服务器的连接,或者是在开发涉及到IP地址的其他功能时使用。 关于文件名称“getIP”,这是一个自解释的文件名,明显表示该文件或程序的作用是获取本机的IP地址。从标签“控件 源码 网络通信类 资源”中我们可以看出,这个文件很可能是一个可以嵌入其他软件中的代码片段,用以实现网络通信功能的一部分,具有较高的灵活性和重用性。 综上所述,获取本机IP地址是一个涉及到操作系统API、网络编程以及特定编程语言知识的技能。它不仅需要对编程语言提供的库函数有深入的理解,还要对操作系统的网络配置和IP协议有足够的认识。通过阅读和分析相关的源代码,如“getIP”,可以加深对网络编程实现细节的理解,并能够在实际开发中快速地应用这一技术。
recommend-type

【权威指南】:Win11笔记本上RTX4080驱动的安装与调试秘籍

# 1. Win11笔记本与RTX4080显卡介绍 随着技术的不断发展,笔记本电脑已不再是仅仅满足办公需求的移动设备,而是逐渐成为可以胜任复杂图形处理和游戏任务的强大工具。微软推出的Windows 11操作系统,以其全新的用户界面和改进的系统性能,为用户提供了更为流畅的操作体验。而在硬件方面,NVIDIA的RTX 4080显卡以其卓越的图形处理能力和AI支持,为笔记本电脑带来了前所未有的性能提升。本章节将带您初步了解Windows 11笔记本与NVIDIA RTX 4080显卡的基础信息,为进一步深入探讨它们的优化和调试技巧奠定基础。 ## 1.1 Win11笔记本的优势 Windows
recommend-type

windows环境举例

<think>好的,用户现在想在Windows环境下创建C函数库,需要具体的方法和示例代码。我需要结合之前的回答和用户提供的引用内容来给出合适的指导。 首先回顾之前的回答,用户已经了解了在Linux下创建静态库和动态库的方法,现在需要切换到Windows环境。根据引用[2],Windows下的C标准库和动态链接库的处理与Linux不同,比如使用dlfcn.h在Linux,而Windows可能需要其他方式。另外,引用[1]提到了在Windows下配置gcc环境(MinGW-w64),这可能是一个关键点,因为用户可能需要使用MinGW来编译库。 用户提供的引用[3]提到了使用MSVC编译器,这
recommend-type

QQ自动发送/回复系统源代码开放

根据提供的文件信息,我们可以了解到以下几点关键的知识点: ### 标题:“qqhelp” 1. **项目类型**: 标题“qqhelp”暗示这是一个与QQ相关的帮助工具或项目。QQ是中国流行的即时通讯软件,因此这个标题表明项目可能提供了对QQ客户端功能的辅助或扩展。 2. **用途**: “help”表明此项目的主要目的是提供帮助或解决问题。由于它提到了QQ,并且涉及“autosend/reply”功能,我们可以推测该项目可能用于自动化发送消息回复,或提供某种形式的自动回复机制。 ### 描述:“I put it to my web, but nobody sendmessage to got the source, now I public it. it supply qq,ticq autosend/reply ,full sourcecode use it as you like” 1. **发布情况**: 描述提到该项目原先被放置在某人的网站上,并且没有收到请求源代码的消息。这可能意味着项目不够知名或者需求不高。现在作者决定公开发布,这可能是因为希望项目能够被更多人了解和使用,或是出于开源共享的精神。 2. **功能特性**: 提到的“autosend/reply”表明该项目能够实现自动发送和回复消息。这种功能对于需要进行批量或定时消息沟通的应用场景非常有用,例如客户服务、自动化的营销通知等。 3. **代码可用性**: 作者指出提供了“full sourcecode”,意味着源代码完全开放,用户可以自由使用,无论是查看、学习还是修改,用户都有很大的灵活性。这对于希望学习编程或者有特定需求的开发者来说是一个很大的优势。 ### 标签:“综合系统类” 1. **项目分类**: 标签“综合系统类”表明这个项目可能是一个多功能的集成系统,它可能不仅限于QQ相关的功能,还可能包含了其他类型的综合服务或特性。 2. **技术范畴**: 这个标签可能表明该项目的技术实现比较全面,可能涉及到了多个技术栈或者系统集成的知识点,例如消息处理、网络编程、自动化处理等。 ### 压缩包子文件的文件名称列表: 1. **Unit1.dfm**: 这是一个Delphi或Object Pascal语言的窗体定义文件,用于定义应用程序中的用户界面布局。DFM文件通常用于存储组件的属性和位置信息,使得开发者可以快速地进行用户界面的设计和调整。 2. **qqhelp.dpr**: DPR是Delphi项目文件的扩展名,包含了Delphi项目的核心设置,如程序入口、使用的单元(Units)等。这个文件是编译和构建Delphi项目的起点,它能够帮助开发者了解项目的组织结构和编译指令。 3. **Unit1.pas**: PAS是Delphi或Object Pascal语言的源代码文件。这个文件可能包含了与QQ帮助工具相关的核心逻辑代码,例如处理自动发送和回复消息的算法等。 4. **readme.txt**: 这是一个常见的文本文件,包含项目的基本说明和使用指导,帮助用户了解如何获取、安装、运行和定制该项目。README文件通常是用户与项目首次交互时首先阅读的文件,因此它对于一个开源项目的用户友好度有着重要影响。 通过以上分析,我们可以看出“qqhelp”项目是一个针对QQ通讯工具的自动化消息发送与回复的辅助工具。项目包含完整的源代码,用户可以根据自己的需要进行查看、修改和使用。它可能包含Delphi语言编写的窗体界面和后端逻辑代码,具有一定的综合系统特性。项目作者出于某种原因将其开源,希望能够得到更广泛的使用和反馈。
recommend-type

【7步打造Win11深度学习利器】:Tensorflow-GPU与RTX4080终极优化指南

# 1. 深度学习与Windows 11的融合 在人工智能时代,深度学习已渗透到生活的方方面面,而Windows 11作为最新一代的操作系统,为深度学习提供了一个高效的工作平台。本章节将探讨深度学习技术如何与Windows 11系统融合,以及这一
recommend-type

ue画笔画画蓝图版

<think>我们正在讨论的是在UnrealEngine中使用蓝图实现画笔绘画功能。根据用户需求,重点在于通过蓝图系统实现类似毛笔的绘画效果。结合之前的回答和引用内容,我们将详细展开实现方法。核心思路:通过捕捉输入轨迹,动态生成笔触网格,并应用材质模拟墨迹效果。###详细实现步骤####1.创建绘画蓝图创建一个名为`BP_PaintBrush`的Actor蓝图:-**根组件**:SceneComponent-**关键组件**:-`SplineComponent`:用于存储绘画路径点-`InstancedStaticMeshComponent`:高效渲染重复笔触段(替代单个SplineMesh组
recommend-type

VB.NET图表曲线组件实现多种图表绘制

在深入讨论所给文件信息中的知识点之前,我们首先需要明确这些信息所代表的内容。标题指出我们所讨论的是一款在VB.NET环境中使用的“三维图表曲线组件”。从描述中我们可以了解到该组件的功能特性,即它能够绘制包括柱状图、线条曲线图和饼图在内的多种类型图表,并且支持图例的展示。此外,组件的色彩使用比较鲜艳,它不仅适用于标准的Windows Forms应用程序,还能够在ASP.NET环境中使用。而“压缩包子文件的文件名称列表”提供的信息则指向了可能包含该组件示例代码或说明文档的文件名,例如“PSC_ReadMe_4556_10.txt”可能是一个说明文档,而“GraphingV3Testing”和“Graphing.V3”则可能是一些测试文件或组件的实际使用案例。 下面详细说明标题和描述中提到的知识点: 1. VB.NET环境中的图表组件开发: 在VB.NET中开发图表组件需要开发者掌握.NET框架的相关知识,包括但不限于Windows Forms应用程序的开发。VB.NET作为.NET框架的一种语言实现,它继承了.NET框架的面向对象特性和丰富的类库支持。图表组件作为.NET类库的一部分,开发者可以通过继承相关类、使用系统提供的绘图接口来设计和实现图形用户界面(GUI)中用于显示图表的部分。 2. 图表的类型和用途: - 柱状图:主要用于比较各类别数据的数量大小,通过不同长度的柱子来直观显示数据间的差异。 - 线条曲线图:适用于展示数据随时间或顺序变化的趋势,比如股票价格走势、温度变化等。 - 饼图:常用于展示各部分占整体的比例关系,可以帮助用户直观地了解数据的组成结构。 3. 图例的使用和意义: 图例在图表中用来说明不同颜色或样式所代表的数据类别或系列。它们帮助用户更好地理解图表中的信息,是可视化界面中重要的辅助元素。 4. ASP.NET中的图表应用: ASP.NET是微软推出的一种用于构建动态网页的框架,它基于.NET平台运行。在ASP.NET中使用图表组件意味着可以创建动态的图表,这些图表可以根据Web应用程序中实时的数据变化进行更新。比如,一个电子商务网站可能会利用图表组件来动态显示产品销售排行或用户访问统计信息。 5. 色彩运用: 在设计图表组件时,色彩的运用非常关键。色彩鲜艳不仅能够吸引用户注意,还能够帮助用户区分不同的数据系列。正确的色彩搭配还可以提高信息的可读性和美观性。 在技术实现层面,开发者可能需要了解如何在VB.NET中使用GDI+(Graphics Device Interface)进行图形绘制,掌握基本的绘图技术(如画线、填充、颜色混合等),并且熟悉.NET提供的控件(如Panel, Control等)来承载和显示这些图表。 由于提供的文件名列表中包含有"Testing"和".txt"等元素,我们可以推测该压缩包内可能还包含了与图表组件相关的示例程序和使用说明,这对于学习如何使用该组件将十分有用。例如,“GraphingV3Testing”可能是一个测试项目,用于在真实的应用场景中检验该图表组件的功能和性能;“PSC_ReadMe_4556_10.txt”可能是一个详细的用户手册或安装说明,帮助用户了解如何安装、配置和使用该组件。 总结而言,了解并掌握在VB.NET环境下开发和使用三维图表曲线组件的知识点,对从事.NET开发的程序员来说,不仅可以增强他们在数据可视化方面的技能,还可以提高他们构建复杂界面和动态交互式应用的能力。