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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5265|回復: 0
打印 上一主題 下一主題
收起左側

基于stm32的單片機設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:338434 發(fā)表于 2018-5-25 22:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "stm32f10x.h"
#include "led.h"
#include"timer.h"
u32 time=0;//Ms級延時變量
int i;
int main(void)
{            
              LED_GPIO_Configuration();
              TIM2_Config1();
              TIM2_NVIC_Config1();
              TIM_Cmd(TIM2,ENABLE);//開啟TIM2            
while(1){
                i=0;
                Delay_MS(2000);
                            LED2(ON);LED4(ON);LED7(ON);LED10(ON);//直行燈亮
                            Delay_MS(2000);//延時
                            LED2(OFF);//直行燈滅
while(i<10)                            //黃燈閃爍
{   LED3(ON);
                Delay_MS(100);
                            LED3(OFF);
                Delay_MS(100);
                i++;
}
    LED2(OFF);LED4(OFF);LED7(OFF);LED10(OFF);//直行燈結束
                LED1(ON);LED7(ON);LED10(ON);LED5(ON);//右行燈亮
                            Delay_MS(3000);
                            LED5(OFF);//右行燈滅
i=0;
while(i<10)                           
{   LED6(ON);
                Delay_MS(100);
                            LED6(OFF);
                Delay_MS(100);
                i++;
}
    LED5(OFF);LED1(OFF);LED7(OFF);LED10(OFF);//右行燈結束
                LED1(ON);LED7(ON);LED4(ON);LED11(ON);//左行燈亮
    Delay_MS(3000);
                            LED11(OFF);//左行燈滅
i=0;
while(i<10)                           
{   LED12(ON);
                Delay_MS(100);
                            LED12(OFF);
                Delay_MS(100);
                i++;
}
    LED11(OFF);LED1(OFF);LED7(OFF);LED4(OFF);//左行燈結束
                LED1(ON);LED4(ON);LED10(ON);LED8(ON);//后行燈
    Delay_MS(3000);
                            LED1(OFF);LED4(OFF);LED10(OFF);LED8(OFF);//后行燈滅
         }

}
這是我近期單片機的課設,查閱大約資料自己做的
燕山大學
嵌入式系統課程設計報告
十字路口交通燈控制系統
學    院:里仁學院
專業(yè)班級:過控2班
姓    名:孟*坤
學    號:14*1152
時    間:2017年6月
指導教師:

摘要
隨著移動設備的流行和發(fā)展,嵌入式系統已經成為一個熱點。它并不是最近出現的新技術,只是隨著微電子技術和計算機技術的發(fā)展,微控制芯片功能越來越大,而嵌入微控制芯片的設備和系統越來越多,從而使得這種技術越來越引人注目。它對軟硬件的體積大小、成本、功耗和可靠性都提出了嚴格的要求。嵌入式系統的功能越來越強大,實現也越來越復雜,隨之出現的就是可靠性大大降低。最近的一種趨勢是一個功能強大的嵌入式系統通常需要一種操作系統來給予支持,這種操作系統是已經成熟并且穩(wěn)定的,可以是嵌入式的Linux,WINCE等等。本文所要研究的就是基于ARM嵌入式系統的交通燈系統的設計與實現。本設計采用了ARM32位的Cortex-M3 CPU的內核的STM32作為核心處理器。
    關鍵詞:嵌入式  交通燈 STM32f103  ARM
Abstract
        With the popularity and development of mobile devices, embedded system has become a hotspot. It is not a new technique appeared recently, only with the development of microelectronics and computer technology, micro chip control functions more and more, more and more equipment and systems and embedded micro control chip, making the technology more attract sb.'s attention. Hardware and software of its size, cost, power consumption and reliability have made stringent requirements. The function of embedded system is more and more powerful, and more and more complicated, the reliability appears is greatly reduced. A recent trend is a powerful embedded systems usually require an operating system to support, the operating system is already mature and stable, can be embedded Linux, WINCE and so on. This paper is to study the design and Realization of the traffic light system based on ARM embedded system. This design uses the ARM32 bit Cortex-M3 CPU kernel STM32 as the core processor.
        Keywords:  embedded   STM32f103    traffic lights    ARM
目 錄
一 引言
二 相關內容和原理              1
三 作品設計要求              1
四 作品方案設計              2
4.1              設計思路              2
4.2              總體設計框圖              3
4.3              總體方案設計參數計算              4
五  系統硬件電路設計及分析              4
5.1              STM32f103芯片介紹及選用              4
5.2              單片機電路原理圖及分析              4
5.3              電源電路模塊原理圖及分析              5
5.4              晶振與復位電路模塊原理圖              5
5.5              LED交通燈電路原理圖及分析              6
六 系統軟件設計及其分析              7
6.1              軟件設計流程圖              8
6.2              ARM交通燈控制軟件設計              8
七 系統軟件代碼              9
   7.1 軟件設計流程圖………………………………………………… ………………………9
   7.2 部分程序代碼……………………………………………………………………………10
八 Keil軟件的運用與調試……………………… ……………………………………………16
九 實物演示照片…………………………………………………………………………………17
十 作品電路的PCB圖……………………………………………………………………… …19
十一 設計心得及體會……………………………………………………………………………20
十二 參考文獻…………………………… …………… ………………………………………21


1引言
交通信號燈指揮著人和各種車輛的安全運行,實現紅、黃、綠燈的自動指揮是城鄉(xiāng)交通管理現代化的重要課題。在城鄉(xiāng)街道的十字交叉路口,為了保證交通秩序和行人安全,一般在每條道路上各有一組紅、黃、綠交通信號燈,其中紅燈亮,表示該條道路禁止通行; 黃燈亮,表示該條道路上未過停車線的車輛停止通行,已過停車線的車輛繼續(xù)通行;綠燈亮,表示該條道路允許通行。交通燈控制電路自動控制十字路口兩組紅、黃、綠交通燈的狀態(tài)轉換,指揮各種車輛和行人安全通行,實現十字路口城鄉(xiāng)交通管理自動化。
    本文為了實現交通道路的管理,力求交通管理先進性、科學化。 分析應用了單片機實現智能交通燈管制的控制系統,以及該系統軟、硬件設計方法,實驗證明該系統實現簡單、經濟,能夠有效地疏導交通,提高交通路口的通行能力。
2  相關內容及原理
通過設計,培養(yǎng)自己綜合運用所學知識、獨立分析和解決實際問題的能力,培養(yǎng)創(chuàng)新意識和創(chuàng)新能力,并獲得科學研究的基礎訓練,加深對ARM芯片的了解;熟悉ARM芯片各個引腳的功能,工作方式,計數/定時,I/O口,中斷等相關原理,鞏固學習嵌入式的相關內容知識。
利用ARM芯片模擬實現交通燈控制,自行選擇所需ARM芯片,查閱相關文獻資料,熟悉所選ARM芯片,了解所選ARM芯片各個引腳功能,工作方式,計數/定時,I/O口,中斷等相關原理,通過軟硬件設計實現利用ARM芯片完成交通燈的模擬控制。
3  作品設計要求
要求基于Cortex系列單片機設計一具有模擬道路路口交通燈相應功能的交通燈模擬系統。具體要求如下:
(1)具有三種顏色顯示:紅色、綠色和黃色,分別代表路口交通燈的三種顏色。
    (2)所設計的系統應至少能夠模擬兩個路口的功能,具有直行和左轉的功能。
     (3)如果能力和時間允許,可以加入操作系統。
     (4)適當加入一些其他元素,使其更加具有人性化設計。

4 作品方案設計4.1 設計思路
利用STM32F103芯片實現單路交通燈的控制: a 實現紅、綠、黃燈的循環(huán)控制。使用紅、黃、綠三種不同顏色的LED燈實現此功能,主干道正前方方向的LED燈,編號分別為1、2、3,分別接在單片機的PB8、PB6、PB9的引腳上;主干道右方的LED燈,編號分別為4、5、6,分別接在單片機的PA14、PA10、PA8的引腳上;主干道后側的LED燈,編號分別為7、8、9,分別接在單片機的PD10、PD12、PD14引腳上。主干道左方的LED燈,編號分別為10、11、12,分別接在單片機的PE7、PE11、PE15引腳上。以此實現四個路口的交通燈模擬系統。用軟件控制燈的亮與滅來控制車輛和行人的通行。
交通路口示意圖如圖4.1車輛遇到紅燈停綠燈行的行走情況,紅綠燈時間均為2000ms,切換時間為2000ms,最后2000ms為黃燈閃爍。

                圖4.1  交通路口示意圖
4.2 總體設計框圖
用ARM系列芯片STM32F103作為系統的主控芯片,控制交通燈的循環(huán)點亮并顯示燈亮時間(采用倒計時顯示),當定時時間到的時候通過燈的狀態(tài)來提醒人們注意紅綠燈的狀態(tài)。

圖4.2  交通燈總體設計框圖

5 硬件電路模塊設計及其分析
根據設計任務要求,自行選擇電子元件,畫出電氣原理圖,并調試。一個完整的系統除了主控芯片以外,還需配上電源系統、時鐘電路、復位電路等。獨立的芯片是不能工作的。
5.1  STM32F103芯片介紹
     STM32F103是基于一個支持實時仿真和嵌入式跟蹤的32 位 CPU 的微控制器,STM32F1系列屬于中低端的32位ARM微控制器,該系列芯片是意法半導體(ST)公司出品,其內核是Cortex-M3。該系列芯片按片內Flash的大小可分為三大類:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定時器,CAN,ADC,SPI,I2C,USB,UART,等多種功能。
具有以下一些特性:
         ARM 32位的Cortex-M3
         最高72MHz工作頻率,在存儲器的0等待周期訪問時可達1.25DMips/MHZ(DhrystONe2.1),從32K到512K字節(jié)的閃存程序存儲器,最大64K字節(jié)SRAM
         2.0-3.6V供電和I/O引腳
         上電/斷電復位(POR/PDR)、可編程電壓監(jiān)測器(PVD)
         4-16MHZ晶振振蕩器
         內嵌經出廠調教的8MHz的RC振蕩器
         2個12位模數轉換器,1us轉換時間(多達16個輸入通道),轉換范圍:0至3.6V,雙采樣和保持功能
         2個DMA控制器,共12個DMA通道:DMA1有7個通道,DMA2有5個通道
         片內晶振頻率范圍:1~30 MHz。
         通過片內PLL可實現最大為60MHz的CPU操作頻率,PLL的穩(wěn)定時間
為100us
         支持的外設:定時器、ADC、SPI、USB、IIC和UART
         多達112個快速I/O端口(僅Z系列有超過100個引腳)
         3個16位定時器,每個定時器有多達4個用于輸入捕獲/輸出比較/PWM或脈沖計數的通道和增量編碼器輸入
         1個16位帶死區(qū)控制和緊急剎車,用于電機控制的PWM高級控制定時器
         ECOPACK封裝
5.2  STM32F103主電路原理圖
圖5.1為STM32F103芯片的原理圖,多達100個引腳,采用3.3V或者5V電源供電,設計所需外接器件的網絡名已經標出。

圖5.1  STM32F103芯片的原理圖

5.3  系統電源電路設計
本電源運用5V的直流電源(圖5.2所示)。通過LM78系列芯片將5V電壓轉換為電壓,為STM32F103芯片供電,STM32F103芯片所能承受的電壓范圍是2V~3.6V。

     圖5.2  直流電源電路設計
5.4  晶振與復位電路模塊
系統的晶振電路如圖5.4所示STM32f103芯片采用8MHz的晶振作為振蕩時鐘源,外部是倍頻72MHz晶振。通過對芯片的進行軟件設計可以將晶體振蕩器的頻率分頻為所需的頻率;系統的復位電路如圖5.5所示,STM32F103芯片的14號引腳連接到主控芯片的復位引腳(nRST)上,按下復位鍵S2時,系統將會復位到初始的狀態(tài)。

  圖5.4 系統的晶振電路圖                                         圖5.5 系統的復位電路圖
5.5  LED循環(huán)顯示設計
    由南向北和由北向南車道各用一組紅、綠、黃三色的指示燈,左右兩側也是各三個燈,指揮車輛通行。綠燈是通行信號,面對綠燈的車輛可以直行,紅燈是禁止通行信號,面對紅燈的車輛必須在路口的停車線后停車。黃燈是警告信號,面對黃燈的車輛不能越過停車線,但車輛已十分接近停車線而不能安全停車時可以繼續(xù)行進。具體紅綠燈時間分配時間如表5.1所示。
表5—1:紅綠燈時間分配時間如表
        1000ms        1000ms        1000ms        1000ms        1000ms        1000ms
主干通道        綠燈亮        黃燈閃        紅燈亮        黃燈閃        紅燈亮        黃燈閃
左右道路        紅燈亮        紅燈亮        綠燈亮        綠燈亮        紅燈亮        紅燈亮
    上表說明主干通道綠燈亮、黃燈閃時人行道都是紅燈亮,只有車道
紅燈亮(車輛完全停下來)時人行道綠燈才亮,這樣保證了過馬路的行人人身安全,避免了不必要的交通事故。硬件電路連接圖如圖5.6所示

圖5.6  硬件電路連接圖
交通燈LED的發(fā)光和熄滅的控制,是通過控制GPIO寄存器組來完成的,須先將引腳PA、PB、PD、PE等通過引腳功能選擇寄存器PINSEL1,設置為GPIO方式;再設置GPIO方向寄存器1(IO1DIR),對應的引腳設置為輸出方向。要點亮LED1~LED12需要使用GPIO清零寄存器1(IO1CLR)的對應位設置為1,即在引腳PA、PB、PD、PE上加邏輯低電平,即可點亮這些燈。與之相反,要熄滅這些燈,則要用GPIO輸出置位寄存器1(IO1SET)將對應的位置位即可。
6 系統軟件設計及其分析6.1  軟件設計流程圖
圖6.1為ARM模擬交通燈控制程序流程圖,主程序主要完成倒計時顯示及控制蜂鳴器,中斷服務程序主要控制那些燈亮以及亮的時間。

圖6.1  ARM模擬交通燈控制程序流程圖

6.2   ARM交通燈模擬控制程序設計
定時器控制原理:定時器對外設時鐘Fpclk周期進行計數,根據4個匹配寄存器的設定可設置為匹配(即達到匹配寄存器指定的定時值)時產生中斷或執(zhí)行其他操作。
設置P0、P1口為GPIO輸出狀態(tài),初始化定時器,選定定時器0中斷為向量IRQ,對VICIntEnable、VICIntSelect、VICvectCntl進行設置,初始化SPI接口,根據設計要求編寫軟件程序。根據事先畫好的程序流程圖,用C語言編寫程序,在主程序中對需要用到的I/O口進行定義,并設置相應的I/O口,比如要求P1。18~P1。25引腳為GPIO功能,則通過對引腳功能選擇 寄存器PINSEL1將對應的引腳設置為GPIO方式并設置GPIO方向,在GPIO方向寄存器IO1DIR里設置,之后對定時器0進行初始化,并開相應的中斷。然后進入大循環(huán)進行倒計時顯示、控制蜂鳴器的蜂鳴與否并判斷flag是否加到設定值,對flag加到設定值后進行清零,讓flag重新計數。中斷服務程序的設計,每隔一秒鐘定時器中斷一次,每中斷一次flag加1根據LED點亮的先后順序以及點亮的時間,分別編寫相應的程序。
7  系統軟件代碼7.1   軟件設計流程圖



圖7.1  軟件設計流程圖

7.2   系統軟件代碼
主程序部分:
#include "stm32f10x.h"
#include "led.h"
#include"timer.h"
u32 time=0;//Ms級延時變量
int i;
int main(void)
{            
              LED_GPIO_Configuration();
              TIM2_Config1();
              TIM2_NVIC_Config1();
              TIM_Cmd(TIM2,ENABLE);//開啟TIM2            
while(1){
                i=0;
                Delay_MS(2000);
                            LED2(ON);LED4(ON);LED7(ON);LED10(ON);//直行燈亮
                            Delay_MS(2000);//延時
                            LED2(OFF);//直行燈滅
while(i<10)                            //黃燈閃爍
{   LED3(ON);
                Delay_MS(100);
                            LED3(OFF);
                Delay_MS(100);
                i++;
}
    LED2(OFF);LED4(OFF);LED7(OFF);LED10(OFF);//直行燈結束
                LED1(ON);LED7(ON);LED10(ON);LED5(ON);//右行燈亮
                            Delay_MS(3000);
                            LED5(OFF);//右行燈滅
i=0;
while(i<10)                           
{   LED6(ON);
                Delay_MS(100);
                            LED6(OFF);
                Delay_MS(100);
                i++;
}
    LED5(OFF);LED1(OFF);LED7(OFF);LED10(OFF);//右行燈結束
                LED1(ON);LED7(ON);LED4(ON);LED11(ON);//左行燈亮
    Delay_MS(3000);
                            LED11(OFF);//左行燈滅
i=0;
while(i<10)                           
{   LED12(ON);
                Delay_MS(100);
                            LED12(OFF);
                Delay_MS(100);
                i++;
}
    LED11(OFF);LED1(OFF);LED7(OFF);LED4(OFF);//左行燈結束
                LED1(ON);LED4(ON);LED10(ON);LED8(ON);//后行燈
    Delay_MS(3000);
                            LED1(OFF);LED4(OFF);LED10(OFF);LED8(OFF);//后行燈滅
         }

}
底層寄存器配置部分:
void LED_GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   /*開啟GPIOC&GPIOE的時鐘 */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
   /* Configure PB.04, PB.06 and PB.08*/   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_8 ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
   /* Configure PA.08, PA.10 and PA.12 */
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12 ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

                 /* Configure PD.10, PD.12 and PD.08 */   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_12 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOD, &GPIO_InitStructure);

                 /* Configure PE.07, PE.11 and PE.15 */   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOE, &GPIO_InitStructure);
                LED1(OFF);LED2(OFF);LED3(OFF);LED4(OFF);LED5(OFF);LED6(OFF);LED7(OFF);LED8(OFF);LED9(OFF);LED10(OFF);LED11(OFF);LED12(OFF);
內聯函數定義LED函數部分:
#ifndef _LED_H
#define _LED_H
#include"stm32f10x.h"
#define              ON  0
#define OFF 1
/***************內聯函數定義LED函數****************/
#define LED1(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_8);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define LED4(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_12);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_12)
#define LED7(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_10);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_10)
#define LED10(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_15);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define LED2(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_6);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define LED5(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_10);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_10)
#define LED8(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_12);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_12)
#define LED11(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_11);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_11)                                       
#define LED3(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_9);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define LED6(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_8);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_8)
#define LED9(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_15);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_15)
#define LED12(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_7);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_7)                                                                    
void               LED_GPIO_Configuration(void);
#endif
這是我近期單片機的課設,查閱大約資料自己做的
燕山大學
嵌入式系統課程設計報告
十字路口交通燈控制系統
學    院:里仁學院
專業(yè)班級:過控2班
姓    名:孟*坤
學    號:14*1152
時    間:2017年6月
指導教師:

摘要
隨著移動設備的流行和發(fā)展,嵌入式系統已經成為一個熱點。它并不是最近出現的新技術,只是隨著微電子技術和計算機技術的發(fā)展,微控制芯片功能越來越大,而嵌入微控制芯片的設備和系統越來越多,從而使得這種技術越來越引人注目。它對軟硬件的體積大小、成本、功耗和可靠性都提出了嚴格的要求。嵌入式系統的功能越來越強大,實現也越來越復雜,隨之出現的就是可靠性大大降低。最近的一種趨勢是一個功能強大的嵌入式系統通常需要一種操作系統來給予支持,這種操作系統是已經成熟并且穩(wěn)定的,可以是嵌入式的Linux,WINCE等等。本文所要研究的就是基于ARM嵌入式系統的交通燈系統的設計與實現。本設計采用了ARM32位的Cortex-M3 CPU的內核的STM32作為核心處理器。
    關鍵詞:嵌入式  交通燈 STM32f103  ARM
Abstract
        With the popularity and development of mobile devices, embedded system has become a hotspot. It is not a new technique appeared recently, only with the development of microelectronics and computer technology, micro chip control functions more and more, more and more equipment and systems and embedded micro control chip, making the technology more attract sb.'s attention. Hardware and software of its size, cost, power consumption and reliability have made stringent requirements. The function of embedded system is more and more powerful, and more and more complicated, the reliability appears is greatly reduced. A recent trend is a powerful embedded systems usually require an operating system to support, the operating system is already mature and stable, can be embedded Linux, WINCE and so on. This paper is to study the design and Realization of the traffic light system based on ARM embedded system. This design uses the ARM32 bit Cortex-M3 CPU kernel STM32 as the core processor.
        Keywords:  embedded   STM32f103    traffic lights    ARM
目 錄
一 引言
二 相關內容和原理              1
三 作品設計要求              1
四 作品方案設計              2
4.1              設計思路              2
4.2              總體設計框圖              3
4.3              總體方案設計參數計算              4
五  系統硬件電路設計及分析              4
5.1              STM32f103芯片介紹及選用              4
5.2              單片機電路原理圖及分析              4
5.3              電源電路模塊原理圖及分析              5
5.4              晶振與復位電路模塊原理圖              5
5.5              LED交通燈電路原理圖及分析              6
六 系統軟件設計及其分析              7
6.1              軟件設計流程圖              8
6.2              ARM交通燈控制軟件設計              8
七 系統軟件代碼              9
   7.1 軟件設計流程圖………………………………………………… ………………………9
   7.2 部分程序代碼……………………………………………………………………………10
八 Keil軟件的運用與調試……………………… ……………………………………………16
九 實物演示照片…………………………………………………………………………………17
十 作品電路的PCB圖……………………………………………………………………… …19
十一 設計心得及體會……………………………………………………………………………20
十二 參考文獻…………………………… …………… ………………………………………21


1引言
交通信號燈指揮著人和各種車輛的安全運行,實現紅、黃、綠燈的自動指揮是城鄉(xiāng)交通管理現代化的重要課題。在城鄉(xiāng)街道的十字交叉路口,為了保證交通秩序和行人安全,一般在每條道路上各有一組紅、黃、綠交通信號燈,其中紅燈亮,表示該條道路禁止通行; 黃燈亮,表示該條道路上未過停車線的車輛停止通行,已過停車線的車輛繼續(xù)通行;綠燈亮,表示該條道路允許通行。交通燈控制電路自動控制十字路口兩組紅、黃、綠交通燈的狀態(tài)轉換,指揮各種車輛和行人安全通行,實現十字路口城鄉(xiāng)交通管理自動化。
    本文為了實現交通道路的管理,力求交通管理先進性、科學化。 分析應用了單片機實現智能交通燈管制的控制系統,以及該系統軟、硬件設計方法,實驗證明該系統實現簡單、經濟,能夠有效地疏導交通,提高交通路口的通行能力。
2  相關內容及原理
通過設計,培養(yǎng)自己綜合運用所學知識、獨立分析和解決實際問題的能力,培養(yǎng)創(chuàng)新意識和創(chuàng)新能力,并獲得科學研究的基礎訓練,加深對ARM芯片的了解;熟悉ARM芯片各個引腳的功能,工作方式,計數/定時,I/O口,中斷等相關原理,鞏固學習嵌入式的相關內容知識。
利用ARM芯片模擬實現交通燈控制,自行選擇所需ARM芯片,查閱相關文獻資料,熟悉所選ARM芯片,了解所選ARM芯片各個引腳功能,工作方式,計數/定時,I/O口,中斷等相關原理,通過軟硬件設計實現利用ARM芯片完成交通燈的模擬控制。
3  作品設計要求
要求基于Cortex系列單片機設計一具有模擬道路路口交通燈相應功能的交通燈模擬系統。具體要求如下:
(1)具有三種顏色顯示:紅色、綠色和黃色,分別代表路口交通燈的三種顏色。
    (2)所設計的系統應至少能夠模擬兩個路口的功能,具有直行和左轉的功能。
     (3)如果能力和時間允許,可以加入操作系統。
     (4)適當加入一些其他元素,使其更加具有人性化設計。

4 作品方案設計4.1 設計思路
利用STM32F103芯片實現單路交通燈的控制: a 實現紅、綠、黃燈的循環(huán)控制。使用紅、黃、綠三種不同顏色的LED燈實現此功能,主干道正前方方向的LED燈,編號分別為1、2、3,分別接在單片機的PB8、PB6、PB9的引腳上;主干道右方的LED燈,編號分別為4、5、6,分別接在單片機的PA14、PA10、PA8的引腳上;主干道后側的LED燈,編號分別為7、8、9,分別接在單片機的PD10、PD12、PD14引腳上。主干道左方的LED燈,編號分別為10、11、12,分別接在單片機的PE7、PE11、PE15引腳上。以此實現四個路口的交通燈模擬系統。用軟件控制燈的亮與滅來控制車輛和行人的通行。
交通路口示意圖如圖4.1車輛遇到紅燈停綠燈行的行走情況,紅綠燈時間均為2000ms,切換時間為2000ms,最后2000ms為黃燈閃爍。

                圖4.1  交通路口示意圖
4.2 總體設計框圖
用ARM系列芯片STM32F103作為系統的主控芯片,控制交通燈的循環(huán)點亮并顯示燈亮時間(采用倒計時顯示),當定時時間到的時候通過燈的狀態(tài)來提醒人們注意紅綠燈的狀態(tài)。

圖4.2  交通燈總體設計框圖

5 硬件電路模塊設計及其分析
根據設計任務要求,自行選擇電子元件,畫出電氣原理圖,并調試。一個完整的系統除了主控芯片以外,還需配上電源系統、時鐘電路、復位電路等。獨立的芯片是不能工作的。
5.1  STM32F103芯片介紹
     STM32F103是基于一個支持實時仿真和嵌入式跟蹤的32 位 CPU 的微控制器,STM32F1系列屬于中低端的32位ARM微控制器,該系列芯片是意法半導體(ST)公司出品,其內核是Cortex-M3。該系列芯片按片內Flash的大小可分為三大類:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定時器,CAN,ADC,SPI,I2C,USB,UART,等多種功能。
具有以下一些特性:
         ARM 32位的Cortex-M3
         最高72MHz工作頻率,在存儲器的0等待周期訪問時可達1.25DMips/MHZ(DhrystONe2.1),從32K到512K字節(jié)的閃存程序存儲器,最大64K字節(jié)SRAM
         2.0-3.6V供電和I/O引腳
         上電/斷電復位(POR/PDR)、可編程電壓監(jiān)測器(PVD)
         4-16MHZ晶振振蕩器
         內嵌經出廠調教的8MHz的RC振蕩器
         2個12位模數轉換器,1us轉換時間(多達16個輸入通道),轉換范圍:0至3.6V,雙采樣和保持功能
         2個DMA控制器,共12個DMA通道:DMA1有7個通道,DMA2有5個通道
         片內晶振頻率范圍:1~30 MHz。
         通過片內PLL可實現最大為60MHz的CPU操作頻率,PLL的穩(wěn)定時間
為100us
         支持的外設:定時器、ADC、SPI、USB、IIC和UART
         多達112個快速I/O端口(僅Z系列有超過100個引腳)
         3個16位定時器,每個定時器有多達4個用于輸入捕獲/輸出比較/PWM或脈沖計數的通道和增量編碼器輸入
         1個16位帶死區(qū)控制和緊急剎車,用于電機控制的PWM高級控制定時器
         ECOPACK封裝
5.2  STM32F103主電路原理圖
圖5.1為STM32F103芯片的原理圖,多達100個引腳,采用3.3V或者5V電源供電,設計所需外接器件的網絡名已經標出。

圖5.1  STM32F103芯片的原理圖

5.3  系統電源電路設計
本電源運用5V的直流電源(圖5.2所示)。通過LM78系列芯片將5V電壓轉換為電壓,為STM32F103芯片供電,STM32F103芯片所能承受的電壓范圍是2V~3.6V。

     圖5.2  直流電源電路設計
5.4  晶振與復位電路模塊
系統的晶振電路如圖5.4所示STM32f103芯片采用8MHz的晶振作為振蕩時鐘源,外部是倍頻72MHz晶振。通過對芯片的進行軟件設計可以將晶體振蕩器的頻率分頻為所需的頻率;系統的復位電路如圖5.5所示,STM32F103芯片的14號引腳連接到主控芯片的復位引腳(nRST)上,按下復位鍵S2時,系統將會復位到初始的狀態(tài)。

  圖5.4 系統的晶振電路圖                                         圖5.5 系統的復位電路圖
5.5  LED循環(huán)顯示設計
    由南向北和由北向南車道各用一組紅、綠、黃三色的指示燈,左右兩側也是各三個燈,指揮車輛通行。綠燈是通行信號,面對綠燈的車輛可以直行,紅燈是禁止通行信號,面對紅燈的車輛必須在路口的停車線后停車。黃燈是警告信號,面對黃燈的車輛不能越過停車線,但車輛已十分接近停車線而不能安全停車時可以繼續(xù)行進。具體紅綠燈時間分配時間如表5.1所示。
表5—1:紅綠燈時間分配時間如表
        1000ms        1000ms        1000ms        1000ms        1000ms        1000ms
主干通道        綠燈亮        黃燈閃        紅燈亮        黃燈閃        紅燈亮        黃燈閃
左右道路        紅燈亮        紅燈亮        綠燈亮        綠燈亮        紅燈亮        紅燈亮
    上表說明主干通道綠燈亮、黃燈閃時人行道都是紅燈亮,只有車道
紅燈亮(車輛完全停下來)時人行道綠燈才亮,這樣保證了過馬路的行人人身安全,避免了不必要的交通事故。硬件電路連接圖如圖5.6所示

圖5.6  硬件電路連接圖
交通燈LED的發(fā)光和熄滅的控制,是通過控制GPIO寄存器組來完成的,須先將引腳PA、PB、PD、PE等通過引腳功能選擇寄存器PINSEL1,設置為GPIO方式;再設置GPIO方向寄存器1(IO1DIR),對應的引腳設置為輸出方向。要點亮LED1~LED12需要使用GPIO清零寄存器1(IO1CLR)的對應位設置為1,即在引腳PA、PB、PD、PE上加邏輯低電平,即可點亮這些燈。與之相反,要熄滅這些燈,則要用GPIO輸出置位寄存器1(IO1SET)將對應的位置位即可。
6 系統軟件設計及其分析6.1  軟件設計流程圖
圖6.1為ARM模擬交通燈控制程序流程圖,主程序主要完成倒計時顯示及控制蜂鳴器,中斷服務程序主要控制那些燈亮以及亮的時間。

圖6.1  ARM模擬交通燈控制程序流程圖

6.2   ARM交通燈模擬控制程序設計
定時器控制原理:定時器對外設時鐘Fpclk周期進行計數,根據4個匹配寄存器的設定可設置為匹配(即達到匹配寄存器指定的定時值)時產生中斷或執(zhí)行其他操作。
設置P0、P1口為GPIO輸出狀態(tài),初始化定時器,選定定時器0中斷為向量IRQ,對VICIntEnable、VICIntSelect、VICvectCntl進行設置,初始化SPI接口,根據設計要求編寫軟件程序。根據事先畫好的程序流程圖,用C語言編寫程序,在主程序中對需要用到的I/O口進行定義,并設置相應的I/O口,比如要求P1。18~P1。25引腳為GPIO功能,則通過對引腳功能選擇 寄存器PINSEL1將對應的引腳設置為GPIO方式并設置GPIO方向,在GPIO方向寄存器IO1DIR里設置,之后對定時器0進行初始化,并開相應的中斷。然后進入大循環(huán)進行倒計時顯示、控制蜂鳴器的蜂鳴與否并判斷flag是否加到設定值,對flag加到設定值后進行清零,讓flag重新計數。中斷服務程序的設計,每隔一秒鐘定時器中斷一次,每中斷一次flag加1根據LED點亮的先后順序以及點亮的時間,分別編寫相應的程序。
7  系統軟件代碼7.1   軟件設計流程圖



圖7.1  軟件設計流程圖

7.2   系統軟件代碼
主程序部分:
#include "stm32f10x.h"
#include "led.h"
#include"timer.h"
u32 time=0;//Ms級延時變量
int i;
int main(void)
{            
              LED_GPIO_Configuration();
              TIM2_Config1();
              TIM2_NVIC_Config1();
              TIM_Cmd(TIM2,ENABLE);//開啟TIM2            
while(1){
                i=0;
                Delay_MS(2000);
                            LED2(ON);LED4(ON);LED7(ON);LED10(ON);//直行燈亮
                            Delay_MS(2000);//延時
                            LED2(OFF);//直行燈滅
while(i<10)                            //黃燈閃爍
{   LED3(ON);
                Delay_MS(100);
                            LED3(OFF);
                Delay_MS(100);
                i++;
}
    LED2(OFF);LED4(OFF);LED7(OFF);LED10(OFF);//直行燈結束
                LED1(ON);LED7(ON);LED10(ON);LED5(ON);//右行燈亮
                            Delay_MS(3000);
                            LED5(OFF);//右行燈滅
i=0;
while(i<10)                           
{   LED6(ON);
                Delay_MS(100);
                            LED6(OFF);
                Delay_MS(100);
                i++;
}
    LED5(OFF);LED1(OFF);LED7(OFF);LED10(OFF);//右行燈結束
                LED1(ON);LED7(ON);LED4(ON);LED11(ON);//左行燈亮
    Delay_MS(3000);
                            LED11(OFF);//左行燈滅
i=0;
while(i<10)                           
{   LED12(ON);
                Delay_MS(100);
                            LED12(OFF);
                Delay_MS(100);
                i++;
}
    LED11(OFF);LED1(OFF);LED7(OFF);LED4(OFF);//左行燈結束
                LED1(ON);LED4(ON);LED10(ON);LED8(ON);//后行燈
    Delay_MS(3000);
                            LED1(OFF);LED4(OFF);LED10(OFF);LED8(OFF);//后行燈滅
         }

}
底層寄存器配置部分:
void LED_GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   /*開啟GPIOC&GPIOE的時鐘 */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
   /* Configure PB.04, PB.06 and PB.08*/   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_8 ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
   /* Configure PA.08, PA.10 and PA.12 */
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12 ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

                 /* Configure PD.10, PD.12 and PD.08 */   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_12 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOD, &GPIO_InitStructure);

                 /* Configure PE.07, PE.11 and PE.15 */   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//輸出上拉
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOE, &GPIO_InitStructure);
                LED1(OFF);LED2(OFF);LED3(OFF);LED4(OFF);LED5(OFF);LED6(OFF);LED7(OFF);LED8(OFF);LED9(OFF);LED10(OFF);LED11(OFF);LED12(OFF);
內聯函數定義LED函數部分:
#ifndef _LED_H
#define _LED_H
#include"stm32f10x.h"
#define              ON  0
#define OFF 1
/***************內聯函數定義LED函數****************/
#define LED1(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_8);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define LED4(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_12);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_12)
#define LED7(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_10);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_10)
#define LED10(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_15);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define LED2(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_6);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define LED5(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_10);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_10)
#define LED8(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_12);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_12)
#define LED11(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_11);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_11)                                       
#define LED3(a)              if (a)              
                                                                      GPIO_SetBits(GPIOB,GPIO_Pin_9);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define LED6(a)              if (a)              
                                                                      GPIO_SetBits(GPIOA,GPIO_Pin_8);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOA,GPIO_Pin_8)
#define LED9(a)              if (a)              
                                                                      GPIO_SetBits(GPIOD,GPIO_Pin_15);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOD,GPIO_Pin_15)
#define LED12(a)              if (a)              
                                                                      GPIO_SetBits(GPIOE,GPIO_Pin_7);
                                                                      else                           
                                                                      GPIO_ResetBits(GPIOE,GPIO_Pin_7)                                                                    
void               LED_GPIO_Configuration(void);
#endif

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久久久 | 99精品久久 | 亚洲天堂av一区 | 色婷婷综合久久久中文字幕 | 在线中文字幕亚洲 | 精品1区2区3区4区 | 国产一级毛片精品完整视频版 | 亚洲福利网 | 国产一区亚洲 | 国产69精品久久久久777 | 一区二区三区四区视频 | 日韩欧美一区二区三区免费观看 | 丝袜一区二区三区 | 亚洲一区二区三区视频 | 久久精品亚洲一区 | 国产成人亚洲精品 | 成人性视频免费网站 | 亚洲精品福利视频 | 国产香蕉视频 | 久久国内精品 | 精品国产久 | 精品国产乱码久久久久久牛牛 | 操人视频在线观看 | 日韩久久久久 | 成人av网站在线观看 | 国产在线中文字幕 | 久久精品亚洲成在人线av网址 | 亚州视频在线 | 亚洲国产欧美精品 | 国产高清在线精品一区二区三区 | 91精品国产色综合久久 | 欧美影院久久 | 免费黄色成人 | 激情的网站 | 成人精品区 | 欧美视频网 | 久久新视频 | 看av网址 | 久久久.com| 性一交一乱一透一a级 | 欧美成人免费电影 |