基于STM32的智能路灯控制系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

xxxx电气工程学院第三届电子设计大赛D题智能路灯系统
组长:xxx
学号:xxxx
队员1:xxxxx 学号:xxxxxxx
队员2:xxxxx 学号: xxxxx
学院:xx大学电气工程学院
xxx大学通信工程学院
二O一五年五月
摘要
本设计根据题目要求制作一套智能路灯控制系统,并且本着低成本高性能、结构简单、控制方便、直观显示等的设计思想。

我们通过对硬件系统和软件程序的设计,以此实现通过光线强弱状态来控制路灯的亮灭功能。

其中硬件电路部分主要包括:单片机最小系统、路灯控制电路部分、红外检测和执行电路部分、数码管显示电路部分;软件部分主要包括:相应软件和路灯控制、光电检测和执行、时间显示等程序模块。

为了能够精确控制智能灯的开关状态,本参赛队队员决定采用集成度高、处理能力强、可靠性高的单片机STM32F103RCT6设计相应程序,通过红外检测模块来检测是否有物体通过。

当物体通过时,下降沿触发产生中断,随后单片机执行中断函数里的命令。

通过CH340g串口通信用电脑将采集到的有用数据发送给单片机,以此通过引脚高低电平和驱动电路控制路灯亮灭。

再经处理后将物体通过的时间和对应速度显示在数码管上。

关键词:STM32F103RCT6,红外检测模块,LED驱动电路,CH340g串口通信
1.系统方案论证与比较
1.1整体设计思路流程
理解题意要求
根据理解初步设计相关设计步骤
根据理解画出电路图
使用电路图进行编程
程序仿真
焊接,硬件实现
1.2单片机模块部分
方案一:选择STC89C52作为主控芯片,STC89C52周期比较慢,系统反应比较慢。

方案二:选择STM32F103RB作为主控芯片,这款单片机的虽然周期是比STC89C52快,但是CPU兼容性不强,存储空间不够大。

方案三:选择STM32F103RCT6作为主控芯片,这块芯片CPU兼容性更强,同时存储空间很强大,一个16位普通IC/OC/PWM),2个16位基本(IC/OC/PWM),1个STI,2个USART,同时具有低功率、记忆、定时器等功能完全可以满足系统智能控制的要求。

综合以上三种方案,选择方案三。

2.电路与程序设计
2.1电路的设计
2.1.1红外感应检测模块部分
采用红外感应技术而不采用其他人体感应技术,是因为目前基于红外线的人体感应技术已经发展成熟,各种类型的红外感应器也已经十分多见,而且价格便宜,目前成为最流行的人体感应技术。

红外感应部分由红外线自动检测电路、逻辑运算、延迟电路、驱动电路等组成。

利用红外传感器,可以检测到人体的接近、移动等运动状态。

即当有人体进
入到感应区域内时,红外发射电路发出的红外线被人体反射回一部分,红外接收电路接收后通过逻辑运算电路控制路灯的亮灭,从而实现自动控制。

红外自动检测系统如图1-3所示。

图1-3红外线自动检测系统框图
2.1.2 LED驱动电路部分
本部分通过LED驱动电路根据环境亮度的敏感程度做出反应。

当环境亮度较低时(夜晚时分),电路将自动启动,给红外感应器模块供电,这时可以根据有没有人经过而自动控制路灯的亮灭。

当环境亮度较高时(白天或者周围有更高亮度的路灯点亮时),电路将自动切断并进入省电模式,这是无论有没有人经过,路灯都不会点亮。

如下1-4为LED驱动电路的仿真图。

图1-4LED驱动电路设计图
其中每只LED灯控制逻辑关系如图1-5所示,即在规定的时间条件成立的条件下,当明暗条件成立的情况下开灯。

图1-5 LED灯控制逻辑图
2.1.3 串口通信部分
该部分采用的是通过CH340g进行串口通信,即进行软件设置以后,将编程器与目标板连接,然后对单片机烧录程序。

2.1.4 系统总体框图
智能路灯控制系统主要采用单片机进行控制,根据环境的明暗程度以及时间条件来决定路灯的开与关,其控制流程如下
2.2程序的设计
1、程序功能
根据题目要求软件部分主要实现运算与显示。

2、程序设计
利用单片机STM32F103RCT6的外部中断以及计时器功能,通过红外检测模块来检测是否有物体通过。

当物体通过时,下降沿触发产生中断,随后单片机执行中断函数里的命令。

以此通过引脚高低电平和驱动电路控制路灯亮灭,再经处理后将物体通过的时间和对应速度显示在数码管上。

3.测试方案与测试结果
3.1测试方案
1、硬件测试
首先分模块搭建硬件电路并分别测试成功,然后将分立的模块搭建在一起测试整体功能。

经测试,我们的电源模块、功耗模块、单片机控制模块以及信号检测放大模块均工作正常。

2、软件仿真测试
利用Proteus软件画出电路仿真图,进行电路的各项性能测试,结果正常。

3、硬件软件联调
软件仿真结果与实测值进行比较,分析差异原因,找出改进方案。

3.2 测试结果及分析
经过测试,系统各部分均工作正常,智能路灯照明系统可以控制LED灯的开关状态。

同时可以根据数码管显示相应物体运动速度等,测试结果也比较准确,因此本设计可以满足相应功能。

附主要程序:
主函数
#include "stm32f10x.h"
#include"LCD1602.h"
#include"time_i.h"
#include"clock.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include"strcmp.h"
#include"Fixed_time.h"
#include"led.h"
#include"Digital_LED.h"
#include"Alarm.h"
#include"Speed_Cal.h"
#include"IR_EXTI.h"
#include"EXTI_PC10.h"
#include"EXTI_PC11.h"
#include"exti_PC13.h"
#include"EXTI_PC14.h"
#include"EXTI_PC15.h"
#include"Judge_LED.h"
int main(void)
{ u8 t;
u8 len;
u8 Time_Set[]="Set";
u8 Time_Set_Flag=0;
u8 Fix_Flag=0;
u8 *P_Fix_Flag;
P_Fix_Flag=&Fix_Flag;
order=Pass_order=0;
//LED1_Flag=LED2_Flag=0;
//LED_1=LED_2=L=M=R=1;
Time_Record_Flag=0;
Action_Record=0;
/****************************************************************************/ /*配置GPIO*/
LCD_Data_GPIO_Config();
LCD_Com_GPIO_Config();
/*配置数码管的GPIO*/
Digital_LED_GPIO_Init();
/*LED GPIO配置*/
LED_GPIO_Config();
/*LCD初始化*/
/*延时函数初始化*/
delay_init();
/*设置中断优先级分组*/
NVIC_Configuration_sys();
/*警报初始化*/
Alarm_Config();
/*外部中断初始化*/
//EXTI_PC_Config();
EXTI_PC10_Config();
EXTI_PC11_Config();
EXTI_PC13_Config();
EXTI_PC14_Config();
EXTI_PC15_Config();
/*串口初始化为9600*/
uart_init(9600);
/*配置TIM3 默认开启时钟*/
Timer_Init();
/*给时钟赋初始时间*/
Clock_Init();
/*****************************************************************/
LED1(OFF);
LED2(OFF);
while(1)
{Judge();
{if(USART_RX_STA&0x8000)
{ len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("%s_%s_%s_%s\r\nThe message you have sent:\r\n\n",Fixed_Buf1,Fixed_Buf3,Fixed_Buf2,Fixed_Buf4);
for(t=0;t<len;t++)
{USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
Time_Set_Flag=1;
Fix_Flag=1;
Control_Flag1=1;
Control_Flag2=1;}
if(Strcmp(USART_RX_BUF,Time_Set) > 0&&(USART_RX_BUF[0] == 'S'))
if(Time_Set_Flag)
{hour=(USART_RX_BUF[3]-48)*10+(USART_RX_BUF[4]-48);
min=(USART_RX_BUF[6]-48)*10+(USART_RX_BUF[7]-48);
sec=(USART_RX_BUF[9]-48)*10+(USART_RX_BUF[10]-48)-1;
Time_Set_Flag=0; } }
Fix(P_Fix_Flag);
Dis_time();
Fixed_Show();} }
LCD显示
LCD1602.c
#include"LCD1602.h"
// 单片机系统时钟在72MHZ下的延时
/*****************************延时函数*********** *******/
void delay_nus(u32 n)//微秒级延时
{ u8 i;
while(n--)
{ i=7;
while(i--); } }
void delay_nms(u32 n) //毫秒级延时,通常情况此函数可以不用更改
{ while(n--)
{ delay_nus(1100); } }
//LCD1602液晶读忙状态
// void LCD_FBUF(void)
// { // LCD1602_RS0; //RS信号拉低
// LCD1602_RW1; //RW信号拉高
// LCD1602_EN1;//EN信号拉高
// DATA_OUT = 0xFF; //数据端口11111111全高电平
// while((DATA_OUT & 0x80) == 0x80); //判断数据端口PB7 是否一直高// LCD1602_RW1;//RW信号拉高
// LCD1602_EN0; //EN信号拉低// }
//LCD1602写指令子函数
void Write_LCD1602_Instruction_Com(uint8_t Com)
{ //LCD_FBUF(); //读忙状态LCD1602_EN0; //EN信号拉低
LCD1602_RS0; //RS信号拉低写指令
LCD1602_RW0; //RW信号拉低
DATA_OUT = Com; //数据端口指令输入
delay_nms(1); //延时1ms
delay_nms(1);
LCD1602_EN1; //EN信号一个高脉冲
delay_nms(1); //延时1ms
delay_nms(1);
LCD1602_EN0;}
//LCD1602写数据子函数
void Write_LCD1602_Instruction_Data(uint8_t Date)
{//LCD_FBUF(); //读忙状态LCD1602_EN0; //EN信号拉低
LCD1602_RS1; //RS信号拉低写指令
LCD1602_RW0; //RW信号拉低
DATA_OUT = Date; //数据端口数据输入
delay_nms(1); //延时1ms
delay_nms(1);
LCD1602_EN1; //EN信号一个高脉冲
delay_nms(1); //延时1ms
delay_nms(1);
LCD1602_EN0;}
//LCD1602写指令和写数据子函数
// void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date)
// { // if(CountLiey == 0) //CountLiey == 0 写指令// { // Write_LCD1602_Instruction_Com(Date); // 写指令
// } // else //CountLiey !=0 写数据
// { // Write_LCD1602_Instruction_Data(Date); //不等于0写数据// } // }
//LCD1602初始化子函数
void LCD1602_Init(void)
{ delay_nms(15);
Write_LCD1602_Instruction_Com(0x38); //设置16×2显示,5×7点阵,8位数据接口delay_nms(5);
Write_LCD1602_Instruction_Com(0x0C); //设置打开显示
delay_nms(5);
Write_LCD1602_Instruction_Com(0x06); //读或写一个字符后地址指针加1 delay_nms(5);
Write_LCD1602_Instruction_Com(0x01); //显示清屏
delay_nms(5);
Write_LCD1602_Instruction_Com(0x80); //设置数据指针起点
delay_nms(5); }
void LCD_Data_GPIO_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
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_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); }
void LCD_Com_GPIO_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 | GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); }
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
/**************************************************************************/
#include "stm32f10x.h"
//======端口位清除寄存器
#define LCD1602_RS0 GPIO_ResetBits(GPIOB, GPIO_Pin_5)//低电平PB5 #define LCD1602_RW0 GPIO_ResetBits(GPIOB, GPIO_Pin_7) //低电平PB7 #define LCD1602_EN0 GPIO_ResetBits(GPIOB, GPIO_Pin_6)//低电平PB6 //========端口位设置/清除寄存器
#define LCD1602_RS1 GPIO_SetBits(GPIOB, GPIO_Pin_5) //高电平PB5
#define LCD1602_RW1 GPIO_SetBits(GPIOB, GPIO_Pin_7) //高电平PB7
#define LCD1602_EN1 GPIO_SetBits(GPIOB, GPIO_Pin_6) //高电平PB6
#define DATA_OUT GPIOA->ODR//数据端口PA0-PA7
void Delay_us(uint32_t CountLing);
void LCD_FBUF(void);
void Write_LCD1602_Instruction_Com(uint8_t Com);
void Write_LCD1602_Instruction_Data(uint8_t Date);
void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date);
void LCD1602_Init(void);
void LCD_Data_GPIO_Config(void);
void LCD_Com_GPIO_Config(void);
/****************************************************************************/ #endif
数码管显示
Digital_LED.c
#include "stm32f10x.h"
#include"Digital_LED.h"
#include"Speed_Cal.h"
#include "delay.h"
#include"led.h"
u32 Digital_LED_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示编码
u32 Dig_LED_time;
void Digital_LED_GPIO_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);
/*配置数据输出GPIO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);
/*配置位选GPIO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/****************************************************************************/ GPIO_ResetBits(GPIOA, GPIO_Pin_12 );
GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_15 ); }
void Digital_LED_Write(u32 Speed) //Speed 以mm为单位
{ if(Speed <= 9999) //数码管最多显示999.9cm
{ if(Speed/1000)
{ Dig_1_On;
DATA_OUT_DIG = Digital_LED_Table[Speed / 1000];
Delay(0x000fef);
Dig_1_Off;
Dig_2_On;
DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/1000)*1000)/ 100];
Delay(0x000fef);
Dig_2_Off;
Dig_3_On;
DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/100)*100)/ 10];
Delay(0x000fef);
DATA_OUT_DIG = 0x7f;//点亮小数点
Delay(0x000fef);
Dig_3_Off;
Dig_4_On;
DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
Delay(0x000fef);
Dig_4_Off; }
else if(Speed/100)
{ Dig_1_Off;
Dig_2_On;
DATA_OUT_DIG = Digital_LED_Table[Speed/100];
Delay(0x000fef);
Dig_2_Off;
Dig_3_On;
DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/100)*100)/10];
Delay(0x000fef);
DATA_OUT_DIG = 0x7f;//点亮小数点
Delay(0x000fef);
Dig_3_Off;
Dig_4_On;
DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
Delay(0x000fef);
Dig_4_Off; }
else if(Speed/10)
{ Dig_1_Off;
Dig_2_Off;
Dig_3_On;
DATA_OUT_DIG = Digital_LED_Table[Speed/10];
Delay(0x000fef);
DATA_OUT_DIG = 0x7f;//点亮小数点
Delay(0x000fef);
Dig_3_Off;
Dig_4_On;
DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
Delay(0x000fef);
Dig_4_Off; }
else if(Speed/10 == 0)
{ Dig_1_Off;
Dig_2_Off;
Dig_3_On;
DATA_OUT_DIG = Digital_LED_Table[0];
Delay(0x000fef);
DATA_OUT_DIG = 0x7f;//点亮小数点
Delay(0x000fef);
Dig_3_Off;
Dig_4_On;
DATA_OUT_DIG = Digital_LED_Table[Speed];
Delay(0x000fef);
Dig_4_Off; } } } void Delay(u32 nCount)
{ for(;nCount != 0; nCount--); }
void Run_Digital_LED(void)
{ //Speed_();
Dig_LED_time=0x000fff;//延时3~4s
while(Dig_LED_time--)
Digital_LED_Write(Speed);
// LED1(OFF);
// LED2(OFF); }
Digital_LED.h
#ifndef _Digital_LED_H
#define _Digital_LED_H
/**************************************************/
#include "stm32f10x.h"
#define DATA_OUT_DIG GPIOC->ODR//数据端口PC0-PC7 /*定义位选*/
#define Dig_1_On GPIO_SetBits(GPIOB, GPIO_Pin_14 );
#define Dig_2_On GPIO_SetBits(GPIOB, GPIO_Pin_15 );
#define Dig_3_On GPIO_SetBits(GPIOB, GPIO_Pin_8);
#define Dig_4_On GPIO_SetBits(GPIOA, GPIO_Pin_12 );
#define Dig_1_Off GPIO_ResetBits(GPIOB, GPIO_Pin_14 ); #define Dig_2_Off GPIO_ResetBits(GPIOB, GPIO_Pin_15 ); #define Dig_3_Off GPIO_ResetBits(GPIOB, GPIO_Pin_8);
#define Dig_4_Off GPIO_ResetBits(GPIOA, GPIO_Pin_12 ); /*定义位选*/
extern u32 Digital_LED_Table[];
extern u32 Dig_LED_time;
void Digital_LED_GPIO_Init(void);
void Digital_LED_Write(u32 Speed);
void Delay(u32 nCount);
void Run_Digital_LED(void);
/**************************************************/
#endif
定时器3用于显示时间
time_i.c
#include"time_i.h"
void Timer_Init(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/*给TIM模块使能,TIM3挂载在APB1上*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
NVIC_Configuration();
/*配置TIM3*/
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period=1999;//自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=35999;//时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清除溢出中断标志
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3,ENABLE);//开启时钟}
/*配置NVIC*/
static void NVIC_Configuration(void)
{ NVIC_InitTypeDef NVIC_InitStructure;
/*配置中断源*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); }
time_i.h
#ifndef _TIME_I_
#define _TIME_I_
/**********************************************/
#include "stm32f10x.h"
void Timer_Init(void);
static void NVIC_Configuration(void);
/*********************************************/
#endif
TIM3中断函数
void TIM3_IRQHandler(void)
{ if (TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{ TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
sec++;
Clock();
//Dis_time(); } }
串口控制LED
Fixed_time.c
#include "stm32f10x_it.h"
#include"Fixed_time.h"
#include"clock.h"
#include "usart.h"
#include"LCD1602.h"
#include"strcmp.h"
#include"led.h"
u8 Fixed_1_On[] = "N1";
u8 Fixed_1_Off[] = "F1";
u8 Fixed_2_On[] = "N2";
u8 Fixed_2_Off[] = "F2";
// u8 N_Now_1[] = "nowN1";
// u8 F_Now_1[] = "nowF1";
// u8 N_Now_2[] = "nowN2";
// u8 F_Now_2[] = "nowF2";
u8 Led1[]="L1";
u8 Led2[]="L2";
u8 Fixed_Buf1[]=" : : ";
u8 Fixed_Buf2[]=" : : ";
u8 Fixed_Buf3[]=" : : ";
u8 Fixed_Buf4[]=" : : ";
u8 State_Flag1=0;
u8 State_Flag2=0;
u8 Control_Flag1=0;
u8 Control_Flag2=0;
void Fix(u8 *Fix_Flag)
{ /*定时开启1号灯*/
if(Strcmp(USART_RX_BUF,Fixed_1_On) > 0)
if((*Fix_Flag)&& (USART_RX_BUF[0]=='N')&& (USART_RX_BUF[1]=='1'))
{ State_Flag1=1;
*Fix_Flag=0;
Fixed_Buf1[0]=USART_RX_BUF[2];
Fixed_Buf1[1]=USART_RX_BUF[3];
Fixed_Buf1[3]=USART_RX_BUF[5];
Fixed_Buf1[4]=USART_RX_BUF[6];
Fixed_Buf1[6]=USART_RX_BUF[8];
Fixed_Buf1[7]=USART_RX_BUF[9];
// if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==0)
// { // Write_LCD1602_Instruction_Com(0x80);
// Write_LCD1602_Instruction_Data('N');
// Write_LCD1602_Instruction_Com(0xC0);
// for(m=0;m<8;m++)
// { // Write_LCD1602_Instruction_Com(0xC0+m);
// Write_LCD1602_Instruction_Data(Fixed_Buf1[m] // } // } } // if(Strcmp(USART_RX_BUF,N_Now_1) == 0)
// { // LED1(ON);
// if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_1)==0) // LED2(OFF); // } /*定时关闭1号灯*/
if(Strcmp(USART_RX_BUF,Fixed_1_Off) > 0)
if((*Fix_Flag)&& (USART_RX_BUF[0]=='F')&& (USART_RX_BUF[1]=='1'))
{ State_Flag1=1;
*Fix_Flag=0;
Fixed_Buf3[0]=USART_RX_BUF[2];
Fixed_Buf3[1]=USART_RX_BUF[3];
Fixed_Buf3[3]=USART_RX_BUF[5];
Fixed_Buf3[4]=USART_RX_BUF[6];
Fixed_Buf3[6]=USART_RX_BUF[8];
Fixed_Buf3[7]=USART_RX_BUF[9];
// if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==1)
// { // Write_LCD1602_Instruction_Com(0x80);
// Write_LCD1602_Instruction_Data('F');
// for(m=0;m<8;m++)
// { // Write_LCD1602_Instruction_Com(0xC0+m);
// Write_LCD1602_Instruction_Data(Fixed_Buf3[m]); // } // } } // if(Strcmp(USART_RX_BUF,F_Now_1) == 0)
// { // LED1(OFF);
// if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_1)==1) // LED2(ON); // }
/*定时开启2号灯*/
if(Strcmp(USART_RX_BUF,Fixed_2_On) > 0)
if((*Fix_Flag)&& (USART_RX_BUF[0]=='N')&& (USART_RX_BUF[1]=='2'))
{ State_Flag2=1;
*Fix_Flag=0;
Fixed_Buf2[0]=USART_RX_BUF[2];
Fixed_Buf2[1]=USART_RX_BUF[3];
Fixed_Buf2[3]=USART_RX_BUF[5];
Fixed_Buf2[4]=USART_RX_BUF[6];
Fixed_Buf2[6]=USART_RX_BUF[8];
Fixed_Buf2[7]=USART_RX_BUF[9];
// if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==0)
// { // Write_LCD1602_Instruction_Com(0x8f);
// Write_LCD1602_Instruction_Data('N');
// for(m=0;m<8;m++)
// { // Write_LCD1602_Instruction_Com(0xC8+m);
//Write_LCD1602_Instruction_Data(Fixed_Buf2[m]);// // } } // if(Strcmp(USART_RX_BUF,N_Now_2) == 0)
// { // LED2(ON);
// if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_0)==0) // LED1(OFF); // } /*定时关闭2号灯*/
if(Strcmp(USART_RX_BUF,Fixed_2_Off) > 0)
if((*Fix_Flag) && (USART_RX_BUF[0]=='F')&& (USART_RX_BUF[1]=='2'))
{ State_Flag2=1;
*Fix_Flag=0;
Fixed_Buf4[0]=USART_RX_BUF[2];
Fixed_Buf4[1]=USART_RX_BUF[3];
Fixed_Buf4[3]=USART_RX_BUF[5];
Fixed_Buf4[4]=USART_RX_BUF[6];
Fixed_Buf4[6]=USART_RX_BUF[8];
Fixed_Buf4[7]=USART_RX_BUF[9];
// if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==1)
// { // Write_LCD1602_Instruction_Com(0x8f);
// Write_LCD1602_Instruction_Data('F');
// for(m=0;m<8;m++)
// { // Write_LCD1602_Instruction_Com(0xC8+m);
// Write_LCD1602_Instruction_Data(Fixed_Buf4[m]); // } // } // } // if(Strcmp(USART_RX_BUF,F_Now_2) == 0)
// { // LED2(OFF);
// if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_0)==1) // LED1(ON); } } void Control(void)
{ if(State_Flag1==1)
if(Strcmp(Fixed_Buf1,Time) == 0)
{ LED1(ON); //State_Flag1=0; }
if(Strcmp(Fixed_Buf3,Time) == 0)
{ LED1(OFF); //State_Flag1=0; }
if(State_Flag2==1)
if(Strcmp(Fixed_Buf2,Time) == 0)
{ LED2(ON); //State_Flag2=0; }
if(State_Flag2==1)
if(Strcmp(Fixed_Buf4,Time) == 0)
{ LED2(OFF); //State_Flag2=0; } }
void Control_Now(void)
{ /*实时开启关闭1号LED*/
if(((Strcmp(USART_RX_BUF,Led1) == 0)||(Strcmp(USART_RX_BUF,Led1) > 0))&& (Control_Flag1)&&(USART_RX_BUF[0]=='L')&&(USART_RX_BUF[1]=='1'))
{ Control_Flag1=0;
Control_Flag2=0;
GPIO_WriteBit(GPIOC,GPIO_Pin_6,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_6))) ); }
// /*实时关闭1号LED*/
// else if(Strcmp(USART_RX_BUF,F_Now_1) == 0)
// { // LED1(OFF); // }
// /*实时开启2号LED*/
// else if(Strcmp(USART_RX_BUF,N_Now_2) == 0)
// { // LED2(ON); // }
/*实时开启关闭2号LED*/
else if(((Strcmp(USART_RX_BUF,Led2) == 0)||(Strcmp(USART_RX_BUF,Led2) > 0))&& (Control_Flag2)&&(USART_RX_BUF[0]=='L')&&(USART_RX_BUF[1]=='2'))
{ Control_Flag1=0; Control_Flag2=0;
GPIO_WriteBit(GPIOC,GPIO_Pin_7,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin _7)))); } }
void Fixed_Show(void)
{ u8 m; if(State_Flag1==1)
{ if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==0)
{ Write_LCD1602_Instruction_Com(0x80);
Write_LCD1602_Instruction_Data('N');
Write_LCD1602_Instruction_Com(0xC0);
for(m=0;m<8;m++)
{ Write_LCD1602_Instruction_Com(0xC0+m);
Write_LCD1602_Instruction_Data(Fixed_Buf1[m]); } } if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==1)
{ Write_LCD1602_Instruction_Com(0x80);
Write_LCD1602_Instruction_Data('F');
for(m=0;m<8;m++)
{ Write_LCD1602_Instruction_Com(0xC0+m);
Write_LCD1602_Instruction_Data(Fixed_Buf3[m]);} } }
{ if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_11)==0)
{ Write_LCD1602_Instruction_Com(0x8f);
Write_LCD1602_Instruction_Data('N');
for(m=0;m<8;m++)
{ Write_LCD1602_Instruction_Com(0xC8+m);
Write_LCD1602_Instruction_Data(Fixed_Buf2[m]);} }
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_11)==1)
{ Write_LCD1602_Instruction_Com(0x8f);
Write_LCD1602_Instruction_Data('F');
for(m=0;m<8;m++)
{ Write_LCD1602_Instruction_Com(0xC8+m);
Write_LCD1602_Instruction_Data(Fixed_Buf4[m]);} } } } 5个中断函数
void EXTI15_10_IRQHandler()
{ delay_ms(10);
if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
{ if(GPIO_ReadOutputDataBit (GPIOB,GPIO_Pin_10 ))
LED1(OFF);
else LED1(ON);
EXTI_ClearITPendingBit(EXTI_Line10);}
if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
{if(GPIO_ReadOutputDataBit (GPIOB,GPIO_Pin_11 ))
LED2(OFF);
else LED2(ON);
EXTI_ClearITPendingBit(EXTI_Line11); }
if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
{ if(Pass_order==0)
{Pass_order=1;LED1(ON);Time_Record_Flag=1;}
if(Pass_order==2)
{LED1(OFF);Pass_order=0;Action_Record=1;}
EXTI_ClearITPendingBit(EXTI_Line13); }
if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
{ if(Pass_order==1)
{LED1(OFF);LED2(ON);}
if(Pass_order==2)
{LED1(ON);LED2(OFF);}
EXTI_ClearITPendingBit(EXTI_Line14); }
if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
{ if(Pass_order==0)
{Pass_order=2;LED2(ON);Time_Record_Flag=1;}
if(Pass_order==1)
{LED2(OFF);Pass_order=0;Action_Record=1;}
EXTI_ClearITPendingBit(EXTI_Line15);} }。

相关文档
最新文档