文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- 一、硬件设计
- 1.原理图
- 2.pcb板
- 3.实现视屏
- 二、软件设计
- 1.main.h
- 2.led
- 2.1led.c
- 2.2led.h
- 3.key按键
- 3.1key.c
- 3.2key.h
- 总结
前言
设计的交通灯控制系统选用stm32f103vet6单片机作为主控制器, 通过单片机最小系统模块,按键模块, 交通灯显示模块,数码管模块等四个模块组合的实现系统功能。 能够实现传统传统模式,还可以在紧急情况下开启紧急模式。 传统模式方案:红灯灯49s,绿灯39s,黄灯10s 南北相位紧急情况:黄灯10s, 在初学stm32中对: GPIO_ReadInputDataBit(), GPIO_ResetBits(), GPIO_SetBits(),GPIO_Write()的练习。若有错误请大佬批评指正。一、硬件设计 1.原理图 2.pcb板 3.实现视屏
lv_0_20220424151611
二、软件设计 1.main.h代码如下(示例):
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "seg.h"
#include "key.h"
void tens();
void key3();
void key2();
//定义数码管数组
u8 smgduan[10]={ 0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
u8 smgduan2[10]={ 0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
u8 ten[5]={0x66,0x4f,0x5b,0x06,0x3f};
int main()
{
SysTick_Init(72);
LED_Init();
SEG_INIT();
KEY_Init();
while(1)
{
tens();//调用tens()函数;
}
}
void tens()
{
u32 i,j,a,k,y=1,key;
for(i=0;i<5;i++)//常规交通电路操作
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)
{
if(y==5)
{
y=4;
}
if(i==4)
{
LED_Init();
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
}else
{
LED_Init();
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
}
key=KEY_Scan(0);
if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_0)==1)
{
LED_Init();
SEG_INIT();
KEY_Init();
key2();
}
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)
GPIO_Write(GPIOD,(u16)
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOA,(u16)(~ten[i]));
GPIO_Write(GPIOD,(u16)(~ten[y]));
delay_us(500);
}
}
y++;
}
LED_Init();
i=0,j=0,a=0,k=0,y=1;
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)
{
key=KEY_Scan(0); //按键扫描
if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_0)==1)//判断按键信号输入
{
LED_Init();
SEG_INIT();
KEY_Init();
key3();
}
if(y==5)
{
y=4;
}
if(i==4)
{
LED_Init();
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
}else
{
LED_Init();
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
}
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[i]));
GPIO_Write(GPIOA,(u16)(~ten[y]));
delay_us(500);
}
}
y++;
}
LED_Init();
}
void key3()//Äϱ±Ïàλ
{
u32 i,j,a,k,l,y=2;
LED_Init();
SEG_INIT();
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)//反复显示1s
{
if(i==0){
y=4;
GPIO_ResetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_8);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[y]));
GPIO_Write(GPIOA,(u16)(~ten[y]));
delay_us(500);
}
else{
GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_8);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[i]));
GPIO_Write(GPIOA,(u16)(~ten[i]));
delay_us(500);
}
}
}
y++;
}
LED_Init();
SEG_INIT();
for(i=4;i<5;i++)
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[i]));
GPIO_Write(GPIOA,(u16)(~ten[i]));
delay_us(500);
}
}
}
LED_Init();
SEG_INIT();
}
void key2()//Äϱ±Ïàλ
{
u32 i,j,a,k,l,y=2;
LED_Init();
SEG_INIT();
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)
{
if(i==0){
y=4;
GPIO_ResetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_8);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[y]));
GPIO_Write(GPIOA,(u16)(~ten[y]));
delay_us(500);
}
else{
GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_8);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[i]));
GPIO_Write(GPIOA,(u16)(~ten[i]));
delay_us(500);
}
}
}
y++;
}
LED_Init();
SEG_INIT();
for(i=4;i<5;i++)
{
for(j=0;j<10;j++)
{
for(a=0;a<=1000;a++)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_Write(GPIOA,(u16)(~smgduan[j]));
GPIO_Write(GPIOD,(u16)(~smgduan[j]));
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_5);
GPIO_Write(GPIOD,(u16)(~ten[i]));
GPIO_Write(GPIOA,(u16)(~ten[i]));
delay_us(500);
}
}
}
LED_Init();
SEG_INIT();
}
2.led
2.1led.c
代码如下(示例):
#include "led.h"
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //选择你要设置IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED_PORT,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(LED_PORT,GPIO_Pin_All); //将LED端口拉高,熄灭所有LED
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED_PIN; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOD,LED_PIN); //IO端口拉高,熄灭所有LED
}
2.2led.h
代码如下(示例):
#ifndef _led_H #define _led_H #include "system.h" #define LED_PORT GPIOC #define LED_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) #define LED_PORT_RCC RCC_APB2Periph_GPIOC #define led1 PCout(0) #define led2 PCout(1) #define led3 PCout(2) void LED_Init(void); #endif
3.key按键 3.1key.c
代码如下(示例):
#include "key.h"
#include "SysTick.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(KEY_Port,&GPIO_InitStructure);
}
u8 KEY_Scan(u8 mode)
{
static u8 key=1;
if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0)) //任意一个按键按下
{
delay_ms(10); //消抖
key=0;
if(K_UP==1)
{
return KEY_UP;
}
else if(K_DOWN==0)
{
return KEY_DOWN;
}
else if(K_LEFT==0)
{
return KEY_LEFT;
}
else
{
return KEY_RIGHT;
}
}
else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1) //连续按下
{
key=1;
}
if(mode==1) //Á¬Ðø°´¼ü°´ÏÂ
{
key=1;
}
return 0;
}
3.2key.h
代码如下(示例):
#ifndef _key_H #define _key_H #include "system.h" #define KEY_LEFT_Pin GPIO_Pin_2 #define KEY_DOWN_Pin GPIO_Pin_3 #define KEY_RIGHT_Pin GPIO_Pin_4 #define KEY_UP_Pin GPIO_Pin_0|GPIO_Pin_1 #define KEY_Port (GPIOE) #define KEY_UP_Port (GPIOF) #define K_UP PFin(0) #define K_DOWN PFin(1) #define K_LEFT PEin(2) #define K_RIGHT PEin(4) //#define K_UP GPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin) //#define K_DOWN GPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin) //#define K_LEFT GPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin) //#define K_RIGHT GPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin) #define KEY_UP 1 #define KEY_DOWN 2 #define KEY_LEFT 3 #define KEY_RIGHT 4 void KEY_Init(void); u8 KEY_Scan(u8 mode); #endif
该处使用的url网络请求的数据。
总结在练习智能交通灯灯控制系统对传统的交通增加一些细微改进,在训练中对函数的循环,数组的使用。其中对
(1)GPIO_ReadInputDataBit()//下拉输入
函数 GPIO_ReadInputDataBit 读的是 GPIOx_IDR;读的是当 IO 口设置为输入状态时候的 IO 口电平状态值
(2)GPIO_Write()
可以一次性给多个IO口赋值(注意:是16位的!)
源代码:
[百度网盘](https://pan.baidu.com/s/1q-kHoQAYIfC_XpJhENJiLA)
提取码:4321



