本帖主要介紹一個(gè)基于STM32的智能路燈控制系統(tǒng)
摘 要
本設(shè)計(jì)根據(jù)題目要求制作一套智能路燈控制系統(tǒng),并且本著低成本高性能、結(jié)構(gòu)簡單、控制方便、直觀顯示等的設(shè)計(jì)思想。我們通過對(duì)硬件系統(tǒng)和軟件程序的設(shè)計(jì),以此實(shí)現(xiàn)通過光線強(qiáng)弱狀態(tài)來控制路燈的亮滅功能。其中硬件電路部分主要包括:單片機(jī)最小系統(tǒng)、路燈控制電路部分、紅外檢測和執(zhí)行電路部分、數(shù)碼管顯示電路部分;軟件部分主要包括:相應(yīng)軟件和路燈控制、光電檢測和執(zhí)行、時(shí)間顯示等程序模塊。為了能夠精確控制智能燈的開關(guān)狀態(tài),本參賽隊(duì)隊(duì)員決定采用集成度高、處理能力強(qiáng)、可靠性高的單片機(jī)STM32F103RCT6設(shè)計(jì)相應(yīng)程序,通過紅外檢測模塊來檢測是否有物體通過。當(dāng)物體通過時(shí),下降沿觸發(fā)產(chǎn)生中斷,隨后單片機(jī)執(zhí)行中斷函數(shù)里的命令。通過CH340g串口通信用電腦將采集到的有用數(shù)據(jù)發(fā)送給單片機(jī),以此通過引腳高低電平和驅(qū)動(dòng)電路控制路燈亮滅。再經(jīng)處理后將物體通過的時(shí)間和對(duì)應(yīng)速度顯示在數(shù)碼管上。
1.系統(tǒng)方案論證與比較 1.1整體設(shè)計(jì)思路流程 1.2單片機(jī)模塊部分方案一:選擇STC89C52作為主控芯片,STC89C52周期比較慢,系統(tǒng)反應(yīng)比較慢。 方案二:選擇STM32F103RB作為主控芯片,這款單片機(jī)的雖然周期是比STC89C52快,但是CPU兼容性不強(qiáng),存儲(chǔ)空間不夠大。 方案三:選擇STM32F103RCT6作為主控芯片,這塊芯片CPU兼容性更強(qiáng),同時(shí)存儲(chǔ)空間很強(qiáng)大,一個(gè)16位普通IC/OC/PWM),2個(gè)16位基本(IC/OC/PWM),1個(gè)STI,2個(gè)USART,同時(shí)具有低功率、記憶、定時(shí)器等功能完全可以滿足系統(tǒng)智能控制的要求。 綜合以上三種方案,選擇方案三。 2.電路與程序設(shè)計(jì) 2.1電路的設(shè)計(jì) 2.1.1紅外感應(yīng)檢測模塊部分 采用紅外感應(yīng)技術(shù)而不采用其他人體感應(yīng)技術(shù),是因?yàn)槟壳盎诩t外線的人體感應(yīng)技術(shù)已經(jīng)發(fā)展成熟,各種類型的紅外感應(yīng)器也已經(jīng)十分多見,而且價(jià)格便宜,目前成為最流行的人體感應(yīng)技術(shù)。 紅外感應(yīng)部分由紅外線自動(dòng)檢測電路、邏輯運(yùn)算、延遲電路、驅(qū)動(dòng)電路等組成。利用紅外傳感器,可以檢測到人體的接近、移動(dòng)等運(yùn)動(dòng)狀態(tài)。即當(dāng)有人體進(jìn)入到感應(yīng)區(qū)域內(nèi)時(shí),紅外發(fā)射電路發(fā)出的紅外線被人體反射回一部分,紅外接收電路接收后通過邏輯運(yùn)算電路控制路燈的亮滅,從而實(shí)現(xiàn)自動(dòng)控制。 紅外自動(dòng)檢測系統(tǒng)如圖1-3所示。 圖1-3紅外線自動(dòng)檢測系統(tǒng)框圖 2.1.2 LED驅(qū)動(dòng)電路部分 本部分通過LED驅(qū)動(dòng)電路根據(jù)環(huán)境亮度的敏感程度做出反應(yīng)。當(dāng)環(huán)境亮度較低時(shí)(夜晚時(shí)分),電路將自動(dòng)啟動(dòng),給紅外感應(yīng)器模塊供電,這時(shí)可以根據(jù)有沒有人經(jīng)過而自動(dòng)控制路燈的亮滅。當(dāng)環(huán)境亮度較高時(shí)(白天或者周圍有更高亮度的路燈點(diǎn)亮?xí)r),電路將自動(dòng)切斷并進(jìn)入省電模式,這是無論有沒有人經(jīng)過,路燈都不會(huì)點(diǎn)亮。如下1-4為LED驅(qū)動(dòng)電路的仿真圖。 圖1-4LED驅(qū)動(dòng)電路設(shè)計(jì)圖 其中每只LED燈控制邏輯關(guān)系如圖1-5所示,即在規(guī)定的時(shí)間條件成立的條件下,當(dāng)明暗條件成立的情況下開燈。
0.png (5.99 KB, 下載次數(shù): 104)
下載附件
2018-7-6 04:23 上傳
圖1-5 LED燈控制邏輯圖
2.1.3 串口通信部分 該部分采用的是通過CH340g進(jìn)行串口通信,即進(jìn)行軟件設(shè)置以后,將編程器與目標(biāo)板連接,然后對(duì)單片機(jī)燒錄程序。 2.1.4 系統(tǒng)總體框圖 智能路燈控制系統(tǒng)主要采用單片機(jī)進(jìn)行控制,根據(jù)環(huán)境的明暗程度以及時(shí)間條件來決定路燈的開與關(guān),其控制流程如下
0.png (15.1 KB, 下載次數(shù): 94)
下載附件
2018-7-6 04:24 上傳
2.2程序的設(shè)計(jì) 1、程序功能 根據(jù)題目要求軟件部分主要實(shí)現(xiàn)運(yùn)算與顯示。 2、程序設(shè)計(jì) 利用單片機(jī)STM32F103RCT6的外部中斷以及計(jì)時(shí)器功能,通過紅外檢測模塊來檢測是否有物體通過。當(dāng)物體通過時(shí),下降沿觸發(fā)產(chǎn)生中斷,隨后單片機(jī)執(zhí)行中斷函數(shù)里的命令。以此通過引腳高低電平和驅(qū)動(dòng)電路控制路燈亮滅,再經(jīng)處理后將物體通過的時(shí)間和對(duì)應(yīng)速度顯示在數(shù)碼管上。 3.測試方案與測試結(jié)果 3.1測試方案 1、硬件測試 首先分模塊搭建硬件電路并分別測試成功,然后將分立的模塊搭建在一起測試整體功能。經(jīng)測試,我們的電源模塊、功耗模塊、單片機(jī)控制模塊以及信號(hào)檢測放大模塊均工作正常。 2、軟件仿真測試 利用Proteus軟件畫出電路仿真圖,進(jìn)行電路的各項(xiàng)性能測試,結(jié)果正常。 3、硬件軟件聯(lián)調(diào) 軟件仿真結(jié)果與實(shí)測值進(jìn)行比較,分析差異原因,找出改進(jìn)方案。 3.2 測試結(jié)果及分析 經(jīng)過測試,系統(tǒng)各部分均工作正常,智能路燈照明系統(tǒng)可以控制LED燈的開關(guān)狀態(tài)。同時(shí)可以根據(jù)數(shù)碼管顯示相應(yīng)物體運(yùn)動(dòng)速度等,測試結(jié)果也比較準(zhǔn)確,因此本設(shè)計(jì)可以滿足相應(yīng)功能。
單片機(jī)源程序如下: - #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();
- /*配置數(shù)碼管的GPIO*/
- Digital_LED_GPIO_Init();
- /*LED GPIO配置*/
- LED_GPIO_Config();
- /*LCD初始化*/
- LCD1602_Init();
- /*延時(shí)函數(shù)初始化*/
- delay_init();
- /*設(shè)置中斷優(yōu)先級(jí)分組*/
- NVIC_Configuration_sys();
- /*警報(bào)初始化*/
- 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 默認(rèn)開啟時(shí)鐘*/
- Timer_Init();
- /*給時(shí)鐘賦初始時(shí)間*/
- Clock_Init();
- /*****************************************************************/
- LED1(OFF);
- LED2(OFF);
- while(1)
- {Judge();
- {if(USART_RX_STA&0x8000)
- { len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長度
- 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ā)送結(jié)束}
- 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"
- // 單片機(jī)系統(tǒng)時(shí)鐘在72MHZ下的延時(shí)
- /*****************************延時(shí)函數(shù)*********** *******/
- void delay_nus(u32 n)//微秒級(jí)延時(shí)
- { u8 i;
- while(n--)
- { i=7;
- while(i--); } }
- void delay_nms(u32 n) //毫秒級(jí)延時(shí),通常情況此函數(shù)可以不用更改
- { while(n--)
- { delay_nus(1100); } }
- //LCD1602液晶讀忙狀態(tài)
- // void LCD_FBUF(void)
- // { // LCD1602_RS0; //RS信號(hào)拉低
- // LCD1602_RW1; //RW信號(hào)拉高
- // LCD1602_EN1;//EN信號(hào)拉高
- // DATA_OUT = 0xFF; //數(shù)據(jù)端口 11111111全高電平
- // while((DATA_OUT & 0x80) == 0x80); //判斷數(shù)據(jù)端口PB7 是否一直高
- // LCD1602_RW1;//RW信號(hào)拉高
- // LCD1602_EN0; //EN信號(hào)拉低 // }
- //LCD1602寫指令子函數(shù)
- void Write_LCD1602_Instruction_Com(uint8_t Com)
- { //LCD_FBUF(); //讀忙狀態(tài)
- LCD1602_EN0; //EN信號(hào)拉低
- LCD1602_RS0; //RS信號(hào)拉低寫指令
- LCD1602_RW0; //RW信號(hào)拉低
- DATA_OUT = Com; //數(shù)據(jù)端口指令輸入
- delay_nms(1); //延時(shí)1ms
- delay_nms(1);
- LCD1602_EN1; //EN信號(hào)一個(gè)高脈沖
- delay_nms(1); //延時(shí)1ms
- delay_nms(1);
- LCD1602_EN0;}
- //LCD1602寫數(shù)據(jù)子函數(shù)
- void Write_LCD1602_Instruction_Data(uint8_t Date)
- {//LCD_FBUF(); //讀忙狀態(tài)
- LCD1602_EN0; //EN信號(hào)拉低
- LCD1602_RS1; //RS信號(hào)拉低寫指令
- LCD1602_RW0; //RW信號(hào)拉低
- DATA_OUT = Date; //數(shù)據(jù)端口數(shù)據(jù)輸入
- delay_nms(1); //延時(shí)1ms
- delay_nms(1);
- LCD1602_EN1; //EN信號(hào)一個(gè)高脈沖
- delay_nms(1); //延時(shí)1ms
- delay_nms(1);
- LCD1602_EN0;}
- //LCD1602寫指令和寫數(shù)據(jù)子函數(shù)
- // 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 寫數(shù)據(jù)
- // { // Write_LCD1602_Instruction_Data(Date); //不等于0寫數(shù)據(jù) // } // }
- //LCD1602初始化子函數(shù)
- void LCD1602_Init(void)
- { delay_nms(15);
- Write_LCD1602_Instruction_Com(0x38); //設(shè)置16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
- delay_nms(5);
- Write_LCD1602_Instruction_Com(0x0C); //設(shè)置打開顯示
- delay_nms(5);
- Write_LCD1602_Instruction_Com(0x06); //讀或?qū)懸粋(gè)字符后地址指針加1
- delay_nms(5);
- Write_LCD1602_Instruction_Com(0x01); //顯示清屏
- delay_nms(5);
- Write_LCD1602_Instruction_Com(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- 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
- //========端口位設(shè)置/清除寄存器
- #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//數(shù)據(jù)端口 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
- 數(shù)碼管顯示
- 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};//共陽極數(shù)碼管顯示編碼
- 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);
- /*配置數(shù)據(jù)輸出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) //數(shù)碼管最多顯示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;//點(diǎn)亮小數(shù)點(diǎn)
- 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;//點(diǎn)亮小數(shù)點(diǎn)
- 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;//點(diǎn)亮小數(shù)點(diǎn)
- 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;//點(diǎn)亮小數(shù)點(diǎn)
- 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;//延時(shí)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//數(shù)據(jù)端口 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
- 定時(shí)器3用于顯示時(shí)間
- 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;//自動(dòng)重裝載寄存器的值
- TIM_TimeBaseStructure.TIM_Prescaler=35999;//時(shí)鐘預(yù)分頻數(shù)
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采樣分頻
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//計(jì)數(shù)方式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清除溢出中斷標(biāo)志
- TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
- TIM_Cmd(TIM3,ENABLE);//開啟時(shí)鐘 }
- /*配置NVIC*/
- static void NVIC_Configuration(void)
- { NVIC_InitTypeDef NVIC_InitStructure;
- /*配置中斷源*/
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級(jí)1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)優(yōu)先級(jí)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中斷函數(shù)
- 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)
- { /*定時(shí)開啟1號(hào)燈*/
- 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); // }
- /*定時(shí)關(guān)閉1號(hào)燈*/
- 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); // }
- /*定時(shí)開啟2號(hào)燈*/
- 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); // }
- /*定時(shí)關(guān)閉2號(hào)燈*/
- 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)
- { /*實(shí)時(shí)開啟關(guān)閉1號(hào)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)))); }
- // /*實(shí)時(shí)關(guān)閉1號(hào)LED*/
- // else if(Strcmp(USART_RX_BUF,F_Now_1) == 0)
- // { // LED1(OFF); // }
- // /*實(shí)時(shí)開啟2號(hào)LED*/
- // else if(Strcmp(USART_RX_BUF,N_Now_2) == 0)
- // { // LED2(ON); // }
- /*實(shí)時(shí)開啟關(guān)閉2號(hào)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)))); } }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
|