/** ****************************************************************************** * @file USART/HyperTerminal_HwFlowControl/main.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main program body ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2> ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "led.h" #include "key.h" #include "usart.h" #include "delay.h" #include "stdio.h" #include "string.h" void Delay(unsigned i) { while(i--); } unsigned char seg7table[16] = { /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, }; static uint8_t seg; /******************************************************************************* * @brief * @param None * @retval None *******************************************************************************/ void tled_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); //控制所有LED1-8点亮 GPIO_ResetBits(GPIOE, GPIO_Pin_4); GPIO_Write(GPIOF, 0xFF); GPIO_SetBits(GPIOE, GPIO_Pin_4); //控制所有LED9-12点亮 GPIO_ResetBits(GPIOE, GPIO_Pin_3); GPIO_Write(GPIOF, 0xFF); GPIO_SetBits(GPIOE, GPIO_Pin_3); delay_ms(1200); //控制所有LED1-8熄灭 GPIO_ResetBits(GPIOE, GPIO_Pin_4); GPIO_Write(GPIOF, 0x00); GPIO_SetBits(GPIOE, GPIO_Pin_4); //控制所有LED9-12熄灭 GPIO_ResetBits(GPIOE, GPIO_Pin_3); GPIO_Write(GPIOF, 0x00); GPIO_SetBits(GPIOE, GPIO_Pin_3); delay_ms(50); } /******************************************************************************* * @brief * @param * @retval ********************************************************************************/ void tled_setValue(uint8_t value) { uint8_t t1=0,t2=0; switch(value) { case 0: //全灭 t1 = 0x00; t2 = 0x00; break; case 1: //左右绿灯 t1|=((1<<0)|(1<<5)|(1<<6)); t2|=(1<<7); break; case 2: //上下绿灯 t1|=((1<<2)|(1<<3)); t2|=((1<<4)|(1<<5)); break; case 3: //全黄灯 t1|=((1<<1)|(1<<4)|(1<<7)); t2|=(1<<6); break; case 4: //全亮 t1=0xff; t2=0xff; break; case 5: t1|=((1<<0)|(1<<6)|(1<<4)); t2|=(1<<6); break; case 6: t1|=((1<<1)|(1<<3)|(1<<7)); t2|=((1<<2)|(1<<5)); break; default: break; } //控制所有LED1-8 GPIO_ResetBits(GPIOE, GPIO_Pin_4); GPIO_Write(GPIOF, t1); GPIO_SetBits(GPIOE, GPIO_Pin_4); //控制所有LED9-12 GPIO_ResetBits(GPIOE, GPIO_Pin_3); GPIO_Write(GPIOF, t2); GPIO_SetBits(GPIOE, GPIO_Pin_3); } void seg_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_ResetBits(GPIOE, GPIO_Pin_6); GPIO_Write(GPIOF, 0x00); GPIO_SetBits(GPIOE, GPIO_Pin_6); delay_ms(50); GPIO_ResetBits(GPIOC, GPIO_Pin_13); GPIO_Write(GPIOF, 0xFF); GPIO_SetBits(GPIOC, GPIO_Pin_13); delay_ms(1000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); GPIO_Write(GPIOF, 0x00); GPIO_SetBits(GPIOC, GPIO_Pin_13); delay_ms(50); } void seg_setValue(uint8_t value) { seg = value; if(seg<0x10) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); GPIO_Write(GPIOF, seg7table[seg]); GPIO_SetBits(GPIOC, GPIO_Pin_13); } } void time_display(uint8_t value) { uint8_t data, data_H,data_L; data=value; data_H=(int)data/ 10; data_L=data%10; GPIO_ResetBits(GPIOE, GPIO_Pin_6); GPIO_Write(GPIOF, 0x7F); GPIO_SetBits(GPIOE, GPIO_Pin_6); delay_ms(10); seg_setValue(data_H); GPIO_ResetBits(GPIOE, GPIO_Pin_6); GPIO_Write(GPIOF, 0xBF); GPIO_SetBits(GPIOE, GPIO_Pin_6); delay_ms(10); seg_setValue(data_L); } void North_South_Passage(void) { int i,j; tled_setValue(1); for(i=12;i>=0;i--) { for(j=50;j>=0;j--) { time_display(i); } } } void East_West_Passage(void) { int i,j; tled_setValue(2); for(i=9;i>=0;i--) { for(j=50;j>=0;j--) { time_display(i); } } } void Yellow_Light_Warning(void) { int i,j; tled_setValue(3); for(i=3;i>=0;i--) { for(j=50;j>=0;j--) { time_display(i); } } } /******************************************************************************* * @brief 主函数 * @param None * @retval None *******************************************************************************/ int main(void) { /* 文本内容数组 */ uint8_t temp = 0; uint8_t data = 0; /* 设置系统时钟*/ Delay_Init(); /* 板载按键初始化*/ KEY_Init(); /* 配置调试串口 */ USART1_Init(); /* 配置执行器IO功能 */ tled_init(); seg_init(); /* 根据用户按键进行控制 */ while (1) { North_South_Passage(); Yellow_Light_Warning(); East_West_Passage(); Yellow_Light_Warning(); } //控制显示 tled_setValue(data); delay_ms(50); } #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 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) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 此代码实现的STM32的功能有哪些
时间: 2025-05-28 12:44:53 浏览: 22
这段代码实现了一个基于STM32的交通灯控制系统,主要功能包括:
1. **LED初始化和控制**:
- `tled_init()` 函数初始化了GPIO端口,并设置了用于控制LED的引脚。
- `tled_setValue()` 函数根据传入的参数设置不同的LED显示模式,例如全灭、左右绿灯、上下绿灯、全黄灯、全亮等。
2. **数码管初始化和控制**:
- `seg_init()` 函数初始化了数码管相关的GPIO端口。
- `seg_setValue()` 函数设置数码管显示特定的数值。
- `time_display()` 函数将输入的时间值拆分为高位和低位,并依次在数码管上显示。
3. **交通灯逻辑控制**:
- `North_South_Passage()` 和 `East_West_Passage()` 函数分别控制南北方向和东西方向的通行时间倒计时。
- `Yellow_Light_Warning()` 函数控制黄灯警告时间。
4. **主函数逻辑**:
- 在`main()`函数中,程序进入一个无限循环,依次调用上述三个交通灯控制函数,模拟交通灯的运行逻辑:南北方向通行 -> 黄灯警告 -> 东西方向通行 -> 黄灯警告。
### 代码解释
以下是代码的主要部分解释:
#### 1. LED初始化
```c
void tled_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE);
// 初始化GPIOF端口用于控制LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
// 初始化GPIOE端口用于选择LED组
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// 控制所有LED点亮和熄灭
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
GPIO_Write(GPIOF, 0xFF);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
GPIO_ResetBits(GPIOE, GPIO_Pin_3);
GPIO_Write(GPIOF, 0xFF);
GPIO_SetBits(GPIOE, GPIO_Pin_3);
}
```
- 初始化GPIO端口,配置为推挽输出模式。
- 通过`GPIO_Write()`函数设置LED的状态(点亮或熄灭)。
#### 2. 数码管显示
```c
void seg_setValue(uint8_t value)
{
seg = value;
if(seg < 0x10)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
GPIO_Write(GPIOF, seg7table[seg]);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
}
```
- 根据传入的数值`value`,从`seg7table`数组中查找对应的数码管显示值,并写入到GPIOF端口。
#### 3. 交通灯逻辑
```c
void North_South_Passage(void)
{
int i, j;
tled_setValue(1); // 设置南北方向绿灯
for(i = 12; i >= 0; i--) // 倒计时12秒
{
for(j = 50; j >= 0; j--) // 每秒延时50次
{
time_display(i); // 显示当前倒计时
}
}
}
```
- 控制南北方向的绿灯,并在数码管上显示倒计时。
#### 4. 主函数
```c
int main(void)
{
Delay_Init();
KEY_Init();
USART1_Init();
tled_init();
seg_init();
while (1)
{
North_South_Passage(); // 南北方向通行
Yellow_Light_Warning(); // 黄灯警告
East_West_Passage(); // 东西方向通行
Yellow_Light_Warning(); // 黄灯警告
}
}
```
- 初始化系统时钟、按键、串口、LED和数码管。
- 进入无限循环,依次调用交通灯控制函数。
---
###
阅读全文