带数码管的交通指示灯系统设计.docx
- 文档编号:3678235
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:12
- 大小:62.84KB
带数码管的交通指示灯系统设计.docx
《带数码管的交通指示灯系统设计.docx》由会员分享,可在线阅读,更多相关《带数码管的交通指示灯系统设计.docx(12页珍藏版)》请在冰豆网上搜索。
带数码管的交通指示灯系统设计
期末大作业
题目:
带数码管的交通指示灯系统设计
院(系):
物联网工程学院
专业:
计算机科学与技术
班级:
计科1105班
姓名:
学号:
03041105
指导老师:
庄春兴
设计时间:
13-14学年2学期
2014年5月
0引言
随着科学技术发展的日新日异,ARM嵌入式系统[1]已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。
本文硬件设计,实现了利用S3C2440芯片来完成带数码管的交通指示灯设计[2],培养自己综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。
学习LED显示控制方法并掌握基于ARM开发板对I/O编程的方法[3]。
通过实验测试可以证明本文的设计原理和设计步骤都是正确的。
1设计原理
1.1交通信号灯的工作原理
一般情况下,红绿灯设在十字路口,或在多干道的交叉口上,目的是为了调整交叉口的交通秩序使各干道来往车辆能够有条不紊地行驶,否则将造成意想不到的严重后果。
当然在交叉口设置合理的红绿灯后,也可以大大减少交通管理部门的人力、屋里。
交叉口交通信号等的基本作用:
红灯亮表示车辆、行人禁止通行,绿灯亮表示车辆、行人可以通行,绿灯转换成红灯前几秒,可用黄灯亮来暗示驾驶员或行人即将禁止通行。
该系统的屏幕时间显示用倒计时方式表示红绿灯的切换时间,时间显示其的作用是协助红绿灯工作,跟随红、绿灯反复地进行切换。
目的是为了使驾驶员和行人能够看见红绿灯亮的时间还剩几秒,以便停车线以内的驾驶员和行人能够更清楚地知道此时该继续通行或减速,才不会使驾驶员盲目地加速或减速停车而阻碍另一干道车辆或行人的通行,从而可以提高交叉口车辆及行人的流通率,当然也可以减少事故的发生,为交通安全提供保障。
交通信号灯的工作原理:
当东西组红灯亮绿灯灭时,南北组就会绿灯亮红灯灭。
对东西组或南北组而言,每当绿灯亮转换成红灯亮前几秒(具体时间视实际情况而定)黄灯亮,当绿灯灭时黄灯也同时熄灭。
1.2S3C2440-GPIO介绍
GPIO,通用输入输出(GeneralPurposeI/O)的简称[4],其引脚可以供编程使用。
嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备,对这些设备的控制,有时只需要一位控制信号就够了,即只需要开/关两种状态就够了,比如灯亮与灭。
对这些设备的控制,使用传统的串行口和并行口都不合适。
所以在微控制器芯片上一般都会提供一个“通用可编程I/O接口”,即GPIO。
S3C2440有130个GPIO口,分为A到J共9组:
GPA、GPB、GPC...GPJ。
通过设置相应寄存器,可以选择某个GPIO口是用于输入、输出还是其他特殊功能。
例如可以设置GPH6作为一般的输入、输出端口,或者用于串口。
每组GPIO(GPA~GPJ),都可以通过3个寄存器来控制与访问,这3个寄存器分别为:
GPxCON:
GPIO配置寄存器、GPxDAT:
GPIO数据寄存器、GPxUP:
上拉电阻控制寄存器(其中x为:
A、B....H、J)。
1.2.1GPxCON寄存器
从寄存器的名字可以看出它属于配置(Confugure)寄存器——选择GPIO口的功能。
其中PORTA与PORTB~PORTJ在功能选择方面有所不同。
GPACON中每一位对应一个IO口(共23个)。
当某位为0时,相应的IO为输出;当某位被置为1时,相应的引脚为地址线或用于地址控制。
PORTB~PORTJ在寄存器操作方面完全相同,GPxCON中每两位控制一个引脚:
00表示输入,01表示输出,10表示特殊功能,11保留不用。
1.2.2GPxDAT寄存器
GPxDAT寄存器用于读/写引脚:
当引脚被设置为输入时,读此寄存器可知相应引脚电瓶状态是高还是低;当引脚被设为输出时,写此寄存器相应的位可令此引脚输出高电平或低电平。
1.2.3GPxUP寄存器
GPxUP寄存器某位为1时,相应引脚无内部上拉电阻;为0时相应的引脚使用内部上拉电阻。
(上拉电阻:
由于管脚悬空比较容易受到外界的电磁干扰,因此通过一个电阻来将此管脚与高电平相连,让其固定在高电平,这样的电阻称之为上拉电阻。
)
1.3带数码管的交通信号灯设计
本文通过利用ARM芯片模拟来实现带数码管的交通信号灯设计。
用ARM实验箱的LED和七段数码管模拟十字路口的交通灯。
将LED的数码管分成两组,分别代表一个路口的东西向和南北向红黄绿三色交通灯。
数码管计时显示剩余时间,绿灯显示27秒,然后黄灯显示3秒,红灯显示30秒。
南北与东西向的交通灯协同工作,循环显示,一个周期一分钟。
一个复位按钮,按一下双向黄灯闪烁,计时20秒后恢复到初始状态,然后继续工作[5]。
2设计步骤
2.1设计思路
本文是利用S3C2440ARM芯片来实现带数码管的交通信号灯设计。
在实现红、绿、黄灯的循环控制上,通过使用红、黄、绿三种不同颜色的LED灯实现此功能。
南北方向绿、黄、红三个灯依次接在P0.20、P0.21、P0.22上,东西方向的绿、黄、红三个灯依次接在P0.16、P0.17、P0.18上,用软件控制灯的亮与灭来控制车辆和行人的通行。
在实现用数码管显示倒计时的过程中,可以利用动态显示或静态显示,串行并出或者并行并出实现。
采用两位数码显示器显示南北方向时间,采用两位数码显示器显示东西方向时间,交通灯控制器工作流程如图1所示:
图1交通灯控制器工作流程图
2.2设计框图
本设计采用S3C2440作为系统的主控芯片,控制交通灯的循环点亮时间,并采用倒计时显示。
基本框图是主要有三部分组成:
S3C2440最小系统、交通灯循环模块、倒计时显示模块。
其系统框图如图2所示:
图2系统框图
其主程序流程图如图3所示:
图3主程序流程图
2.3显示模块
采用共阳极七段数码管显示交通灯倒计时,东西、南北两个方向各用两个数码管显示时间。
设置红绿灯时间为27秒,当南北方向绿灯倒计时为0后,黄灯倒计时延时3秒。
3秒后,南北方向交通灯变为红灯,而东西方向交通灯变为绿灯,倒计时3秒整个交通灯倒计时用循环模块无限制循环。
南北方向绿、黄、红三个灯依次接在P0.20、P0.21、P0.22上,东西方向的绿、黄、红三个灯依次接在P0.16、P0.17、P0.18上,P0.0-P0.7引脚连接数码管段选位,P0.12-P0.15引脚连接数码管位选位。
本设计采用共阳七段数码管,故有效电平为低电平,根据引脚0XFFBFFFFF或者0XFFFBFFFF代表红灯亮,其中B(1011);0XFFEFFFFF或者0XFFFEFFFF代表红灯亮,其中E(1110);0XFFDFFFFF或者0XFFFDFFFF代表红灯亮,其中D(1101)。
通过I00PIN=(I00PIN&0XFFFF0FFF)|(wei[weishu]<<8),将I00的32位接口按位与“FFFF0FFF”,把P0.12-P0.15端口清零,同时将位码左移8位,因为在开始的位码数组中定义的值是在4-7位,但是在芯片上接口在12-15位,所以需要左移8位。
I00PIN=(I00PIN&0XFFFFFF00)|(LED_num[shu]<<8)将P0.0-P0.7变为低电平,芯片接口就是在最低8位,所以不用左移。
其交通灯显示情况如下表所示:
南北方向
绿灯27秒
黄灯3秒
红灯27秒
红灯3秒
东西方向
红灯27秒
红灯3秒
绿灯27秒
黄灯3秒
2.4刷新与延时模块
延时子程序可以消除抖动,防止因硬件不稳定而造成显示不稳定。
3实验结果及结果分析
3.1实验代码
#include"..\ucos-ii\includes.h"
#include"..\ucos-ii\add\osaddition.h’’
#include"..\inc\drv.h’’//设备驱动
#include“string.h”
#include“..\inc\exio.h”//系统输入输出
//定义数码管段码
Unsignedchar
Led[]={ox3f,0x06,0x5b,ox4e,0x66,0x6d,Ox7d,x07,0x7f,0x6f,ox77,0x39,0x5e,0x79,0x71};
//定义全局变量
BOOLEANIs_Working;//工作状态
intCount;//计时器
voidonKey(intnkey,intfnkey);//键盘消息处理函数声明
//任务定义//
OS_STKMain_Stack[STACKSIZE*8];//任务堆栈
voidkey_Task(void*Id):
#definekey_Task_Prio12//定义任务优先级
OS_STKLed_Flash_Stack[STACKSIZE];//任务堆栈
VoidLed_Flash_Task(void*Id);
#defineLed_Flash_Prio60
OS_STKDisplay_Task_Stack[STACKSIEZ*8]//任务堆栈
VoidDisplay_Task(void*Id);
#defineDisplay_Task_Prio52
/已经定义的任务/
#defineSYS_Task_Prio1
#defineTouch_Screen_Task_Prio9
#definekey_Task_Prio12
#definekey_SCan_Task_PriO58
#defineLcd_Fresh_prio59
#defineLed_Flash_Prio60
/事件定义/
OS_EVENT*Nand_Rw_Sem;//读写控制权信号量
OS_EVENT*Uart_Rw_Sem;//uart读写控制信号量
VoidLed_Flash_Task(void*Id)//指示ROTS处于正常工作中
〔
ursignedcharled_state;
Uart_printf(0,”\n10”);
For(;;)//消息死循环
{
Led_Display(led_state);//显示LED灯状态
1ed_state=~Ied_state;
OSTime(250);//时间设置
}
voidinitOSGUI()//初始化图形界面
{
initOSMeasage():
initOSList();
initOSDC();
initOSCtrl();
initOSFile();
}
IntMain(intargc,char**argv)
{
ARMTargetInit();//系统硬件初始化
OSInit();//操作系统初始化
LCD_Init();//初始化LCD模块
LEC_printf(”LCD初始化完成\n”);
LoadFont();//装载字库
LoadConfigSys();//装载config.sys配置文件
LCD_Printf(“CreatetaskonUcos_ii…..\n”);//显示液晶屏信息
//建立任务
OSTaskCreate(key_Task,(void*)0,(OS_STK*)&key_stack[SATCKSIZE*8-1],key_Task_prio);
/建立任务
OSTaskCreate(Led_Flash_Task,(void*)0,(OS_STK*)&Led_Flash_stack[SATCKSIZE*8-1],Led_Flash_prio);
/建立任务
OSTaskCreate(Led_Task,(void*)0,(OS_STK*)&Led_stack[SATCKSIZE*8-1],Led_Task_prio);
/建立任务
OSTaskCreate(Display_Task,(void*)0,(OS_STK*)&Display_Task_stack[SATCKSIZE*8-1],Display_Task_prio);
//添加任务
OSAddTask_Init();
//输出
LCD_Printf(”startingucos-II…\n”);
LCD_Printf(”enteringgraphmode…\n”);
LCE_ChangeMode(DspGraMode);//设置液晶屏显示为图形模式
InitOSGUI();//初始化图形界面
InitRtc();//初始化系统时钟
Nand_Rw_Sem=OSSemCreate
(1)//创建Nand-Flash读写控制权旗语,初值为1,满足互斥条件
OSStart();//启动操作系统
}
voidkey_Task(void*Id)//创建并发送到系统的任务队列
{
POSMSGpMsg=0;//创建消息结构
Is_working=TURE;//工作状态
For(;;)//死循环
{
pMsg=WaitMessage(0);//等待消息
switch(pMsg->Message)//比较
{
CaseOSM_KEY:
Onkey(pMsg->wparam,pMsg->LParam);//键盘消息响应
Break;
OSTimDly(1000);//修改任务时间参数
}
DeleteMessage(pMsg);//删除消息
}
}
voidLED_Task{void*id)//创建数码管任务队列
{
inteastwest=1;//正为东西绿灯亮,负为难背绿灯亮
Count=30;//红绿灯备亮30秒
for(;;)//死循环
{
if(Count>0)
{
if(Is_working==TRUE)
{
//东西通行
If(eastwest>0)
If(count<4)
IO0DIR=0XEB;//东西绿灯,南北黄灯
Else
IO0DIR=0xe7;//东西绿灯,南北红灯
}
Else
{
//南北通行
If(count<4)
IO0DIR=0XBE;//东西黄灯,南北绿灯
Else
IO0DIR=0x7e;//东西红灯,南北绿灯
}
OSTimeDly(1500);//修改任务时间参数
Else
{
IO0DIR=0xbb;//黄灯亮
OSTimeDly(500);//修改任务时间参数
IO0DIR=Oxff;//黄灯灭
OSTimeDly(1000);//修改任务时间参数
}
Count--;
}
e1se
{
Is_working=TURE//工作状态
Eastwest=-eastwest;
Count=30;
}
voidonKey(intnkey,intfnkey)//键盘消息处理函数
(
If(nkey==15)
{
Is_working=FALSE;//工作状态为复位状态
Count=20;//计时设为20秒
}
3.2实验步骤
1.在ADS1.2中,使用已经创建好的模板,新建一个项目traffic。
把操作系统所需要的头文件和库文件加入工程中。
2.把交通灯文件夹中的C语言源文件加入。
3.打开main.c文件,在Main()数中创建3个任务:
(1)key_Task负责接收键盘消息,执行工作状态的控制;
(2)LED_Task负责发光二极管的显示,同时负责每秒将Count时间计数器减1;
(3)Display_Task负责数码管的动态显示,显示Count剩余时间。
全局变量Count用来记录剩余时间;全局变量Is_working用来控制工作状态。
LED_Task任务局部变量eastwest用来记录当前通行方向,1为东西向,-1为南北向。
4.在key_Task任务中添加代码,主要任务是初始化一些变量,启动消息循环,等待键盘扫描任务发来的消息(OSM_KEY),并调用onKey函数进行处理。
5.完成交通灯控制任务和数码管显示任务。
数码管显示任务交替显示计时的十位和个位。
交通灯控制任务实现通行方向的控制。
6.用ADS1.2编译、下载并调试上述程序,检查运行结果。
7.生成*.bin文件,通过USB下载到嵌入式开发板中,运行并检查输出结果。
3.3结果分析
代码成功运行后可以观察到LED的数码管被分成了两组,它们分别代表一个路口的东西向和南北向红黄绿三色交通灯。
数码管计时显示剩余时间,绿灯显示27秒,然后黄灯显示3秒,红灯显示30秒。
南北与东西向的交通灯可以协同工作,循环显示,一个周期一分钟。
按一下复位按钮双向黄灯闪烁,计时20秒后恢复到初始状态,然后继续工作。
实验可以证明本文的设计原理和步骤都是正确的,能达到预期的设计目标。
4心得体会
回顾带数码管的交通指示灯设计的过程,我受益匪浅。
不仅培养了我综合运用所学知识、独立分析和解决实际问题的能力,而且还培养创新意识和创新能力,让我进一步了解所选择的ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。
同时也让我亲自将书本上的理论和实际操作相结合,通过软硬件设计实现利用ARM芯片完成带数码管的交通灯控制功能。
首先,我通过查阅相关文献资料,熟悉所选ARM芯片。
其次,在总体设计步骤中,设计车辆遇到红灯停绿灯行情况,红绿灯时间均为30s,黄灯闪烁时间为5s。
再次,了解了系统硬件设计,熟悉勒I/O接口以及定时器计数器工作原理。
最后,对系统软件的设计包括交通信号灯的工作流程软件实现,用C语言编程进一步提高了我的计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。
参考文献
[1]杜春雷.ARM体系结构与编程[M].北京:
清华大学出版社,2003.
[2]郑思铭.交通灯的一种新型智能控制系统[J].广东自动化与信息工程,2006
(2):
16-18.
[3]周立功.ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社,2008.
[4]侯殿有.嵌入式系统开发基础——基于ARM9微处理机C语言程序设计[M].北京:
清华大学出版社,2013.
[5]岳俊华,郭秀兰等.一种模拟交通灯系统的设计与实现[J].管理与财富:
学术版,2008,12(3):
34-37.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 交通 指示灯 系统 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)