本帖主要介紹一個基于STM32的智能路燈控制系統(tǒng)
摘 要
本設計根據題目要求制作一套智能路燈控制系統(tǒng),并且本著低成本高性能、結構簡單、控制方便、直觀顯示等的設計思想。我們通過對硬件系統(tǒng)和軟件程序的設計,以此實現(xiàn)通過光線強弱狀態(tài)來控制路燈的亮滅功能。其中硬件電路部分主要包括:單片機最小系統(tǒng)、路燈控制電路部分、紅外檢測和執(zhí)行電路部分、數碼管顯示電路部分;軟件部分主要包括:相應軟件和路燈控制、光電檢測和執(zhí)行、時間顯示等程序模塊。為了能夠精確控制智能燈的開關狀態(tài),本參賽隊隊員決定采用集成度高、處理能力強、可靠性高的單片機STM32F103RCT6設計相應程序,通過紅外檢測模塊來檢測是否有物體通過。當物體通過時,下降沿觸發(fā)產生中斷,隨后單片機執(zhí)行中斷函數里的命令。通過CH340g串口通信用電腦將采集到的有用數據發(fā)送給單片機,以此通過引腳高低電平和驅動電路控制路燈亮滅。再經處理后將物體通過的時間和對應速度顯示在數碼管上。
1.系統(tǒng)方案論證與比較 1.1整體設計思路流程 1.2單片機模塊部分方案一:選擇STC89C52作為主控芯片,STC89C52周期比較慢,系統(tǒng)反應比較慢。 方案二:選擇STM32F103RB作為主控芯片,這款單片機的雖然周期是比STC89C52快,但是CPU兼容性不強,存儲空間不夠大。 方案三:選擇STM32F103RCT6作為主控芯片,這塊芯片CPU兼容性更強,同時存儲空間很強大,一個16位普通IC/OC/PWM),2個16位基本(IC/OC/PWM),1個STI,2個USART,同時具有低功率、記憶、定時器等功能完全可以滿足系統(tǒng)智能控制的要求。 綜合以上三種方案,選擇方案三。 2.電路與程序設計 2.1電路的設計 2.1.1紅外感應檢測模塊部分 采用紅外感應技術而不采用其他人體感應技術,是因為目前基于紅外線的人體感應技術已經發(fā)展成熟,各種類型的紅外感應器也已經十分多見,而且價格便宜,目前成為最流行的人體感應技術。 紅外感應部分由紅外線自動檢測電路、邏輯運算、延遲電路、驅動電路等組成。利用紅外傳感器,可以檢測到人體的接近、移動等運動狀態(tài)。即當有人體進入到感應區(qū)域內時,紅外發(fā)射電路發(fā)出的紅外線被人體反射回一部分,紅外接收電路接收后通過邏輯運算電路控制路燈的亮滅,從而實現(xiàn)自動控制。 紅外自動檢測系統(tǒng)如圖1-3所示。 圖1-3紅外線自動檢測系統(tǒng)框圖 2.1.2 LED驅動電路部分 本部分通過LED驅動電路根據環(huán)境亮度的敏感程度做出反應。當環(huán)境亮度較低時(夜晚時分),電路將自動啟動,給紅外感應器模塊供電,這時可以根據有沒有人經過而自動控制路燈的亮滅。當環(huán)境亮度較高時(白天或者周圍有更高亮度的路燈點亮時),電路將自動切斷并進入省電模式,這是無論有沒有人經過,路燈都不會點亮。如下1-4為LED驅動電路的仿真圖。 圖1-4LED驅動電路設計圖 其中每只LED燈控制邏輯關系如圖1-5所示,即在規(guī)定的時間條件成立的條件下,當明暗條件成立的情況下開燈。
0.png (5.99 KB, 下載次數: 104)
下載附件
2018-7-6 04:23 上傳
圖1-5 LED燈控制邏輯圖
2.1.3 串口通信部分 該部分采用的是通過CH340g進行串口通信,即進行軟件設置以后,將編程器與目標板連接,然后對單片機燒錄程序。 2.1.4 系統(tǒng)總體框圖 智能路燈控制系統(tǒng)主要采用單片機進行控制,根據環(huán)境的明暗程度以及時間條件來決定路燈的開與關,其控制流程如下
0.png (15.1 KB, 下載次數: 94)
下載附件
2018-7-6 04:24 上傳
2.2程序的設計 1、程序功能 根據題目要求軟件部分主要實現(xiàn)運算與顯示。 2、程序設計 利用單片機STM32F103RCT6的外部中斷以及計時器功能,通過紅外檢測模塊來檢測是否有物體通過。當物體通過時,下降沿觸發(fā)產生中斷,隨后單片機執(zhí)行中斷函數里的命令。以此通過引腳高低電平和驅動電路控制路燈亮滅,再經處理后將物體通過的時間和對應速度顯示在數碼管上。 3.測試方案與測試結果 3.1測試方案 1、硬件測試 首先分模塊搭建硬件電路并分別測試成功,然后將分立的模塊搭建在一起測試整體功能。經測試,我們的電源模塊、功耗模塊、單片機控制模塊以及信號檢測放大模塊均工作正常。 2、軟件仿真測試 利用Proteus軟件畫出電路仿真圖,進行電路的各項性能測試,結果正常。 3、硬件軟件聯(lián)調 軟件仿真結果與實測值進行比較,分析差異原因,找出改進方案。 3.2 測試結果及分析 經過測試,系統(tǒng)各部分均工作正常,智能路燈照明系統(tǒng)可以控制LED燈的開關狀態(tài)。同時可以根據數碼管顯示相應物體運動速度等,測試結果也比較準確,因此本設計可以滿足相應功能。
單片機源程序如下: - #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();
- /*設置中斷優(yōu)先級分組*/
- 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);//等待發(fā)送結束}
- 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"
- // 單片機系統(tǒng)時鐘在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液晶讀忙狀態(tài)
- // 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(); //讀忙狀態(tài)
- 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(); //讀忙狀態(tài)
- 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; //搶占優(yōu)先級1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應優(yōu)先級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提供下載:
|