STM32初学(笔记二)紧急按键交通灯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

        设计的交通灯控制系统选用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;
	/*
	pc2 红灯1
	pc4 绿灯1
	pc3 黄灯1
	pc7 绿灯2
	pc8 黄灯2
	pc9 红灯2
	
	*/
	
	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 */
	
	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

  • 1
    点赞
  • 19
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

嵌小鑫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值