本帖主要介绍一个基于STM32的智能路灯控制系统
摘 要
本设计根据题目要求制作一套智能路灯控制系统,并且本着低成本高性能、结构简单、控制方便、直观显示等的设计思想。我们通过对硬件系统和软件程序的设计,以此实现通过光线强弱状态来控制路灯的亮灭功能。其中硬件电路部分主要包括:单片机最小系统、路灯控制电路部分、红外检测和执行电路部分、数码管显示电路部分;软件部分主要包括:相应软件和路灯控制、光电检测和执行、时间显示等程序模块。为了能够精确控制智能灯的开关状态,本参赛队队员决定采用集成度高、处理能力强、可靠性高的单片机STM32F103RCT6设计相应程序,通过红外检测模块来检测是否有物体通过。当物体通过时,下降沿触发产生中断,随后单片机执行中断函数里的命令。通过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初始化*/
- LCD1602_Init();
- /*延时函数初始化*/
- 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; } }
- Control();
- 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(State_Flag1==1)
- 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)))); } }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
|