嵌入式系统课程设计--十字路口交通灯控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
资料袋
电气与信息工程学院学院(系、部)2009 ~ 2010 学年第 2 学期题目十字路口交通灯控制;uC/OS-Ⅱ的移植与应用
成绩起止日期2010 年 5 月10 日~2010 年5月21日
目录清单
课程设计任务书
2009 —2010 学年第二学期
课程名称:嵌入式系统课程设计
设计题目:十字路口交通灯控制;uC/OS-Ⅱ的移植与应用
完成期限:自2010 年5月12 日至2010 年 5 月21日共 2 周
指导教师(签字):年月日系(教研室)主任(签字):年月日
(嵌入式应用系统)
设计说明书
十字路口交通灯控制
uC/OS-Ⅱ的移植与应用
起止日期:2010 年5月10 日至2010 年 5 月21 日
学生姓名
班级
学号
成绩
指导教师(签字)
设计任务一十字路口交通灯控制
一、设计目的:
1.了解基于ARM7核的LPC2106的管脚功能和特点,掌握I/O控制寄存器的设置方法;
2.掌握ARM7应用系统编程开发方法,能用C语言编写应用程序;
3.熟练掌握ADS1.2软件的使用以及PROTEUS仿真调试的方法;
二、具体任务:
1.采用PROTEUS完成十字路口交通灯控制的硬件电路设计,要求单片机选型为飞利浦公司的LPC2106,东西南北方向分别设置红黄绿3个指示灯,东西方向和南北方向各用1个数码管显示通行时间;
2.用ADS1.2编写C语言应用程序,完成十字路口交通灯控制;
3.采用PROTEUS将应用程序装载在LPC2106中,进行仿真验证。
要求东西方向和南北方向的数码管显示通行时间并倒计时,可以设置成一样,例如都是9秒倒计时;每当倒计时时间到,完成红黄绿指示灯的状态切换,模拟实现十字路口的交通灯管理控制。
三、硬件电路设计。
(参考下图完成硬件电路设计,用屏幕抓图的方式将自己设计的PROTEUS电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)
附图:
硬件电路说明:
设置所有I/O口为第一功能,将硬件电路图按上图所示连接。
东西南北四个方向分别装有红、黄、绿三灯。
数码管为交通灯倒计时显示。
将程序写入LPC2016芯片,通过引脚13、14、18、21、22、23、24、28 29控制数码管,通过引脚30 31 35 36 37 41 44控制各个路口的LED灯,东西红灯南北绿灯持续亮7秒,南北绿灯东西红灯持续亮7秒,东西南北黄灯
等待时间为2秒。
四、源程序。
(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)
源程序:
#include "config.h"
int main(void)
{
int32 i;
int32 a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*数码管显0-9*/ PINSEL0=0x00; /* 定义P0.0-P0.15为普通输入输出端口 */
IODIR=0x00003fff; /* 定义P0.0-P0.14端口方向为输出 */
while(1)
{
for(i=8;i>0;i--) /* 东西红灯、南北绿灯延时8秒 */
{
IOSET=0x0c00+a[i]; /* 东西红灯并显示时间*/
delay();
IOCLR=0x00003fff; } /* 引脚输出清零 */
for(i=3;i>0;i--) /* 东西红灯、南北黄灯延时3秒 */
{
IOSET=0x0a00+a[i];
delay();
IOCLR=0x00003fff; }
for(i=8;i>0;i--) /* 东西红灯、南北红灯延时8秒 */
{
IOSET=0x2100+a[i];
delay();
IOCLR=0x00003fff; }
for(i=3;i>0;i--) /* 东西黄灯、南北红灯延时3秒 */
{
IOSET=0x1100+a[i];
delay();
IOCLR=0x00003fff; }
}
}
delay()
{ int32 j=0x001a0000;
for(;j>0;j--) ;
}
五、仿真效果。
(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)
图(a)东西红灯南北绿灯持续亮8秒
图(b)东西红灯南北黄灯持续亮3秒
图(c)东西绿灯南北红灯持续亮8秒
图(d)东西黄灯南北红灯持续亮3秒
设计任务二uC/OS-Ⅱ的移植与应用
一、设计目的:
1.了解嵌入式实时操作系统u C/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及u C/OS-Ⅱ多任务管理的调度算法;
2.掌握u C/OS-Ⅱ在ARM7上移植的方法;
3.能将u C/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;
二、具体任务:
1.u C/OS-Ⅱ移植在LPC2106中。
2.编写用户任务程序,完成实时温度的采集控制。
硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。
三、参考硬件电路。
(用文字对所设计的电路功能、原理做详细说明)
附图:
硬件电路说明:
用接入滑动变阻器的电压值代表温度传感器的输出,接入电压的变化代表温度的变化。
ADC0809或者ADC0808芯片完成A/D转换功能,12脚为参考电压,10脚接脉冲控制A/D 转换速度。
23、24、25引脚决定模拟量输入通道,三个引脚都接地选择IN0通道。
数码管显示温度数值,由LPC2106的13、14、18、21~24、28~30、35引脚控制。
LPC2106的45~48、1~3、32为数字量输入端口。
四、源程序。
(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)
源程序:
#include "config.h" //创建任务堆栈
#define TASK_STK_SIZE 64
#define KEY 0x00001000//管脚P0.12
#define ADCS 0x00002000//管脚P0.13
#define ADCEND 0x00004000//管脚P0.14
uint32 led[]= {0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F}; //数码显示码
OS_STK TaskkeyStk[TASK_STK_SIZE]; //定义任务堆栈大小
OS_STK TaskadcStk[TASK_STK_SIZE];
OS_STK TaskledStk[TASK_STK_SIZE];
INT32U i; //ADC的转换值
void Taskkey(void *data); //任务0 启动按下数据采集
void Taskadc(void *data); //任务1 A/D转换
void Taskled(void *data); //任务2 数码显示
/******************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
******************************************************************************/
int main (void)
{ OSInit(); //操作系统初始化
OSTaskCreate(Taskkey, (void *)0, &TaskkeyStk[TASK_STK_SIZE - 1],2);
OSTaskCreate(Taskadc, (void *)0, &TaskadcStk[TASK_STK_SIZE - 1],3);
OSTaskCreate(Taskled, (void *)0, &TaskledStk[TASK_STK_SIZE - 1],4);
OSStart(); //启动操作系统
return 0;
}
void delay(INT32U t) //延时程序
{
while(t--);
}
void IOInit (void)
{ PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR|= 0x00002FFF; //P0.0-P0.11 P0.13为输出口
}
void Taskkey(void *p_arg)
{ p_arg = p_arg; //避免编译警告
TargetInit(); //初始化
IOInit();
for(;;)
{
while((IOPIN&KEY)!=0); //判断键按下
IOInit();
while((IOPIN&KEY)==0); //判断键按下后松开
IOCLR= 0x0000FFFF;
OSTaskSuspend(OS_PRIO_SELF); //挂起本任务
}
}
void Taskadc(void *p_arg)//ADC转换
{ p_arg = p_arg; IOInit();
for(;;)
{
IOCLR=ADCS;//ADC转换所需的下降沿
delay(20);
IOSET=ADCS;
delay(20);
IOCLR=ADCS;
delay(20);
IOInit();
while((IOPIN&ADCEND)==0);
IOSET=1<<11; //P0.11为1
i=IOPIN;//读取转换值
i=i>>15;
OSTaskSuspend(OS_PRIO_SELF);//挂起本任务
}
}
void Taskled(void *p_arg)//LED显示
{ INT32U gw,sw,bw;
p_arg = p_arg;
IOInit();
while(1)
{
gw=i%10;sw=i%100/10;bw=i/100;//十六进制求各个位
IOSET=(1<<10)|led[gw];//个位显示
delay(2000);
IOCLR=0x00000fff;
IOCLR=1<<10;
IOSET=(1<<9)|led[sw]; //十位显示
delay(2000);
IOCLR=0x00000fff;
IOCLR=1<<9;
IOSET=(1<<8)|led[bw]; //百位显示
delay(2000);
IOCLR=0x00000fff;
OSTaskResume(3); //恢复挂起的ADC任务
}
}
五、仿真效果。
(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)
说明:模拟量输入端电源电压设为10V,ADC0808的参考电压为5V。
图(a)输入模拟电压为3|5V左右的数字量输出显示
(b)输入模拟电压为2.5V左右的数字量输出显示
课程设计心得
从5月10日到5月21我们进行了为期两个星期的嵌入式课程设计,在这两个星期内我们学到了很多东西,也发现了自己许多不足的地方。
在动手实践过程中,我们遇到了很多的问题,在发现问题和解决问题的过程中,我们不断提高,同时也深深地体会到了进行课程设计,使理论与实践相结合的重要性。
设计刚开始时,对各指令理解不深刻,尤其是嵌入式C语言的不理解(课堂上只学了汇编语言),给我们带来了很大的困难,我们不得不自己查阅相关资料,加深理解。
嵌入式设计是软、硬件协同设计,不仅要熟悉汇编语言和C语言进行软件设计,还要熟悉设计所用芯片的各性能指标及格引脚功能。
这次课程设计采用的是计算机仿真设计,其中用于硬件设计的软件,我们以还用过,但用于软件设计的软件,我们还是第一次使用,这也给我们带来了不小的麻烦。
这次课程设计使我们获益良多。
在设计过程中,遇到了很多问题,我们通过请教老师,同学之间相互交流,以及自己查阅资料等方法,将它们一个一个地解决了。
在解决问题的过程中,我们不仅学到了许多知识,也发现了自己不足的地方。
在克服一个一个的困难的过程中,不仅让我们体会到了成功的喜悦,增强了我们的自信心,也激起了我们更深入学习的兴趣。
同时此次课程设计要用到许多以前学过的知识,这也是对学过的知识的复习。
我相信这次课程设计会对我们以后的学习以及工作带来许多积极的影响。
最后,对指导这次课程设计的老师以及在设计过程中帮助过我的同学表示感谢。