#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);//后行灯灭
}
}
这是我近期单片机的课设,查阅大约资料自己做的
燕山大学
嵌入式系统课程设计报告
十字路口交通灯控制系统
学 院:里仁学院
专业班级:过控2班
姓 名:孟*坤
学 号:14*1152
时 间:2017年6月
指导教师:
摘要
随着移动设备的流行和发展,嵌入式系统已经成为一个热点。它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。最近的一种趋势是一个功能强大的嵌入式系统通常需要一种操作系统来给予支持,这种操作系统是已经成熟并且稳定的,可以是嵌入式的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引言
交通信号灯指挥着人和各种车辆的安全运行,实现红、黄、绿灯的自动指挥是城乡交通管理现代化的重要课题。在城乡街道的十字交叉路口,为了保证交通秩序和行人安全,一般在每条道路上各有一组红、黄、绿交通信号灯,其中红灯亮,表示该条道路禁止通行; 黄灯亮,表示该条道路上未过停车线的车辆停止通行,已过停车线的车辆继续通行;绿灯亮,表示该条道路允许通行。交通灯控制电路自动控制十字路口两组红、黄、绿交通灯的状态转换,指挥各种车辆和行人安全通行,实现十字路口城乡交通管理自动化。
本文为了实现交通道路的管理,力求交通管理先进性、科学化。 分析应用了单片机实现智能交通灯管制的控制系统,以及该系统软、硬件设计方法,实验证明该系统实现简单、经济,能够有效地疏导交通,提高交通路口的通行能力。
2 相关内容及原理
通过设计,培养自己综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。
利用ARM芯片模拟实现交通灯控制,自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片,了解所选ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制。
3 作品设计要求
要求基于Cortex系列单片机设计一具有模拟道路路口交通灯相应功能的交通灯模拟系统。具体要求如下:
(1)具有三种颜色显示:红色、绿色和黄色,分别代表路口交通灯的三种颜色。
(2)所设计的系统应至少能够模拟两个路口的功能,具有直行和左转的功能。
(3)如果能力和时间允许,可以加入操作系统。
(4)适当加入一些其他元素,使其更加具有人性化设计。
4 作品方案设计4.1 设计思路
利用STM32F103芯片实现单路交通灯的控制: a 实现红、绿、黄灯的循环控制。使用红、黄、绿三种不同颜色的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作为系统的主控芯片,控制交通灯的循环点亮并显示灯亮时间(采用倒计时显示),当定时时间到的时候通过灯的状态来提醒人们注意红绿灯的状态。
图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字节的闪存程序存储器,最大64K字节SRAM
2.0-3.6V供电和I/O引脚
上电/断电复位(POR/PDR)、可编程电压监测器(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的稳定时间
为100us
支持的外设:定时器、ADC、SPI、USB、IIC和UART
多达112个快速I/O端口(仅Z系列有超过100个引脚)
3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
1个16位带死区控制和紧急刹车,用于电机控制的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时,系统将会复位到初始的状态。
图5.4 系统的晶振电路图 图5.5 系统的复位电路图
5.5 LED循环显示设计
由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,左右两侧也是各三个灯,指挥车辆通行。绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。具体红绿灯时间分配时间如表5.1所示。
表5—1:红绿灯时间分配时间如表
1000ms 1000ms 1000ms 1000ms 1000ms 1000ms
主干通道 绿灯亮 黄灯闪 红灯亮 黄灯闪 红灯亮 黄灯闪
左右道路 红灯亮 红灯亮 绿灯亮 绿灯亮 红灯亮 红灯亮
上表说明主干通道绿灯亮、黄灯闪时人行道都是红灯亮,只有车道
红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。硬件电路连接图如图5.6所示
图5.6 硬件电路连接图
交通灯LED的发光和熄灭的控制,是通过控制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个匹配寄存器的设定可设置为匹配(即达到匹配寄存器指定的定时值)时产生中断或执行其他操作。
设置P0、P1口为GPIO输出状态,初始化定时器,选定定时器0中断为向量IRQ,对VICIntEnable、VICIntSelect、VICvectCntl进行设置,初始化SPI接口,根据设计要求编写软件程序。根据事先画好的程序流程图,用C语言编写程序,在主程序中对需要用到的I/O口进行定义,并设置相应的I/O口,比如要求P1。18~P1。25引脚为GPIO功能,则通过对引脚功能选择 寄存器PINSEL1将对应的引脚设置为GPIO方式并设置GPIO方向,在GPIO方向寄存器IO1DIR里设置,之后对定时器0进行初始化,并开相应的中断。然后进入大循环进行倒计时显示、控制蜂鸣器的蜂鸣与否并判断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
这是我近期单片机的课设,查阅大约资料自己做的
燕山大学
嵌入式系统课程设计报告
十字路口交通灯控制系统
学 院:里仁学院
专业班级:过控2班
姓 名:孟*坤
学 号:14*1152
时 间:2017年6月
指导教师:
摘要
随着移动设备的流行和发展,嵌入式系统已经成为一个热点。它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。最近的一种趋势是一个功能强大的嵌入式系统通常需要一种操作系统来给予支持,这种操作系统是已经成熟并且稳定的,可以是嵌入式的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引言
交通信号灯指挥着人和各种车辆的安全运行,实现红、黄、绿灯的自动指挥是城乡交通管理现代化的重要课题。在城乡街道的十字交叉路口,为了保证交通秩序和行人安全,一般在每条道路上各有一组红、黄、绿交通信号灯,其中红灯亮,表示该条道路禁止通行; 黄灯亮,表示该条道路上未过停车线的车辆停止通行,已过停车线的车辆继续通行;绿灯亮,表示该条道路允许通行。交通灯控制电路自动控制十字路口两组红、黄、绿交通灯的状态转换,指挥各种车辆和行人安全通行,实现十字路口城乡交通管理自动化。
本文为了实现交通道路的管理,力求交通管理先进性、科学化。 分析应用了单片机实现智能交通灯管制的控制系统,以及该系统软、硬件设计方法,实验证明该系统实现简单、经济,能够有效地疏导交通,提高交通路口的通行能力。
2 相关内容及原理
通过设计,培养自己综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。
利用ARM芯片模拟实现交通灯控制,自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片,了解所选ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制。
3 作品设计要求
要求基于Cortex系列单片机设计一具有模拟道路路口交通灯相应功能的交通灯模拟系统。具体要求如下:
(1)具有三种颜色显示:红色、绿色和黄色,分别代表路口交通灯的三种颜色。
(2)所设计的系统应至少能够模拟两个路口的功能,具有直行和左转的功能。
(3)如果能力和时间允许,可以加入操作系统。
(4)适当加入一些其他元素,使其更加具有人性化设计。
4 作品方案设计4.1 设计思路
利用STM32F103芯片实现单路交通灯的控制: a 实现红、绿、黄灯的循环控制。使用红、黄、绿三种不同颜色的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作为系统的主控芯片,控制交通灯的循环点亮并显示灯亮时间(采用倒计时显示),当定时时间到的时候通过灯的状态来提醒人们注意红绿灯的状态。
图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字节的闪存程序存储器,最大64K字节SRAM
2.0-3.6V供电和I/O引脚
上电/断电复位(POR/PDR)、可编程电压监测器(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的稳定时间
为100us
支持的外设:定时器、ADC、SPI、USB、IIC和UART
多达112个快速I/O端口(仅Z系列有超过100个引脚)
3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
1个16位带死区控制和紧急刹车,用于电机控制的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时,系统将会复位到初始的状态。
图5.4 系统的晶振电路图 图5.5 系统的复位电路图
5.5 LED循环显示设计
由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,左右两侧也是各三个灯,指挥车辆通行。绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。具体红绿灯时间分配时间如表5.1所示。
表5—1:红绿灯时间分配时间如表
1000ms 1000ms 1000ms 1000ms 1000ms 1000ms
主干通道 绿灯亮 黄灯闪 红灯亮 黄灯闪 红灯亮 黄灯闪
左右道路 红灯亮 红灯亮 绿灯亮 绿灯亮 红灯亮 红灯亮
上表说明主干通道绿灯亮、黄灯闪时人行道都是红灯亮,只有车道
红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。硬件电路连接图如图5.6所示
图5.6 硬件电路连接图
交通灯LED的发光和熄灭的控制,是通过控制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个匹配寄存器的设定可设置为匹配(即达到匹配寄存器指定的定时值)时产生中断或执行其他操作。
设置P0、P1口为GPIO输出状态,初始化定时器,选定定时器0中断为向量IRQ,对VICIntEnable、VICIntSelect、VICvectCntl进行设置,初始化SPI接口,根据设计要求编写软件程序。根据事先画好的程序流程图,用C语言编写程序,在主程序中对需要用到的I/O口进行定义,并设置相应的I/O口,比如要求P1。18~P1。25引脚为GPIO功能,则通过对引脚功能选择 寄存器PINSEL1将对应的引脚设置为GPIO方式并设置GPIO方向,在GPIO方向寄存器IO1DIR里设置,之后对定时器0进行初始化,并开相应的中断。然后进入大循环进行倒计时显示、控制蜂鸣器的蜂鸣与否并判断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
|