STM32实现交通灯(原理图+运行代码)

课程设计用STM32写的小项目,十分有趣,需要的小伙伴请点赞拿走

原理图

程序代码:

#include "stm32f10x.h"

void GPIO_Config(void);


void delay(u32 d){
	u32 i=0;
	u32 n=0;
  for(i=0;i<d;i++)
     for(n=0;n<800;n++);

}


u8 key_scan(){
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)==0){
	  return 1;
  }
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10)==0){
	  return 2;
  }
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11)==0){
	  return 3;
  }	
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12)==0){
	  return 4;
  }	
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)==0){
	  return 5;
  }	
  return 0;
}





void nixietube_show_all(){
  
	 GPIO_ResetBits(GPIOA, GPIO_Pin_9);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
	
	 GPIO_SetBits(GPIOA, GPIO_Pin_0);
	 GPIO_SetBits(GPIOA, GPIO_Pin_1);
	 GPIO_SetBits(GPIOA, GPIO_Pin_2);
	 GPIO_SetBits(GPIOA, GPIO_Pin_3);
	 GPIO_SetBits(GPIOA, GPIO_Pin_4);
	 GPIO_SetBits(GPIOA, GPIO_Pin_5);
	 GPIO_SetBits(GPIOA, GPIO_Pin_6);
	 GPIO_SetBits(GPIOA, GPIO_Pin_7);
}

u8 xtube[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void tube_show_one(u8 ti){

	 
	 //a
     if((ti&0x01)==0x01) GPIO_SetBits(GPIOA, GPIO_Pin_0);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	 //b
     if((ti&0x02)==0x02) GPIO_SetBits(GPIOA, GPIO_Pin_1);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	 //c
     if((ti&0x04)==0x04) GPIO_SetBits(GPIOA, GPIO_Pin_2);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	 //d
	 if((ti&0x08)==0x08) GPIO_SetBits(GPIOA, GPIO_Pin_3);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_3);
	 //e
     if((ti&0x10)==0x10) GPIO_SetBits(GPIOA, GPIO_Pin_4);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	 //f
     if((ti&0x20)==0x20) GPIO_SetBits(GPIOA, GPIO_Pin_5);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	  //g
     if((ti&0x40)==0x40) GPIO_SetBits(GPIOA, GPIO_Pin_6);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	 //dp
     if((ti&0x80)==0x80) GPIO_SetBits(GPIOA, GPIO_Pin_7);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	 
}



void nixietube_show(u8 num1,u8 num2){

	 
   u8 s1=num1/10;//
	 u8 g1=num1%10;//
   u8 s2=num2/10;//
	 u8 g2=num2%10;//
	 
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	

     tube_show_one(xtube[s1]);
	
	 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 
	 delay(10);
	 
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	
	 tube_show_one(xtube[g1]);
	
	 GPIO_ResetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	
	 delay(10);
	 
	 
	 
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	

	 tube_show_one(xtube[s2]);

	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	

	 delay(10);

	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	

	 tube_show_one(xtube[g2]);

	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_11);	

	 delay(10);

}





void my_led1_c(u8 c){
	
	u8 s[3]={1,1,1};
	
	s[c-1]=0;

	GPIO_WriteBit(GPIOC, GPIO_Pin_0,s[0]);
	GPIO_WriteBit(GPIOC, GPIO_Pin_1,s[1]);
	GPIO_WriteBit(GPIOC, GPIO_Pin_2,s[2]);

		
}
	

void my_led2_c(u8 c){
	
	u8 s[3]={1,1,1};
	
	s[c-1]=0;

	GPIO_WriteBit(GPIOC, GPIO_Pin_3,s[0]);
	GPIO_WriteBit(GPIOC, GPIO_Pin_4,s[1]);
	GPIO_WriteBit(GPIOC, GPIO_Pin_5,s[2]);

		
}	
	

u8 people_num=0;
u32 delay_num=0;

u8 v1=0;//
u8 v2=0;//
u8 all_time=0;

u8 keyv=0;
u8 keyv_last=0;
int main(void)
{	

	u8 flag=0;
	GPIO_Config();
	GPIO_WriteBit(GPIOC, GPIO_Pin_0,1);
	while(1)
	{
			if(delay_num<60) {delay_num++; }
			else{
				delay_num=0;
			  if(all_time<40-1) all_time++;
			  else all_time=0;
				
				if(v1>0) v1--;
				if(v2>0) v2--;
			}
			


			if(all_time==0){
			    v1=22;
				  v2=25;
				  my_led1_c(1);
				  my_led2_c(2);
			}
			else if(all_time==22){
          v1=3;
				  my_led1_c(3);
				  my_led2_c(2);				
			}
			else if(all_time==25){
          v1=15;
				  v2=12;
				  my_led1_c(2);
				  my_led2_c(1);				
			}				
			else if(all_time==37){
				  v2=3;
				  my_led1_c(2);
				  my_led2_c(3);					
			}					
				
			

	
			
	
		 nixietube_show(v1,v2);
		
		
//			

//			
//			if(all_time<40) all_time++;
//			else all_time=0;
	
   } 
}
void GPIO_Config( )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);


	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	

}

  • 21
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32步进电机H桥驱动控制原理图STM32步进电机H桥驱动控制原理图一般包括STM32微控制器、逻辑电平转换芯片、H桥驱动芯片和步进电机。STM32微控制器负责控制整个系统,逻辑电平转换芯片用于将微控制器输出的信号转换为合适的电平给H桥驱动芯片,H桥驱动芯片负责控制步进电机的运动。 源代码通常包括以下几个方面: 1. 创建引脚定义:定义STM32微控制器的各个引脚分别与H桥驱动芯片的各个引脚相连。 2. 初始化函数:包括对STM32微控制器 GPIO 寄存器的配置,将所需的引脚设置为输出模式,并设置初始电平状态。 3. 步进电机驱动函数:根据步进电机的控制方式(如全步进、半步进等),编写函数控制H桥驱动芯片,使其能够按照设定的步进模式驱动步进电机。这里将GPIO 输出电平信号发送到驱动芯片的使能(EN)引脚和方向(DIR)引脚,从而实现对步进电机的控制。 4. 程序主循环:在主循环中调用步进电机驱动函数,控制步进电机运动。可以根据需要调整步进电机的转速、运动方向等参数。 总结: STM32步进电机H桥驱动控制原理图中,通过STM32微控制器、逻辑电平转换芯片、H桥驱动芯片和步进电机的协同工作,实现对步进电机的控制。源代码中包含引脚定义、初始化函数和步进电机驱动函数等部分,通过编写合适的代码实现对步进电机的驱动控制。这些代码将通过控制引脚的电平和状态,向H桥驱动芯片发送相应的信号,从而实现步进电机的旋转和运动控制。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值