程序實現功能: 程序基于stm32芯片實現了控制LED燈亮滅、按鍵控制、串口通信、電機控制、溫濕度數據采集、超聲波測距、LCD顯示屏顯示內容這幾個功能,并用proteus8進行仿真。 1.電路圖 1、我設計的電路圖如下所示: 仿真原理圖如下  2.?程序功能介紹 程序總共包括控制LED燈亮滅、按鍵控制、串口通信、電機控制、溫濕度數據采集、超聲波測距、LCD顯示屏顯示內容這幾個功能,以下是這些功能的介紹: 2.1.?LED燈亮滅與按鍵控制 程序默認運行時,兩個LED燈會被點亮。當按下按鈕后,兩個LED燈會閃爍。 2.2.?串口通信 程序運行時,虛擬終端接串口通信用到的接收端和發送端,通過配置波特率、傳輸的奇偶校驗位、停止位、字長以及重定向,將printf函數打印的內容打印到虛擬終端上。 2.3.?電機的控制 通過L298芯片,改變功率,來控制電機的轉動。 2.4.?溫濕度數據采集 用DHT11溫濕度傳感器來采集溫濕度信息。 通過了解DHT11的工作時序,設計好對應的延時函數,進行數據采集,同時通過循環將每次采集的數據打印在虛擬終端上。 2.5.?超聲波測距 通過超聲波測距模塊來進行測距。 通過了解超聲波測距模塊的時序,利用定時器,采集測到的距離,并且通過循環打印在虛擬終端上。 2.6.?LCD液晶顯示器顯示數據 客戶端可以通過發送“database”字符串進入到數據庫的相關服務,在選擇相應功能執行。如下圖所示: 通過了解LM16016l中各引腳功能,相關控制指令以及寫時序和讀時序,在程序運行時,在顯示屏上打印“hello”。 3.具體代碼如下: * 文件名??: UltrasonicWave.c * 描述? ? :超聲波測距模塊,UltrasonicWave_Configuration()函數 ? ?? ?? ?? ? 初始化超聲模塊,UltrasonicWave_StartMeasure()函數 ? ?? ?? ?? ?? ?? ?? ?? ? 啟動測距,并將測得的數據通過串口1打印出來? ?? ?? ? * 實驗平臺:野火STM32開發板 * 硬件連接:------------------ *? ?? ?? ? | PC8??- TRIG? ?? ?| *? ?? ?? ? | PC9??- ECHO? ?? ?| *? ?? ?? ???------------------ * 庫版本??:ST3.5.0 UltrasonicWave.H - #ifndef __UltrasonicWave_H
- #define? ?? ???__UltrasonicWave_H
- void UltrasonicWave_Configuration(void);? ?? ?? ?? ?? ?//對超聲波模塊初始化
- void UltrasonicWave_StartMeasure(void);? ?? ?? ?? ?? ? //開始測距,發送一個>10us的脈沖,然后測量返回的高電平時間
- #endif /* __UltrasonicWave_H */
復制代碼 UltrasonicWave.c *********************************************************************************/ #include "./Wave/UltrasonicWave.h" #include "./usart/bsp_usart.h" #include "./Tim2/TIM2.h" #define? ?? ???TRIG_PORT? ?? ?GPIOC? ?? ?? ?? ?? ? //TRIG? ?? ? #define? ?? ???ECHO_PORT? ?? ?GPIOC? ?? ?? ?? ?? ? //ECHO #define? ?? ???TRIG_PIN? ?? ? GPIO_Pin_8? ?//TRIG? ?? ? #define? ?? ???ECHO_PIN? ?? ? GPIO_Pin_9? ?? ???//ECHO? ? unsigned short int UltrasonicWave_Distance;? ?? ?//計算出的距離? ? /* * 函數名:DelayTime_us * 描述??:1us延時函數 * 輸入??:Time? ?? ?? ???延時的時間 US * 輸出??:無? ?? ??? */ void DelayTime_us(int Time)? ? { ? ?unsigned char i; ? ?for ( ; Time>0; Time--) ? ???for ( i = 0; i < 72; i++ ); } /* * 函數名:UltrasonicWave_Configuration * 描述??:超聲波模塊的初始化 * 輸入??:無 * 輸出??:無? ?? ??? */ void UltrasonicWave_Configuration(void) { ??GPIO_InitTypeDef GPIO_InitStructure;? ?? ??? ? ?? ?? ?? ?? ??? ??RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); ? ? ??GPIO_InitStructure.GPIO_Pin = TRIG_PIN;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//PC8接TRIG ??GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;? ?? ?? ?? ?? ?? ?? ?//設為推挽輸出模式 ??GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;? ?? ?? ?? ?? ??? ??GPIO_Init(TRIG_PORT, &GPIO_InitStructure);? ?? ?? ?? ?? ?? ?? ?? ? //初始化外設GPIO ??GPIO_InitStructure.GPIO_Pin = ECHO_PIN;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //PC9接ECH0 ??GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;? ?? ?? ?? ?? ???//設為輸入 ??GPIO_Init(ECHO_PORT,&GPIO_InitStructure);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //初始化GPIOA } /* * 函數名:UltrasonicWave_CalculateTime * 描述??:計算距離 * 輸入??:無 * 輸出??:無? ?? ??? */ void UltrasonicWave_CalculateTime(void) { ? ?UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/2000; } /* * 函數名:UltrasonicWave_StartMeasure * 描述??:開始測距,發送一個>10us的脈沖,然后測量返回的高電平時間 * 輸入??:無 * 輸出??:無? ?? ??? */ void UltrasonicWave_StartMeasure(void) { ??GPIO_SetBits(TRIG_PORT,TRIG_PIN);? ?? ?? ?? ?? ?? ? //送>10US的高電平 ??DelayTime_us(20);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//延時20US ??GPIO_ResetBits(TRIG_PORT,TRIG_PIN); ?? ??while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));? ?? ?? ?? ?? ?? ?? ?//等待高電平 ??TIM_Cmd(TIM2, ENABLE);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//開啟時鐘 ??while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));? ?? ?? ?? ?? ?? ?? ?? ? //等待低電平 ??TIM_Cmd(TIM2, DISABLE);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//定時器2失能 ??UltrasonicWave_CalculateTime();? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //計算距離 ??TIM_SetCounter(TIM2,0); ? ?? ???printf("\r\ndistance:%d%d cm\r\n",UltrasonicWave_Distance/256,UltrasonicWave_Distance%256);? ?? ??? ? ?? ?? ?? ? } ? |