久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 18510|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于STM32的智能路燈控制系統(tǒng)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖主要介紹一個(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)明暗條件成立的情況下開燈。

圖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),其控制流程如下


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ī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include"LCD1602.h"
  3. #include"time_i.h"
  4. #include"clock.h"
  5. #include "delay.h"
  6. #include "sys.h"
  7. #include "usart.h"
  8. #include"strcmp.h"
  9. #include"Fixed_time.h"
  10. #include"led.h"
  11. #include"Digital_LED.h"
  12. #include"Alarm.h"
  13. #include"Speed_Cal.h"
  14. #include"IR_EXTI.h"
  15. #include"EXTI_PC10.h"
  16. #include"EXTI_PC11.h"
  17. #include"exti_PC13.h"
  18. #include"EXTI_PC14.h"
  19. #include"EXTI_PC15.h"
  20. #include"Judge_LED.h"
  21. int main(void)
  22. {   u8 t;
  23.               u8 len;            
  24.               u8 Time_Set[]="Set";
  25.               u8 Time_Set_Flag=0;
  26.               u8 Fix_Flag=0;
  27.               u8 *P_Fix_Flag;
  28.               P_Fix_Flag=&Fix_Flag;
  29.               order=Pass_order=0;
  30.               //LED1_Flag=LED2_Flag=0;
  31.               //LED_1=LED_2=L=M=R=1;
  32.               Time_Record_Flag=0;
  33.               Action_Record=0;
  34. /****************************************************************************/              /*配置GPIO*/
  35.               LCD_Data_GPIO_Config();
  36.               LCD_Com_GPIO_Config();
  37. /*配置數(shù)碼管的GPIO*/
  38.               Digital_LED_GPIO_Init();
  39.               /*LED GPIO配置*/
  40.               LED_GPIO_Config();
  41.               /*LCD初始化*/
  42.   LCD1602_Init();
  43.               /*延時(shí)函數(shù)初始化*/
  44.               delay_init();                              
  45.               /*設(shè)置中斷優(yōu)先級(jí)分組*/
  46.               NVIC_Configuration_sys();
  47.               /*警報(bào)初始化*/
  48.               Alarm_Config();
  49.               /*外部中斷初始化*/
  50.               //EXTI_PC_Config();
  51.   EXTI_PC10_Config();
  52.               EXTI_PC11_Config();
  53.               EXTI_PC13_Config();
  54.   EXTI_PC14_Config();
  55.               EXTI_PC15_Config();
  56.               /*串口初始化為9600*/
  57.               uart_init(9600);            
  58.               /*配置TIM3   默認(rèn)開啟時(shí)鐘*/
  59.               Timer_Init();
  60.               /*給時(shí)鐘賦初始時(shí)間*/
  61.               Clock_Init();
  62. /*****************************************************************/            
  63. LED1(OFF);
  64. LED2(OFF);
  65.               while(1)
  66.               {Judge();            
  67.               {if(USART_RX_STA&0x8000)
  68.                             { len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長度
  69.                                           printf("%s_%s_%s_%s\r\nThe message you have sent:\r\n\n",Fixed_Buf1,Fixed_Buf3,Fixed_Buf2,Fixed_Buf4);
  70.                                           for(t=0;t<len;t++)
  71.                                           {USART1->DR=USART_RX_BUF[t];
  72.                                           while((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束}
  73.                                           printf("\r\n\r\n");//插入換行
  74.                                           USART_RX_STA=0;
  75.                                           Time_Set_Flag=1;
  76.                                           Fix_Flag=1;
  77.                                           Control_Flag1=1;
  78.                                           Control_Flag2=1;}
  79.                                           if(Strcmp(USART_RX_BUF,Time_Set) > 0&&(USART_RX_BUF[0] == 'S'))
  80.                                                         if(Time_Set_Flag)
  81.                                                         {hour=(USART_RX_BUF[3]-48)*10+(USART_RX_BUF[4]-48);
  82.                                                                       min=(USART_RX_BUF[6]-48)*10+(USART_RX_BUF[7]-48);
  83.                                                                       sec=(USART_RX_BUF[9]-48)*10+(USART_RX_BUF[10]-48)-1;
  84.                                                                       Time_Set_Flag=0; }  }
  85.                             Control();
  86.                             Fix(P_Fix_Flag);
  87.                             Dis_time();
  88.                             Fixed_Show();} }
  89. LCD顯示
  90. LCD1602.c
  91. #include"LCD1602.h"
  92. // 單片機(jī)系統(tǒng)時(shí)鐘在72MHZ下的延時(shí)
  93. /*****************************延時(shí)函數(shù)*********** *******/
  94. void delay_nus(u32 n)//微秒級(jí)延時(shí)
  95. {   u8 i;
  96.     while(n--)
  97.     {   i=7;
  98.         while(i--);  }  }   
  99. void delay_nms(u32 n) //毫秒級(jí)延時(shí),通常情況此函數(shù)可以不用更改
  100. {   while(n--)
  101.     {    delay_nus(1100);  } }
  102. //LCD1602液晶讀忙狀態(tài)
  103. // void LCD_FBUF(void)
  104. // {   // LCD1602_RS0;                    //RS信號(hào)拉低
  105.               // LCD1602_RW1;    //RW信號(hào)拉高
  106.               // LCD1602_EN1;//EN信號(hào)拉高
  107.               // DATA_OUT = 0xFF;    //數(shù)據(jù)端口 11111111全高電平
  108.               // while((DATA_OUT & 0x80) == 0x80);    //判斷數(shù)據(jù)端口PB7 是否一直高
  109.               // LCD1602_RW1;//RW信號(hào)拉高
  110.               // LCD1602_EN0;    //EN信號(hào)拉低  // }
  111. //LCD1602寫指令子函數(shù)
  112. void Write_LCD1602_Instruction_Com(uint8_t Com)
  113. {   //LCD_FBUF();                                     //讀忙狀態(tài)
  114.               LCD1602_EN0;                    //EN信號(hào)拉低
  115.               LCD1602_RS0;                    //RS信號(hào)拉低寫指令
  116.               LCD1602_RW0;                    //RW信號(hào)拉低
  117.               DATA_OUT = Com;                    //數(shù)據(jù)端口指令輸入
  118.               delay_nms(1);                   //延時(shí)1ms
  119.               delay_nms(1);
  120.               LCD1602_EN1;                       //EN信號(hào)一個(gè)高脈沖
  121.               delay_nms(1);                   //延時(shí)1ms
  122.               delay_nms(1);
  123.               LCD1602_EN0;}
  124. //LCD1602寫數(shù)據(jù)子函數(shù)
  125. void Write_LCD1602_Instruction_Data(uint8_t Date)
  126. {//LCD_FBUF();                                     //讀忙狀態(tài)
  127.               LCD1602_EN0;                    //EN信號(hào)拉低
  128.               LCD1602_RS1;                    //RS信號(hào)拉低寫指令
  129.               LCD1602_RW0;                    //RW信號(hào)拉低
  130.               DATA_OUT = Date;               //數(shù)據(jù)端口數(shù)據(jù)輸入
  131.               delay_nms(1);                   //延時(shí)1ms
  132.               delay_nms(1);
  133.               LCD1602_EN1;                        //EN信號(hào)一個(gè)高脈沖
  134.               delay_nms(1);                   //延時(shí)1ms
  135.               delay_nms(1);
  136.               LCD1602_EN0;}
  137. //LCD1602寫指令和寫數(shù)據(jù)子函數(shù)
  138. // void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date)
  139. // {              // if(CountLiey == 0)                              //CountLiey == 0 寫指令
  140.               // {  // Write_LCD1602_Instruction_Com(Date);              // 寫指令
  141.               // }              // else                                 //CountLiey !=0 寫數(shù)據(jù)  
  142.               // {  // Write_LCD1602_Instruction_Data(Date);  //不等于0寫數(shù)據(jù)  // }   // }
  143. //LCD1602初始化子函數(shù)
  144. void LCD1602_Init(void)
  145. {  delay_nms(15);
  146.               Write_LCD1602_Instruction_Com(0x38);   //設(shè)置16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
  147.               delay_nms(5);
  148.               Write_LCD1602_Instruction_Com(0x0C);               //設(shè)置打開顯示
  149.               delay_nms(5);
  150.               Write_LCD1602_Instruction_Com(0x06);             //讀或?qū)懸粋(gè)字符后地址指針加1
  151.               delay_nms(5);
  152.               Write_LCD1602_Instruction_Com(0x01);           //顯示清屏
  153.               delay_nms(5);
  154.               Write_LCD1602_Instruction_Com(0x80);           //設(shè)置數(shù)據(jù)指針起點(diǎn)
  155.               delay_nms(5);   }
  156. void LCD_Data_GPIO_Config(void)
  157. {    GPIO_InitTypeDef GPIO_InitStructure;
  158.               RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  159.               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;
  160.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  161.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  162.               GPIO_Init(GPIOA, &GPIO_InitStructure);   }
  163. void LCD_Com_GPIO_Config(void)
  164. {   GPIO_InitTypeDef GPIO_InitStructure;
  165.               RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  166.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 | GPIO_Pin_5 ;
  167.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  168.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  169.               GPIO_Init(GPIOB, &GPIO_InitStructure);   }
  170. LCD1602.h
  171. #ifndef                _LCD1602_H_
  172. #define                _LCD1602_H_
  173. /**************************************************************************/
  174. #include "stm32f10x.h"
  175. //======端口位清除寄存器
  176. #define      LCD1602_RS0           GPIO_ResetBits(GPIOB, GPIO_Pin_5)//低電平  PB5
  177. #define      LCD1602_RW0           GPIO_ResetBits(GPIOB, GPIO_Pin_7) //低電平  PB7
  178. #define      LCD1602_EN0           GPIO_ResetBits(GPIOB, GPIO_Pin_6)//低電平  PB6
  179. //========端口位設(shè)置/清除寄存器
  180. #define      LCD1602_RS1           GPIO_SetBits(GPIOB, GPIO_Pin_5) //高電平 PB5
  181. #define      LCD1602_RW1           GPIO_SetBits(GPIOB, GPIO_Pin_7) //高電平  PB7
  182. #define      LCD1602_EN1           GPIO_SetBits(GPIOB, GPIO_Pin_6) //高電平  PB6
  183. #define      DATA_OUT              GPIOA->ODR//數(shù)據(jù)端口 PA0-PA7
  184. void Delay_us(uint32_t CountLing);
  185. void LCD_FBUF(void);
  186. void Write_LCD1602_Instruction_Com(uint8_t Com);
  187. void Write_LCD1602_Instruction_Data(uint8_t Date);
  188. void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date);
  189. void LCD1602_Init(void);
  190. void LCD_Data_GPIO_Config(void);
  191. void LCD_Com_GPIO_Config(void);
  192. /****************************************************************************/
  193. #endif
  194. 數(shù)碼管顯示
  195. Digital_LED.c
  196. #include "stm32f10x.h"
  197. #include"Digital_LED.h"
  198. #include"Speed_Cal.h"
  199. #include "delay.h"
  200. #include"led.h"
  201. u32 Digital_LED_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數(shù)碼管顯示編碼
  202. u32 Dig_LED_time;
  203. void Digital_LED_GPIO_Init(void)
  204. {  GPIO_InitTypeDef GPIO_InitStructure;
  205.               RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);
  206.               /*配置數(shù)據(jù)輸出GPIO*/
  207.               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;
  208.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  209.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  210.               GPIO_Init(GPIOC, &GPIO_InitStructure);
  211.               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);
  212.               /*配置位選GPIO*/
  213.               GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 ;
  214.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  215.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  216.               GPIO_Init(GPIOA, &GPIO_InitStructure);
  217.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |  GPIO_Pin_14 | GPIO_Pin_15 ;
  218.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  219.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  220.               GPIO_Init(GPIOB, &GPIO_InitStructure);
  221. /****************************************************************************/
  222.               GPIO_ResetBits(GPIOA,  GPIO_Pin_12 );
  223.               GPIO_ResetBits(GPIOB, GPIO_Pin_8 |  GPIO_Pin_14 | GPIO_Pin_15 );   }
  224. void Digital_LED_Write(u32 Speed)   //Speed 以mm為單位
  225. {   if(Speed <= 9999)   //數(shù)碼管最多顯示999.9cm
  226.               {   if(Speed/1000)
  227.                             {    Dig_1_On;
  228.                                           DATA_OUT_DIG = Digital_LED_Table[Speed / 1000];
  229.                                           Delay(0x000fef);
  230.                                           Dig_1_Off;
  231.                                           Dig_2_On;
  232.                                           DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/1000)*1000)/ 100];
  233.                                           Delay(0x000fef);
  234.                                           Dig_2_Off;
  235.                                           Dig_3_On;
  236.                                           DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/100)*100)/ 10];
  237.                                           Delay(0x000fef);
  238.                                           DATA_OUT_DIG = 0x7f;//點(diǎn)亮小數(shù)點(diǎn)
  239.                                           Delay(0x000fef);
  240.                                           Dig_3_Off;
  241.                                           Dig_4_On;
  242.                                           DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
  243.                                           Delay(0x000fef);
  244.                                           Dig_4_Off;   }
  245.                             else if(Speed/100)
  246.                                           {   Dig_1_Off;
  247.                                                         Dig_2_On;
  248.                                                         DATA_OUT_DIG = Digital_LED_Table[Speed/100];
  249.                                                         Delay(0x000fef);
  250.                                                         Dig_2_Off;
  251.                                                         Dig_3_On;
  252.                                                         DATA_OUT_DIG = Digital_LED_Table[(Speed-(Speed/100)*100)/10];
  253.                                                         Delay(0x000fef);
  254.                                                         DATA_OUT_DIG = 0x7f;//點(diǎn)亮小數(shù)點(diǎn)
  255.                                                         Delay(0x000fef);
  256.                                                         Dig_3_Off;
  257.                                                         Dig_4_On;
  258.                                                         DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
  259.                                                         Delay(0x000fef);
  260.                                                         Dig_4_Off;   }
  261.                                           else if(Speed/10)
  262.                                                         {   Dig_1_Off;
  263.                                                                       Dig_2_Off;
  264.                                                                       Dig_3_On;
  265.                                                                       DATA_OUT_DIG = Digital_LED_Table[Speed/10];
  266.                                                                       Delay(0x000fef);
  267.                                                                       DATA_OUT_DIG = 0x7f;//點(diǎn)亮小數(shù)點(diǎn)
  268.                                                                       Delay(0x000fef);
  269.                                                                       Dig_3_Off;
  270.                                                                       Dig_4_On;
  271.                                                                       DATA_OUT_DIG = Digital_LED_Table[Speed-(Speed/10)*10];
  272.                                                                       Delay(0x000fef);
  273.                                                                       Dig_4_Off;  }
  274.                                                         else if(Speed/10 == 0)
  275.                                                                       {              Dig_1_Off;
  276.                                                                                     Dig_2_Off;
  277.                                                                                     Dig_3_On;
  278.                                                                                     DATA_OUT_DIG = Digital_LED_Table[0];
  279.                                                                                     Delay(0x000fef);
  280.                                                                                     DATA_OUT_DIG = 0x7f;//點(diǎn)亮小數(shù)點(diǎn)
  281.                                                                                     Delay(0x000fef);
  282.                                                                                     Dig_3_Off;
  283.                                                                                     Dig_4_On;
  284.                                                                                     DATA_OUT_DIG = Digital_LED_Table[Speed];
  285.                                                                                     Delay(0x000fef);
  286.                                                                                     Dig_4_Off;              }       }                                                                      }
  287. void Delay(u32 nCount)
  288. {   for(;nCount != 0; nCount--);  }
  289. void Run_Digital_LED(void)
  290. {   //Speed_();
  291.               Dig_LED_time=0x000fff;//延時(shí)3~4s
  292.               while(Dig_LED_time--)
  293.               Digital_LED_Write(Speed);
  294.               // LED1(OFF);
  295.               // LED2(OFF);  }
  296. Digital_LED.h
  297. #ifndef _Digital_LED_H
  298. #define _Digital_LED_H
  299. /**************************************************/
  300. #include "stm32f10x.h"
  301. #define      DATA_OUT_DIG              GPIOC->ODR//數(shù)據(jù)端口 PC0-PC7
  302. /*定義位選*/
  303. #define      Dig_1_On                                                        GPIO_SetBits(GPIOB, GPIO_Pin_14 );
  304. #define      Dig_2_On                                                        GPIO_SetBits(GPIOB, GPIO_Pin_15 );
  305. #define      Dig_3_On                                                        GPIO_SetBits(GPIOB, GPIO_Pin_8);
  306. #define      Dig_4_On                                                        GPIO_SetBits(GPIOA, GPIO_Pin_12 );
  307. #define      Dig_1_Off                                                        GPIO_ResetBits(GPIOB, GPIO_Pin_14 );
  308. #define      Dig_2_Off                                                        GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
  309. #define      Dig_3_Off                                                        GPIO_ResetBits(GPIOB, GPIO_Pin_8);
  310. #define      Dig_4_Off                                                        GPIO_ResetBits(GPIOA, GPIO_Pin_12 );
  311. /*定義位選*/
  312. extern u32 Digital_LED_Table[];
  313. extern u32 Dig_LED_time;
  314. void Digital_LED_GPIO_Init(void);
  315. void Digital_LED_Write(u32 Speed);
  316. void Delay(u32 nCount);
  317. void Run_Digital_LED(void);
  318. /**************************************************/
  319. #endif
  320. 定時(shí)器3用于顯示時(shí)間
  321. time_i.c
  322. #include"time_i.h"
  323. void Timer_Init(void)
  324. {  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  325.               /*給TIM模塊使能, TIM3掛載在APB1上*/
  326.               RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  327.               NVIC_Configuration();
  328.               /*配置TIM3*/
  329.               TIM_DeInit(TIM3);
  330.               TIM_TimeBaseStructure.TIM_Period=1999;//自動(dòng)重裝載寄存器的值
  331.               TIM_TimeBaseStructure.TIM_Prescaler=35999;//時(shí)鐘預(yù)分頻數(shù)
  332.               TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采樣分頻
  333.               TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//計(jì)數(shù)方式
  334.               TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  335.               TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清除溢出中斷標(biāo)志
  336.               TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  337.               TIM_Cmd(TIM3,ENABLE);//開啟時(shí)鐘  }
  338. /*配置NVIC*/
  339. static void NVIC_Configuration(void)
  340. {   NVIC_InitTypeDef NVIC_InitStructure;
  341.               /*配置中斷源*/
  342.               NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  343.               NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級(jí)1
  344.               NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //響應(yīng)優(yōu)先級(jí)1
  345.               NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  346.               NVIC_Init(&NVIC_InitStructure); }
  347. time_i.h
  348. #ifndef _TIME_I_
  349. #define _TIME_I_
  350. /**********************************************/
  351. #include "stm32f10x.h"
  352. void Timer_Init(void);
  353. static void NVIC_Configuration(void);
  354. /*********************************************/
  355. #endif
  356. TIM3中斷函數(shù)
  357. void TIM3_IRQHandler(void)
  358. {   if (TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
  359.               {   TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
  360.                             sec++;
  361.                             Clock();
  362.                             //Dis_time();   }   }
  363. 串口控制LED
  364. Fixed_time.c
  365. #include "stm32f10x_it.h"
  366. #include"Fixed_time.h"
  367. #include"clock.h"
  368. #include "usart.h"
  369. #include"LCD1602.h"
  370. #include"strcmp.h"
  371. #include"led.h"
  372. u8 Fixed_1_On[] = "N1";
  373. u8 Fixed_1_Off[] = "F1";
  374. u8 Fixed_2_On[] = "N2";
  375. u8 Fixed_2_Off[] = "F2";
  376. // u8 N_Now_1[] = "nowN1";
  377. // u8 F_Now_1[] = "nowF1";
  378. // u8 N_Now_2[] = "nowN2";
  379. // u8 F_Now_2[] = "nowF2";
  380. u8 Led1[]="L1";
  381. u8 Led2[]="L2";
  382. u8 Fixed_Buf1[]="  :  :  ";
  383. u8 Fixed_Buf2[]="  :  :  ";
  384. u8 Fixed_Buf3[]="  :  :  ";
  385. u8 Fixed_Buf4[]="  :  :  ";
  386. u8 State_Flag1=0;
  387. u8 State_Flag2=0;
  388. u8 Control_Flag1=0;
  389. u8 Control_Flag2=0;
  390. void Fix(u8 *Fix_Flag)
  391. {  /*定時(shí)開啟1號(hào)燈*/
  392.               if(Strcmp(USART_RX_BUF,Fixed_1_On) > 0)
  393.                             if((*Fix_Flag)&& (USART_RX_BUF[0]=='N')&& (USART_RX_BUF[1]=='1'))
  394.                                                         {    State_Flag1=1;
  395.                                                                       *Fix_Flag=0;
  396.                                                                       Fixed_Buf1[0]=USART_RX_BUF[2];
  397.                                                                       Fixed_Buf1[1]=USART_RX_BUF[3];
  398.                                                                       Fixed_Buf1[3]=USART_RX_BUF[5];
  399.                                                                       Fixed_Buf1[4]=USART_RX_BUF[6];
  400.                                                                       Fixed_Buf1[6]=USART_RX_BUF[8];
  401.                                                                       Fixed_Buf1[7]=USART_RX_BUF[9];
  402.                                                                       // if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==0)
  403.                                                                       // {  // Write_LCD1602_Instruction_Com(0x80);
  404.                                                                                     // Write_LCD1602_Instruction_Data('N');
  405.                                                                                     // Write_LCD1602_Instruction_Com(0xC0);
  406.                                                                                     // for(m=0;m<8;m++)
  407.                                                                                     // {  // Write_LCD1602_Instruction_Com(0xC0+m);
  408.                                                           // Write_LCD1602_Instruction_Data(Fixed_Buf1[m]               // }   // }                }
  409.               // if(Strcmp(USART_RX_BUF,N_Now_1) == 0)
  410.               // {                // LED1(ON);
  411.                             // if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_1)==0)              // LED2(OFF);   // }
  412.               /*定時(shí)關(guān)閉1號(hào)燈*/
  413.               if(Strcmp(USART_RX_BUF,Fixed_1_Off) > 0)
  414.                             if((*Fix_Flag)&& (USART_RX_BUF[0]=='F')&& (USART_RX_BUF[1]=='1'))
  415.                                                         {    State_Flag1=1;
  416.                                                                       *Fix_Flag=0;
  417.                                                                       Fixed_Buf3[0]=USART_RX_BUF[2];
  418.                                                                       Fixed_Buf3[1]=USART_RX_BUF[3];
  419.                                                                       Fixed_Buf3[3]=USART_RX_BUF[5];
  420.                                                                       Fixed_Buf3[4]=USART_RX_BUF[6];
  421.                                                                       Fixed_Buf3[6]=USART_RX_BUF[8];
  422.                                                                       Fixed_Buf3[7]=USART_RX_BUF[9];
  423.                                                                       // if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==1)
  424.                                                                       // {  // Write_LCD1602_Instruction_Com(0x80);
  425.                                                                                     // Write_LCD1602_Instruction_Data('F');
  426.                                                                                     // for(m=0;m<8;m++)
  427.                                                                                     // {              // Write_LCD1602_Instruction_Com(0xC0+m);
  428.                             // Write_LCD1602_Instruction_Data(Fixed_Buf3[m]);                            // }   // }              }
  429.               // if(Strcmp(USART_RX_BUF,F_Now_1) == 0)
  430.               // {              // LED1(OFF);
  431.                             // if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_1)==1)               // LED2(ON);  // }
  432.               /*定時(shí)開啟2號(hào)燈*/                                         
  433.               if(Strcmp(USART_RX_BUF,Fixed_2_On) > 0)
  434.                             if((*Fix_Flag)&& (USART_RX_BUF[0]=='N')&& (USART_RX_BUF[1]=='2'))
  435.                                                         {   State_Flag2=1;
  436.                                                                       *Fix_Flag=0;
  437.                                                                       Fixed_Buf2[0]=USART_RX_BUF[2];
  438.                                                                       Fixed_Buf2[1]=USART_RX_BUF[3];
  439.                                                                       Fixed_Buf2[3]=USART_RX_BUF[5];
  440.                                                                       Fixed_Buf2[4]=USART_RX_BUF[6];
  441.                                                                       Fixed_Buf2[6]=USART_RX_BUF[8];
  442.                                                                       Fixed_Buf2[7]=USART_RX_BUF[9];
  443.                                                                       // if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==0)
  444.                                                                       // {  // Write_LCD1602_Instruction_Com(0x8f);
  445.                                                                                     // Write_LCD1602_Instruction_Data('N');
  446.                                                                                     // for(m=0;m<8;m++)
  447.                                                                                     // {   // Write_LCD1602_Instruction_Com(0xC8+m);
  448.                                                                                     //Write_LCD1602_Instruction_Data(Fixed_Buf2[m]);//    // }   }
  449.               // if(Strcmp(USART_RX_BUF,N_Now_2) == 0)
  450.               // {   // LED2(ON);
  451.                             // if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_0)==0)               // LED1(OFF);   // }
  452.               /*定時(shí)關(guān)閉2號(hào)燈*/                                         
  453.               if(Strcmp(USART_RX_BUF,Fixed_2_Off) > 0)
  454.                             if((*Fix_Flag) && (USART_RX_BUF[0]=='F')&& (USART_RX_BUF[1]=='2'))
  455.                                                         {   State_Flag2=1;
  456.                                                                       *Fix_Flag=0;
  457.                                                                       Fixed_Buf4[0]=USART_RX_BUF[2];
  458.                                                                       Fixed_Buf4[1]=USART_RX_BUF[3];
  459.                                                                       Fixed_Buf4[3]=USART_RX_BUF[5];
  460.                                                                       Fixed_Buf4[4]=USART_RX_BUF[6];
  461.                                                                       Fixed_Buf4[6]=USART_RX_BUF[8];
  462.                                                                       Fixed_Buf4[7]=USART_RX_BUF[9];
  463.                                                                       // if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)==1)
  464.                                                                       // {  // Write_LCD1602_Instruction_Com(0x8f);
  465.                                                                                     // Write_LCD1602_Instruction_Data('F');
  466.                                                                                     // for(m=0;m<8;m++)
  467.                                                                                     // {   // Write_LCD1602_Instruction_Com(0xC8+m);
  468.                                                         // Write_LCD1602_Instruction_Data(Fixed_Buf4[m]);  // }                // }              // }                                                        // if(Strcmp(USART_RX_BUF,F_Now_2) == 0)
  469.               // {                // LED2(OFF);
  470.                   // if( GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_0)==1)  // LED1(ON);   }   }
  471.               void Control(void)
  472. {    if(State_Flag1==1)
  473.                             if(Strcmp(Fixed_Buf1,Time) == 0)
  474.                                           {    LED1(ON);              //State_Flag1=0;   }
  475.               if(State_Flag1==1)
  476.                             if(Strcmp(Fixed_Buf3,Time) == 0)
  477.                                           { LED1(OFF);              //State_Flag1=0; }                                                                                   
  478.               if(State_Flag2==1)
  479.                             if(Strcmp(Fixed_Buf2,Time) == 0)
  480.                                           {              LED2(ON);              //State_Flag2=0;              }
  481. if(State_Flag2==1)
  482.                             if(Strcmp(Fixed_Buf4,Time) == 0)
  483.                                           {   LED2(OFF);              //State_Flag2=0;                            }                                          }
  484. void Control_Now(void)
  485. {    /*實(shí)時(shí)開啟關(guān)閉1號(hào)LED*/
  486.               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'))
  487.               {              Control_Flag1=0;
  488.                             Control_Flag2=0;
  489. GPIO_WriteBit(GPIOC,GPIO_Pin_6,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_6))));   }
  490.               // /*實(shí)時(shí)關(guān)閉1號(hào)LED*/
  491.               // else if(Strcmp(USART_RX_BUF,F_Now_1) == 0)
  492.               // {                // LED1(OFF);       // }
  493.               // /*實(shí)時(shí)開啟2號(hào)LED*/
  494.               // else if(Strcmp(USART_RX_BUF,N_Now_2) == 0)
  495.               // {              // LED2(ON);   // }
  496.               /*實(shí)時(shí)開啟關(guān)閉2號(hào)LED*/
  497.               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'))
  498.               {              Control_Flag1=0;                Control_Flag2=0;
  499.               GPIO_WriteBit(GPIOC,GPIO_Pin_7,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_7))));  }  }
  500. ……………………

  501. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于STM32的智能路燈控制系統(tǒng).docx (182.59 KB, 下載次數(shù): 239)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:623630 發(fā)表于 2019-10-14 09:09 | 只看該作者
我也用過stm32的單片機(jī),這個(gè)芯片是廠家做的,各功能引腳,芯片已經(jīng)定義好了,怎么畫電路圖仿真啊?
回復(fù)

使用道具 舉報(bào)

板凳
ID:628371 發(fā)表于 2020-5-10 18:04 | 只看該作者
我用51做過,這個(gè)挺好的
回復(fù)

使用道具 舉報(bào)

地板
ID:780937 發(fā)表于 2020-6-22 13:42 | 只看該作者
有仿真嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:961446 發(fā)表于 2021-8-20 09:20 | 只看該作者
你好,你這個(gè)STM32的智能路燈這個(gè)有沒有仿真圖啊
回復(fù)

使用道具 舉報(bào)

6#
ID:757488 發(fā)表于 2022-1-24 09:40 | 只看該作者
有沒有仿真圖
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线观看中文视频 | 欧美一级久久 | 欧美福利影院 | 久久久久国产精品一区二区 | 久久精品亚洲欧美日韩精品中文字幕 | 久久久人成影片免费观看 | 综合久| 日本久久一区二区三区 | 国产午夜精品一区二区三区 | 性欧美xxxx | 日韩最新网站 | 久久中文字幕电影 | 国产高清自拍视频在线观看 | caoporon| 操操操av| 成人亚洲| 九九热re| 久久久久久久久精 | 日韩免费一级 | a级片在线 | 激情亚洲| 日韩爱爱网 | 久久精品一区二区三区四区 | 日韩精品 | 欧美色性| 亚洲精品一区二区三区蜜桃久 | 欧美日韩中文字幕在线播放 | 女同久久另类99精品国产 | 亚洲 欧美 另类 综合 偷拍 | 日韩和的一区二区 | 久久tv在线观看 | 午夜国产一区 | 日韩毛片免费看 | 精品国产一区探花在线观看 | 国产91九色| 日本a级大片| 一区二区三区四区电影 | 一区二区福利视频 | 欧美 中文字幕 | 国产欧美日韩一区二区三区 | 91久久|