当前位置:文档之家› 嵌入式系统设计实验报告

嵌入式系统设计实验报告

西安邮电大学嵌入式系统设计实验报告专业班级学号学生姓名指导教师学期2013-2014学年第2学期完成日期2014-06-25基于lpc2131的模拟电梯控制实验一、实验目的1、熟悉ARM & ADS V1.2 的环境2、理解LPC2131芯片引脚功能的选择3、理解GPIO的使用设置、输入驱动方法4、理解SPI全双工同步串行通信原理,学习ARM SPI资源的驱动编程5、学习在LPC2131上移植ucosⅡ系统二、实验内容及要求1、通过键盘输入楼层,输入之后数码管从当前位置向上或向下运行,流水灯表示运动方向。

2、流水灯在运行中显示电梯正在运行的方向,并且在电梯到达时在该楼层闪烁3次。

3、电梯运行到对应楼层,数码管显示楼层号。

4、流水灯表示电梯运行楼层。

5、系统可同时满足多用户需求。

达到该系统与现实电梯系统的一致性。

三、系统总体设计(总体方案及系统框图)主要是创建了四个任务,分别为电梯总任务、按键检测任务、电梯方向改变任务及电梯向上或向下运行任务,然后启动多任务环境,通过事件标志组发送和接收消息,进而实现电梯的一些基本的功能。

四、系统详细设计(模块详细设计及流程图)五、系统测试(数据测试结果及分析)通过键盘按键输入楼层数,发送到开发板,数码管和LED灯初始化时会停留在电梯的第一层。

接受到数据后数码管会自动变化到该楼层,并且LED灯在数码管变化的同时会显示电梯当前的运动状态,上或者下。

在程序运行的任何期间都可以从键盘输入电梯的楼层数。

而且程序会自动判断要满足的用户的优先级。

此次试验达到的效果基本与现实中电梯的运行模式达到了一致。

六、总结在整个课程设计中,我们组员一起认真地查找相关资料,然后又对书中的相关内容仔细翻阅,通过虚心请教和不懈的努力,最终完成了整个设计,心中的喜悦实在无以言表。

此刻,我非常感谢我们组长的鼓励和帮助,感谢同学们诸多的帮助!本次设计不仅让我收获了许多,也让我对以前所学习的ARM知识有了进一步的深化与巩固,最关键的是,它给了我一份自信。

但我很明白,作品中还存在着比较多的不足,这些都需要进一步的改善,我会不骄傲,不气馁,用着自信与执着尽最大努力将其完善。

七、附录(代码+注释)#include "config.h"#include "stdlib.h"#define KEY1 1 << 16 // P0.16连接KEY1#define KEY2 1 << 17 // P0.17连接KEY2#define KEY3 1 << 18 // P0.18连接KEY3#define KEY4 1 << 19 // P0.19连接KEY4#define KEY5 1 << 20 // P0.20连接KEY5#define KEY6 1 << 21 // P0.21连接KEY6#define BEEP 1 << 7 // P0.7控制蜂鸣器BEEP#define HC595_CS (1 << 29) //P0.29口为74HC595的片选#define TaskStkLengh 64 //Define the Task0 stack length 定义用户任务0的堆栈长度int semaphore[7] = {0, 0, 0, 0, 0, 0, 0}; //定义一个信号量数组int current_floor;int work_count = 0;int direction;int is_working;uint8 const DISP_TAB[10] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90}; //数码管显示数字列表OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈OS_STK Task0Stk [TaskStkLengh];OS_STK Task1Stk [TaskStkLengh];OS_STK Task2Stk [TaskStkLengh];OS_FLAG_GRP *direct_chan; //事件标志组OS_EVENT *u_d;void Elevator(void *pdata); //电梯总任务声明void Is_button_press(void *pdata); //检测按键任务声明void Direction_change(void *pdata); //电梯方向改变任务声明void Up_down(void *pdata); //电梯向上、向下运行任务声明void MSPI_Init(void){PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI// PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x15 << 8) ;SPI_SPCCR = 0x52; // 设置SPI时钟分频SPI_SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样(1 << 4) | // CPOL = 1, SCK 为低有效(1 << 5) | // MSTR = 1, SPI 处于主模式(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先(0 << 7); // SPIE = 0, SPI 中断被禁止}uint8 MSPI_SendData(uint8 data){IOCLR = HC595_CS; // 片选74HC595SPI_SPDR = data;while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IOSET = HC595_CS;return(SPI_SPDR);}int main(void){INT8U error;OSInit ();u_d = OSSemCreate(0); //创建向上或向下的信号量direct_chan = OSFlagCreate(0, &error); //创建方向改变的事件标志组OSTaskCreate (Elevator,(void *)0, &TaskStk[TaskStkLengh - 1], 2); //创建电梯总任务OSStart (); //启动多任务环境return 0;}void Elevator(void *pdata){pdata = pdata;TargetInit (); //初始化目标板PINSEL1 = 0x00000000; //选择管脚连接到GPIOIO0DIR = BEEP; //设置蜂鸣器为输出IO0DIR = ~(0x3F) << 16; //选择按键作为输入PINSEL2 &= ~0x08; //选择管脚连接到GPIOIO1DIR = 0xFF << 18; //选择流水灯作为输出IO1SET = 0xFF << 18; //使流水灯处于高电平,灯熄灭MSPI_Init(); //SPI初始化IODIR = HC595_CS; //将SPI作为输出IO0DIR = ~(0x3F) << 16; //将p0.16~p0.21作为输入OSTaskCreate (Is_button_press,(void *)0, &Task0Stk[TaskStkLengh - 1], 4); //创建任务OSTaskCreate (Direction_change,(void *)0, &Task1Stk[TaskStkLengh - 1], 5);OSTaskCreate (Up_down,(void *)0, &Task2Stk[TaskStkLengh - 1], 3);while (1){OSTimeDly(10); //延时}}void Is_button_press(void *pdata) //判断按键任务{INT8U error;pdata = pdata;TargetInit (); //目标板初始化化while (1){if ((IO0PIN & KEY1) == 0) //按下1号键{if (semaphore[1] != 1) //{IO1CLR = 1 << 18; //使第一个流水灯点亮semaphore[1] = 1; //将信号量置位work_count++; //电梯工作量增加}}else if ((IO0PIN & KEY2) == 0) //按下2号键时{if (semaphore[2] != 1){IO1CLR = 1 << 19; //使第二个流水灯点亮semaphore[2] = 1;work_count++;}}else if ((IO0PIN & KEY3) == 0) //按下3号键时{if (semaphore[3] != 1){IO1CLR = 1 << 20; //使第三个流水灯点亮semaphore[3] = 1;work_count++;}}else if ((IO0PIN & KEY4) == 0) //按下4号键时{if (semaphore[4] != 1){IO1CLR = 1 << 21; //使第四个流水灯点亮semaphore[4] = 1;work_count++;}}else if ((IO0PIN & KEY5) == 0) //按下5号键时{if (semaphore[5] != 1){IO1CLR = 1 << 22; //使第五个流水灯点亮semaphore[5] = 1;work_count++;}}else if ((IO0PIN & KEY6) == 0) //按下6号键时{if (semaphore[6] != 1){IO1CLR = 1 << 23;semaphore[6] = 1;work_count++;}}if (is_working == 1) //判断电梯是否运行{OSTimeDly(OS_TICKS_PER_SEC * 0.2); //延时0.2秒}else if (work_count != 0){OSFlagPost(direct_chan, 0x02, OS_FLAG_SET, &error); //事件标志组发送出去OSTimeDly(OS_TICKS_PER_SEC * 0.2); //延时0.2秒}else{direction = 0;}}}void Direction_change(void *pdata){uint8 error;int floor_temp;int up, down;pdata = pdata;TargetInit (); //目标板初始化direction = 0;while (1){OSFlagPend(direct_chan, 0x03, OS_FLAG_W AIT_SET_ALL + OS_FLAG_CONSUME, 0, &error); //接收事件标志组发送的消息if (direction == 1){for (floor_temp = current_floor + 1; floor_temp <= 6 && !semaphore[floor_temp]; floor_temp++);if (floor_temp == 7) //如果楼层已到达顶层时,改变方向向下运行{direction = -1;}}else if (direction == -1){for (floor_temp = current_floor - 1; floor_temp >= 1 && !semaphore[floor_temp]; floor_temp--);if (floor_temp == 0) //如果楼层已到达底层时,改变方向向上运行{direction = 1;}}else if (direction == 0){is_working = 1;OSTimeDly(OS_TICKS_PER_SEC);is_working = 0;if (work_count == 1){for (floor_temp = 1; floor_temp <= 6 && !semaphore[floor_temp]; floor_temp++);if (current_floor > floor_temp){direction = -1;}else{direction = 1;}}else {if (current_floor == 1){direction = 1;}else if (current_floor == 6){direction = -1;}else{for (floor_temp = current_floor + 1; floor_temp <= 6 && !semaphore[floor_temp]; floor_temp++);up = floor_temp;for (floor_temp = current_floor - 1; floor_temp >= 1&& !semaphore[floor_temp]; floor_temp--);down = floor_temp;if (up - current_floor > current_floor - down) //首先响应距离较近的楼层{direction = -1;}else if (up - current_floor < current_floor - down){direction = 1;}else {if (6 - current_floor > current_floor - 1){direction = -1;}else if (6 - current_floor < current_floor - 1){direction = 1;}else {direction = 1;}}}}}OSSemPost(u_d);}}void Up_down(void *pdata){int count;uint8 error;pdata = pdata;TargetInit (); //目标板初始化current_floor = 1;MSPI_SendData(DISP_TAB[current_floor]);IO1CLR = 1 << 18; //使第一个流水灯点亮OSFlagPost(direct_chan, 0x01, OS_FLAG_SET, &error);while (1) {OSSemPend(u_d, 0, &error); //接收信号量OSTimeDly(OS_TICKS_PER_SEC); //延时IO1SET = 1 << (17 + current_floor); //将当前楼层灯熄灭if (direction == 1){current_floor++;}else if (direction == -1) {current_floor--;}IO1CLR = 1 << (17 + current_floor); //使当前楼层灯点亮MSPI_SendData(DISP_TAB[current_floor]); //向数码管发送楼层消息if (semaphore[current_floor] == 1){count = 3;while (count) //到达目标楼层后灯闪三下{OSTimeDly(OS_TICKS_PER_SEC / 2);IO1SET = 1 << (17 + current_floor); /OSTimeDly(OS_TICKS_PER_SEC / 2);IO1CLR |= 1 << (17 + current_floor);count--;}work_count--;semaphore[current_floor] = 0; //信号量还原为0 }OSFlagPost(direct_chan, 0x01, OS_FLAG_SET, &error);}}基于lpc2131的模拟MP3播放器实验一、实验目的6、熟悉ARM & ADS V1.2 的环境7、理解LPC2131芯片引脚功能的选择8、理解GPIO的使用设置、输入驱动方法9、理解PWM的通信原理,学习ARM PWM资源的通信编程10、学习在LPC2131上移植ucosⅡ系统二、实验内容及要求(1)通过键盘输入,进入MP3播放器相应的功能选项。

相关主题