嵌入式课程设计(交通灯与uCOS-的移植与应用)

更新时间:2024-04-03 20:45:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

班级:自动化1004 学号:10401701305 嵌入式系统 课程设计报告

姓名:甘显豪 指导教师: 成绩:

设计任务一 十字路口交通灯控制

一、设计目的:

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秒倒计时;每当倒计时时间到,完成红黄绿指示灯的状态切换,模拟实现十字路口的交通灯管理控制。

1

三、硬件电路设计。(参考下图完成硬件电路设计,用屏幕抓图的方式将自己设计的PROTEUS电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)

附图:

2

硬件电路说明:

复位电路,

时钟电路(仿真可略), ARM7微处理器LPC2106,

南北、东西道路交通灯,东西南北左转弯灯 交通计时共阴显示数码管。

交通规则:(1)首先是东西方向绿灯亮10s(从15s减到5s),然后东西黄灯闪烁5次,接着是东西左转弯绿灯亮10s,然后是东西左转弯绿灯闪烁5s;(2)南北方向方向绿灯亮10s,然后南北黄灯闪烁5次,接着是南北左转弯绿灯亮10s,然后是南北左转弯绿灯闪烁5s(没提到的方向都是红灯亮)。

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明) 源程序:

#include \#include\

void delay(unsigned int x) //延迟0.xMS {

while(x--) {

unsigned char j; for(j=0;j<125;j++) { ; } } }

uint8 led[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管段选值 void display() //数码管显示 { uint8 i=15; while(i-5) { IOSET = (led[ i / 10 ] << 13) | (led[ i % 10 ] << 6); delay(5000); IOCLR = (led[ i / 10 ] << 13) | (led[ i % 10 ] << 6); i--; } }

int main(void) {

3

uint8 k; int8 type=1; PINSEL0=0x00000000; //将管脚设置为通用IO端口GPIO PINSEL1=0x00000000; IODIR=0xFFFFFFFF; //将方向寄存器IODIR全设为输出=1 while(1) { switch(type) { case 1: //东西绿灯亮,南北红灯亮 IOSET=0x00600021; display(); k=5; //东西黄灯闪烁 while(k) { IOSET=0x00000010; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00000010; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } /*东西左转弯绿灯亮*/ IOCLR=0x00600021; IOSET=0X00500009; display(); type=2; break; case 2: //东西左转弯绿灯闪烁 k=5; while(k) { IOSET=0x00100000; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00100000; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; }

4

type=3; break; case 3: //南北绿灯亮,东西红灯亮 IOCLR=0x00000001; IOSET=0x0060000C; display(); k=5;//南北黄灯闪烁 while(k) { IOSET=0x00000002; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00000002; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } /*南北左转弯绿灯亮*/ IOCLR=0X0060000C; IOSET=0x00A00009; display(); type=4; break; case 4: //南北左转弯绿灯闪烁 k=5; while(k) { IOSET=0x00800000; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00800000; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } type=1; IOCLR=0xFFFFFFFF; //全部清零 } } }

5

五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)

6

设计任务二 uC/OS-Ⅱ的移植与应用

一、设计目的:

1.了解嵌入式实时操作系统uC/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及uC/OS-Ⅱ多任务管理的调度算法;

2.掌握uC/OS-Ⅱ在ARM7上移植的方法;

3.能将uC/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;

二、具体任务:

1.uC/OS-Ⅱ移植在LPC2106中。

2.编写用户任务程序,完成实时温度的采集控制。硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。

三、参考硬件电路。(用文字对所设计的电路功能、原理做详细说明)

附图:

7

硬件电路说明:

复位电路,

时钟电路(仿真可略), ARM7微处理器LPC2106, 温度电压值输入电路,

A/D转换器ADC0808(8bit), 按键电路SW,

四位数码管显示电路。

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)

源程序:

/********************************************************************************************************/

#include \

#define TASK_STK_SIZE 64 #define key 0x00001000 //按键

#define adstart 0x00002000 //AD采样开始 #define adend 0x00004000 //AD结束 const uint32 led_code[16]={0x0000003F,0x00000006,0x0000005B,0x0000004F,0x00000066,0x0000006D,0x0000007D,0x00000007,

8

0x0000007F,0x00000006F,0x00000077,0x0000007C,0x00000039,0x0000005E,0x00000079,0x00000071};

OS_STK Task0Stk[TASK_STK_SIZE]; OS_STK Task1Stk[TASK_STK_SIZE]; OS_STK Task2Stk[TASK_STK_SIZE]; INT32U i;

void Task0(void *data); void Task1(void *data); void Task2(void *data);

/********************************************************************************************************* ** 函数名称: main

** 功能描述: c语言的主函数,由它启动多任务环境

********************************************************************************************************/ int main (void) { OSInit(); OSTaskCreate(Task0, (void *)0, &Task0Stk[TASK_STK_SIZE - 1],1); OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1],2); OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1],3); OSStart(); return 0; }

void delay(INT32U t) { uint32 x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); }

void L_Init (void) //初始化 {

PINSEL0=0x00000000;

PINSEL1=0x00000000;

9

IODIR|= 0x00002fFF; }

/********************************************************************************************************* ** 函数名称:Task0

** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务

********************************************************************************************************/ void Task0(void *p_arg) {

p_arg = p_arg; TargetInit(); L_Init(); for(;;) {

while((IOPIN&key)!=0);//假如按键没有按下,则一直循环在这里 L_Init();

while((IOPIN&key)==0);//按键被按下又弹起,程序顺序执行 IOCLR= 0x0000ffFF;

OSTaskSuspend(OS_PRIO_SELF); // OSTimeDlyHMSM(0,0,0,8); // IOSET=adstart;

// OSTimeDlyHMSM(0,0,0,1); // IOCLR=adstart;

// OSTimeDlyHMSM(0,0,0,1); // IOSET=adstart; } }

/**************************************************************************************************** ** 函数名称:Task1

** 功能描述: μCOS-II的第2个任务,AD转换

********************************************************************************************************/ void Task1(void *p_arg) {

p_arg = p_arg;

10

L_Init(); for(;;) { IOCLR=adstart; //输入高低的脉冲电平 delay(100); IOSET=adstart; delay(100); IOCLR=adstart; delay(100); L_Init();

while((IOPIN&adend)==0); IOSET=1<<11; //11位为AD的OE使能端 // OSTimeDlyHMSM(0,0,0,50); i=IOPIN; i=i>>15; //AD的输出OUT8到OUT1分别由15到22位控制 OSTaskSuspend(OS_PRIO_SELF); } }

/**************************************************************************************************** ** 函数名称:Task2

** 功能描述: μCOS-II的第3个任务,LED显示

********************************************************************************************************/ void Task2(void *p_arg) { INT32U gw,sw,bw;

p_arg = p_arg; L_Init();

//动态循环显示数码管

while((IOPIN&key)!=0) //假如按键再次按下,则推出显示循环 {

gw = i; /* 取个位数据 */ sw = i0/10; /* 取十位数据 */ bw = i/100; /* 取百位数据 */

IOSET=(1<<10)|led_code[gw]; //显示个位

11

delay(10);

IOCLR=0x00000fff; //消影 //IOSET=1<<10; //IOCLR=1<<10;

IOSET=(1<<9)|led_code[sw]; //显示十位

delay(10);

IOCLR=0x00000fff; //消影 //IOSET=1<<9; //IOCLR=1<<9;

IOSET=(1<<8)|led_code[bw]; //显示百位

delay(10);

IOCLR=0x00000fff; //消影 //IOSET=1<<8; //IOCLR=1<<8; OSTaskResume(2); }

//IOCLR=0x00000fff; //delay(2000);

//OSTaskResume(1); //恢复任务1AD采样 //OSTaskResume(2); //恢复任务2LED显示

// OSTaskResume(2); //恢复优先级为2的任务,即任务1 //OSTaskResume(3); //恢复优先级为3的任务,即任务2 }

12

五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)

注:此设计可以在POT电阻改变时,LED实时显示,无须停止运行再重新运行仿真.

13

本文来源:https://www.bwwdw.com/article/cg2r.html

Top