实验内容:
用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低电平
}