嵌入式系统 综合实验 光照度控制步进电机的转动

实验内容:

        用STM32F407的GPIO模拟I2C时序,读取光照度传感器的数据,根据读到的传感器的数据控制步进电机的转动,当光照值小于300lux时步进电机正转,300~3000lux不转,大于3000lux时步进电机反转。

主要代码:
#include "main.h"
unsigned int date = 0;
unsigned int temp = 0; 
unsigned char Databuf[3] = {0};
char Displaybuf[20] = {0};
void StepMotorTest(unsigned char mode);

int main(void)
{ 
	SysTick_Init();                                                     //  系统滴答定时器初始化
    
	LCD_Init();                                                         //  液晶初始化
	LCD_Clear(BLACK);                                                   //  设置液晶背景

	LCD_DrawRectangle(0,0, 479, 271, GREEN);
	LCD_DrawRectangle(5,5, 474, 266, GREEN);
	LCD_ShowString(150, 0, "--STM32F407 实验开发平台--", RED, BLACK);	
	LCD_ShowString(170,30, "光照度采集控制步进电机",WHITE, BLACK);
    LCD_ShowString(10, 60, "由于IO口复用,所以请打开所有模块的电源开关", RED, BLACK); 
    
	LCD_ShowString(10, 100, "现象:", RED, BLACK); 
    LCD_ShowString(10, 120, "1.观察液晶屏上采集到的光照度值", RED, BLACK); 
    LCD_ShowString(10, 140, "2.用手电筒照射传感器,观察液晶上显示的数据", RED, BLACK);
    LCD_ShowString(10, 160, "3.当光照值小于300正转,300~3000不转,大于3000反转", RED, BLACK);
    LCD_ShowString(10, 180, "注意:转动时红灯亮", RED, BLACK);
	
    I2C_GPIO_Configuration();                                           //  配置I2C的GPIO
    
	BH1750_Init();                                                      //  初始化BH1750
  StepMotorGpio_Init();        //步进电机引脚初始化
	while(1)
	{        
				if(date < 300){//如果光照值小于300
					StepMotorTest(0);  //正转
				}
					if(date >= 300 && date < 3000){//如果光照值300<=date<3000
							BH1750_ReadData(BH1750_SlaveAddress, Databuf);
							temp = Databuf[0];
							temp = (temp << 8) + Databuf[1];
							date = temp*10/12;
							sprintf(Displaybuf, "%5u Lux", date);
        
							LCD_ShowString(200, 200, (unsigned char*)Displaybuf, WHITE, BLACK);
					}
						if(date >= 3000)//如果光照值大于3000
							StepMotorTest(1); //反转
	}
}
void StepMotorTest(unsigned char mode)//控制步进电机
{
    unsigned int i = 0;
		
    if (mode == 0)	//步进电机正转
    {
       while(1)
        {
		BH1750_ReadData(BH1750_SlaveAddress, Databuf);
        
        temp = Databuf[0];
        temp = (temp << 8) + Databuf[1];
        date = temp*10/12;
		sprintf(Displaybuf, "%5u Lux", date);
        
        LCD_ShowString(200, 200, (unsigned char*)Displaybuf, WHITE, BLACK);
        
            MOTOR_A_L;// MOTOR_A低电平
            delay_ms(5);//延时5ms
            MOTOR_A_H;// MOTOR_A高电平
            
            MOTOR_B_L;// MOTOR_B低电平
            delay_ms(5);	//延时5ms
            MOTOR_B_H;// MOTOR_B高电平
            
            MOTOR_C_L;// MOTOR_C低电平
            delay_ms(5);	//延时5ms
            MOTOR_C_H;// MOTOR_C高电平
            
            MOTOR_D_L;// MOTOR_D低电平
            delay_ms(5);	//延时5ms
            MOTOR_D_H; // MOTOR_D高电平

			if(date >= 300)
				break;
        }
    }
    
    else  //步进电机反转
    {
        while(1)
        {
				BH1750_ReadData(BH1750_SlaveAddress, Databuf);
        
        temp = Databuf[0];
        temp = (temp << 8) + Databuf[1];
        date = temp*10/12;
		    sprintf(Displaybuf, "%5u Lux", date);
        
        LCD_ShowString(200, 200, (unsigned char*)Displaybuf, WHITE, BLACK);
        
            MOTOR_D_L; 		// MOTOR_D低电平
            delay_ms(5); 	//延时5ms
            MOTOR_D_H; 		// MOTOR_D高电平
            
            MOTOR_C_L; 		// MOTOR_C低电平
            delay_ms(5); 	//延时5ms
            MOTOR_C_H; 		// MOTOR_C高电平
            
            MOTOR_B_L;		// MOTOR_B低电平
            delay_ms(5);	//延时5ms
            MOTOR_B_H; 		// MOTOR_B高电平
            
            MOTOR_A_L;		// MOTOR_A低电平
            delay_ms(5);	//延时5ms
            MOTOR_A_H;		// MOTOR_A高电平
        		if(date < 3000)
				break;
        }

    }
    
    MOTOR_A_L;// MOTOR_A低电平
    MOTOR_B_L;// MOTOR_B低电平
    MOTOR_C_L;// MOTOR_C低电平 
    MOTOR_D_L;// MOTOR_D低电平
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值