一: 电机
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.按下S2电机正转", Red, Black);
LCD_ShowString(10, 140, "2.按下S3电机反转", Red, Black);
LCD_ShowString(10, 160, "3.按下S4电机启动", Red, Black);
LCD_ShowString(10, 180, "4.按下S1电机停止", Red, Black);
KEYGpio_Init(); // 按键IO口初始化
DCMotorGpio_Init(); // 初始化直流电机引脚
while(1)
{
// S2正转
if (KEY_S2_READ == 0)
{
Delay_ms(10);
if (KEY_S2_READ == 0)
{
LCD_ShowString(200, 200, "电机正转", White, Black);
DCMOTOR_A_H;
t=1;
while(1)
{
DCMOTOR_B_L;
Delay_ms(10);
DCMOTOR_B_H;
Delay_ms(90);
if(KEY_S1_READ==0)
{
Delay_ms(10);
if(KEY_S1_READ==0)
{
t=0;
k=1;
break;
}
}
}
}
}
// S3反转
if (KEY_S3_READ == 0)
{
Delay_ms(10);
if (KEY_S3_READ == 0)
{
LCD_ShowString(200, 200, "电机反转", White, Black);
t=1;
DCMOTOR_B_H;
while(1)
{
DCMOTOR_A_L;
Delay_ms(10);
DCMOTOR_A_H;
Delay_ms(90);
if(KEY_S1_READ==0)
{
Delay_ms(10);
if(KEY_S1_READ==0)
{
t=0;
k=2;
break;
}
}
}
}
}
LCD_ShowString(200, 200, "电机停止", White, Black);
// S4启动
if(KEY_S4_READ==0)
{
Delay_ms(10);
if(KEY_S4_READ==0)
{
if(k==1)
{
LCD_ShowString(200, 200,"继续正转", White, Black);
DCMOTOR_A_H;
t=1;
while(1)
{
DCMOTOR_B_L;
Delay_ms(10);
DCMOTOR_B_H;
Delay_ms(90);
if(KEY_S1_READ==0)
{
Delay_ms(10);
if(KEY_S1_READ==0)
{
t=0;
k=1;
break;
}
}
}
}
}
else if(k==2)
{
LCD_ShowString(200, 200, "继续反转", White, Black);
t=1;
DCMOTOR_B_H;
while(1)
{
DCMOTOR_A_L;
Delay_ms(10);
DCMOTOR_A_H;
Delay_ms(90);
if(KEY_S1_READ==0)
{
Delay_ms(10);
if(KEY_S1_READ==0)
{
t=0;
k=2;
break;
}
}
}
}
}
if(t==0)
{
DCMOTOR_A_L;
DCMOTOR_B_L;
LCD_ShowString(200, 200, "电机停止", White, Black);
}
}
}
#include "main.h"
unsigned char startflag = 0;
unsigned short Speed = 0;
unsigned char Flag_1s = 0;
int main(void)
{
unsigned short num = 0;
unsigned char buf[5] = {0};
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.按下S2电机开始转动,1S后液晶上显示当前转速", Red, Black);
LCD_ShowString(10, 140, "2.按下S3电机停止转动,液晶上转速为0", Red, Black);
KEYGpio_Init(); // 按键IO口初始化
DCMotorGpio_Init(); // 初始化直流电机引脚
while(1)
{
LCD_ShowString(150, 180, "当前转速:(转/分钟)", White, Black);
LCD_ShowString(200, 200, buf, White, Black);
// S2开始
if (KEY_S2_READ == 0)
{
Delay_ms(10);
if (KEY_S2_READ == 0)
{
startflag = 1;
}
}
// S3停止
if (KEY_S3_READ == 0)
{
Delay_ms(10);
if (KEY_S3_READ == 0)
{
startflag = 0;
buf[0] = '0';
buf[1] = '0';
buf[2] = '0';
buf[3] = '0';
buf[4] = '0';
DCMOTOR_A_L;
DCMOTOR_B_L;
}
}
if(Flag_1s == 1)
{
num = 100;
num = 60 * (Speed / 4);
Speed = 0;
buf[0] = num / 10000 + '0';
buf[1] = num % 10000 / 1000 + '0';
buf[2] = num % 1000 / 100 + '0';
buf[3] = num % 100 / 10 + '0';
buf[4] = num % 10 + '0';
LCD_ShowString(150, 180, "当前转速:(转/分钟)", White, Black);
LCD_ShowString(200, 200, buf, White, Black);
Flag_1s = 0;
}
}
}
一:人体红外
int main(void)
{
unsigned char value=0;
unsigned short t;
unsigned char buf[10]={0};
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.显示两次人体移动感应的间隔时间,单位是ms", Red, Black);
HumPIRGpio_Init(); // 人体红外IO口初始化
while(1)
{
t=0;
value= HUMPIRIN();
if ( value == 1)
{
LCD_ShowString(200, 180, "Hum Alarm!", White, Black);
Delay_ms(500);
LCD_ShowString(200, 180, "Hum Normal", White, Black);
while(1)
{
if (SysTick_Config(SystemCoreClock / 1000))
{
while (1);
}
t++;
value= HUMPIRIN();
if ( value== 1)
{
break;
}
}
}
t=t-48+'0';
buf[0] =t / 1000000000 + '0';
buf[1] =t % 1000000000/ 100000000+ '0';
buf[2] =t % 100000000/ 10000000+ '0';
buf[3] =t % 10000000/ 1000000+ '0';
buf[4] =t % 1000000/ 100000+ '0';
buf[5] =t % 100000/ 10000+ '0';
buf[6] =t % 10000/ 1000+ '0';
buf[7] =t % 1000/ 100+ '0';
buf[8] =t % 100 / 10 + '0';
buf[9] =t % 10 + '0';
LCD_ShowString(200, 200, buf, White, Black);
}
}
三:LED TIM
int main(void)
{
TIM2_Configuration();
TIM3_Configuration();
TIM4_Configuration();
TIM5_Configuration();
LEDGpio_Init();
while (1);
}
//TIM2
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer2中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 1000-1; // 计数值
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
/* 溢出配置中断*/
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
/* 允许TIM2开始计数 */
TIM_Cmd(TIM2, ENABLE);
}
//TIM3
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer3中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 500-1; // 计数值
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM3, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
/* 溢出配置中断*/
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
/* 允许TIM3开始计数 */
TIM_Cmd(TIM3, ENABLE);
}
//TIM4
void TIM4_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer4中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 250-1; // 计数值
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM4, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
/* 溢出配置中断*/
TIM_ITConfig(TIM4,TIM_IT_Update, ENABLE);
/* 允许TIM4开始计数 */
TIM_Cmd(TIM4, ENABLE);
}
//TIM5
void TIM5_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer5中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* TIM5 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 125-1; // 计数值
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM5, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
/* 溢出配置中断*/
TIM_ITConfig(TIM5,TIM_IT_Update, ENABLE);
/* 允许TIM5开始计数 */
TIM_Cmd(TIM5, ENABLE);
}
四: USART
int main(void)
{
unsigned short crc16, bytes;
SysTick_init(); //系统时钟 1ms
lcd_init(); //液晶初始化
lcd_clear(Black); //设置液晶背景
Uart1_Init(); //串口转WiFi 或者 语音输入
Uart3_Init(); //RS485通信
Uart6_Init(); //语音合成播报
Relay_Init(); //继电器
LED_Init();
Uart3_Write("HELLO world!\n",strlen("HELLO world!\n"));
while(1)
{
read_report();
}
}
五: IIC
int main(void)
{
unsigned char value = 0;
SysTick_Init();
LEDGpio_Init();
I2C_24c02Init();
I2C_EE_BufferWrite(Writebuf, 0, 10);
Delay_ms(10);
I2C_EE_BufferRead(Readbuf, 0, 10);
value = strcmp((char *)Readbuf, (char *)Writebuf);
if (value == 0)
{
LED1_ON;
}
else
{
LED2_ON;
}
while (1);
}