STM32—交通灯(人行道)

该博客介绍了基于STM32F103R8C8芯片的红绿灯控制系统,实现了行人过马路时的黄灯闪烁、红绿灯切换及15秒倒计时显示。程序使用HAL库编写,并提供了Proteus仿真实现。数码管通过动态显示技术更新倒计时,按键采用中断触发。
摘要由CSDN通过智能技术生成

 数码管的使用看这里→STM32-4位数码管动态显示0~9999

源码和仿真下载icon-default.png?t=M4ADhttps://download.csdn.net/download/jzkj201/85445794

目录

 代码

按键

相关灯的亮灭 

数码管显示倒计时 

1.现象说明当有行人过马路的时候,按下按钮,黄灯闪烁5次,人行道变绿灯,车行道变红灯,并进行15S倒计时

2.使用的STM32F103R8C8芯片,可以参考资源内部的配置文件,来进行配置其他STM32的芯片 3.可扩展为十字路口的红绿灯

这里的程序用的HAL库编写

仿真图
Proteus仿真

 代码

按键

用中断来触发按键

//这里的按键用的中断来触发的
int key=0;//中断标记
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断处理函数
{
		key=1;
}

延迟函数的目的是为了帮助数码管实现快刷,可以利用定时器来完成。

void delay(int time)//延时函数
{
uint16_t k,l;
  for(k=0;k<time;k++)
	 {
     	for(l=0;l<=k;l++)
			{;;;;;}
	 }

}

相关灯的亮灭  

这里是通过给对应端口写高低电平实现的亮灭,可以使用位操作来简化代码 

位操作:

        基本位操作运算符:与运算:&;或运算:|;取反: ~;异或: ^;左移: <<;右移: >> 


//人行道
void Sidewalk_Red(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,0);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
}
void Sidewalk_Yellow(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,1);
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
}
void Sidewalk_Green(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
}
//车行道
void Road_Red(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,1);
}
void Road_Yellow(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,1);
}
void Road_Green(){
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,0);
}

数码管显示倒计时 

//数码管显示
void display(uint8_t num1){
uint8_t SEC_tab_cc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示
	uint8_t WEI_tab[]={0x0e,0x0d,0x0b,0x07};//数码管选段
	uint8_t Number_for_show;
	uint8_t shi,ge;
  while (1)
  {
		shi=num1/10;
		ge=num1%10;
		uint8_t Disp_tab[]={0xff,0xff,shi,ge};
			for(int i=0;i<50;i++){//显示时间
	for(uint8_t i=0;i<4;i++)
		{
			Number_for_show=Disp_tab[i];
			GPIOA->ODR=(GPIOA->ODR&0xffffff00)|SEC_tab_cc[Number_for_show]|WEI_tab[i]<<8;
			GPIOA->ODR=(GPIOA->ODR&0xfffff0ff)|WEI_tab[i]<<8;
		  delay(100);//快刷,消影
				}
			}
   	 break;
    }
}

主函数

	int j;
		if (key==1){
			HAL_Delay(3000);
				for(j=5;j>0;j--){
				Sidewalk_Yellow();
                Road_Yellow();
				GPIOA->ODR=0x00;//关闭数码管
				HAL_Delay(1000);
			}
				Sidewalk_Green();
				Road_Red();
			for(j=15;j>=0;j--){
				display(j);
				}
		for(j=5;j>0;j--){
				Sidewalk_Yellow();
				Road_yellow();
				GPIOA->ODR=0x00;//关闭数码管
				HAL_Delay(1000);
			}
			key=0;
		}
		else
			{
			GPIOA->ODR=0x00;
			Road_green();
			Sidewalk_Red();
		}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值