嵌入式系统设计实验报告.doc
《嵌入式系统设计实验报告.doc》由会员分享,可在线阅读,更多相关《嵌入式系统设计实验报告.doc(38页珍藏版)》请在三一办公上搜索。
1、西安邮电大学嵌入式系统设计实验报告专 业班 级学 号学生姓名指导教师学 期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、 流水灯在运行中显示电梯正在运行的方向,并且在电梯到达时在该楼层
2、闪烁3次。3、 电梯运行到对应楼层,数码管显示楼层号。4、 流水灯表示电梯运行楼层。5、 系统可同时满足多用户需求。达到该系统与现实电梯系统的一致性。三、 系统总体设计(总体方案及系统框图)主要是创建了四个任务,分别为电梯总任务、按键检测任务、电梯方向改变任务及电梯向上或向下运行任务,然后启动多任务环境,通过事件标志组发送和接收消息,进而实现电梯的一些基本的功能。蜂鸣器模块数码管显示模块SPI串口模块LPC2131LED显示与键盘模块四、 系统详细设计(模块详细设计及流程图)五、 系统测试(数据测试结果及分析) 通过键盘按键输入楼层数,发送到开发板,数码管和LED灯初始化时会停留在电梯的第一层
3、。接受到数据后数码管会自动变化到该楼层,并且LED灯在数码管变化的同时会显示电梯当前的运动状态,上或者下。在程序运行的任何期间都可以从键盘输入电梯的楼层数。而且程序会自动判断要满足的用户的优先级。此次试验达到的效果基本与现实中电梯的运行模式达到了一致。六、总结在整个课程设计中,我们组员一起认真地查找相关资料,然后又对书中的相关内容仔细翻阅,通过虚心请教和不懈的努力,最终完成了整个设计,心中的喜悦实在无以言表。此刻,我非常感谢我们组长的鼓励和帮助,感谢同学们诸多的帮助!本次设计不仅让我收获了许多,也让我对以前所学习的ARM知识有了进一步的深化与巩固,最关键的是,它给了我一份自信。但我很明白,作品
4、中还存在着比较多的不足,这些都需要进一步的改善,我会不骄傲,不气馁,用着自信与执着尽最大努力将其完善。七、 附录(代码+注释)#include config.h#include stdlib.h#defineKEY11 16 / P0.16连接KEY1#defineKEY21 17 / P0.17连接KEY2#defineKEY31 18 / P0.18连接KEY3#defineKEY41 19 / P0.19连接KEY4#defineKEY51 20 / P0.20连接KEY5#defineKEY61 21 / P0.21连接KEY6#define BEEP 1 7 / P0.7控制蜂鸣器B
5、EEP#define HC595_CS (1 29) /P0.29口为74HC595的片选#defineTaskStkLengh64/Define the Task0 stack length 定义用户任务0的堆栈长度 int semaphore7 = 0, 0, 0, 0, 0, 0, 0; /定义一个信号量数组int current_floor; int work_count = 0;int direction;int is_working;uint8 const DISP_TAB10 = 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X
6、80, 0X90; /数码管显示数字列表OS_STKTaskStk TaskStkLengh;/Define the Task0 stack 定义用户任务0的堆栈OS_STKTask0Stk TaskStkLengh;OS_STKTask1Stk TaskStkLengh;OS_STKTask2Stk TaskStkLengh;OS_FLAG_GRP *direct_chan; /事件标志组OS_EVENT *u_d;void Elevator(void *pdata); /电梯总任务声明void Is_button_press(void *pdata); /检测按键任务声明void Dire
7、ction_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
8、为低有效 (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; / 片选74HC595 SPI_SPDR = data; while( 0 = (SPI_SPSR & 0x80);/ 等待SPIF置位,即等待数据发送完毕 IOSET = HC595_CS; return(SPI_SPDR);int main(void)INT8U error;OSInit ();u
9、_d = OSSemCreate(0); /创建向上或向下的信号量direct_chan = OSFlagCreate(0, &error); /创建方向改变的事件标志组OSTaskCreate (Elevator,(void *)0, &TaskStkTaskStkLengh - 1, 2); /创建电梯总任务OSStart (); /启动多任务环境return 0;void Elevator(void *pdata)pdata = pdata;TargetInit (); /初始化目标板PINSEL1 = 0x00000000; /选择管脚连接到GPIOIO0DIR = BEEP; /设置
10、蜂鸣器为输出IO0DIR = (0x3F) 16; /选择按键作为输入PINSEL2 &= 0x08; /选择管脚连接到GPIOIO1DIR = 0xFF 18; /选择流水灯作为输出IO1SET = 0xFF 18; /使流水灯处于高电平,灯熄灭MSPI_Init(); /SPI初始化IODIR = HC595_CS; /将SPI作为输出IO0DIR = (0x3F) 16; /将p0.16p0.21作为输入OSTaskCreate (Is_button_press,(void *)0, &Task0StkTaskStkLengh - 1, 4); /创建任务OSTaskCreate (Di
11、rection_change,(void *)0, &Task1StkTaskStkLengh - 1, 5);OSTaskCreate (Up_down,(void *)0, &Task2StkTaskStkLengh - 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 (semaphore1 != 1) / I
12、O1CLR = 1 18; /使第一个流水灯点亮semaphore1 = 1; /将信号量置位work_count+; /电梯工作量增加else if (IO0PIN & KEY2) = 0) /按下2号键时 if (semaphore2 != 1) IO1CLR = 1 19; /使第二个流水灯点亮semaphore2 = 1;work_count+;else if (IO0PIN & KEY3) = 0) /按下3号键时 if (semaphore3 != 1) IO1CLR = 1 20; /使第三个流水灯点亮semaphore3 = 1;work_count+; else if (IO
13、0PIN & KEY4) = 0) /按下4号键时 if (semaphore4 != 1) IO1CLR = 1 21; /使第四个流水灯点亮semaphore4 = 1;work_count+;else if (IO0PIN & KEY5) = 0) /按下5号键时 if (semaphore5 != 1) IO1CLR = 1 22; /使第五个流水灯点亮 semaphore5 = 1;work_count+;else if (IO0PIN & KEY6) = 0) /按下6号键时 if (semaphore6 != 1) IO1CLR = 1 23;semaphore6 = 1;wor
14、k_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, dow
15、n;pdata = pdata;TargetInit (); /目标板初始化direction = 0;while (1)OSFlagPend(direct_chan, 0x03, OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, 0, &error); /接收事件标志组发送的消息if (direction = 1) for (floor_temp = current_floor + 1; floor_temp = 1 & !semaphorefloor_temp; floor_temp-);if (floor_temp = 0) /如果楼层已到达底层时,改变方向
16、向上运行 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 floor_temp) direction = -1;else direction = 1;else if (current_floor = 1) direction = 1;else if (current_floor = 6) direction = -1;else for (floor_
17、temp = current_floor + 1; floor_temp = 1 & !semaphorefloor_temp; floor_temp-);down = floor_temp;if (up - current_floor current_floor - down) /首先响应距离较近的楼层 direction = -1;else if (up - current_floor current_floor - 1) direction = -1;else if (6 - current_floor current_floor - 1) direction = 1;else dire
18、ction = 1;OSSemPost(u_d);void Up_down(void *pdata)int count;uint8 error;pdata = pdata;TargetInit (); /目标板初始化current_floor = 1;MSPI_SendData(DISP_TABcurrent_floor); IO1CLR = 1 18; /使第一个流水灯点亮OSFlagPost(direct_chan, 0x01, OS_FLAG_SET, &error);while (1) OSSemPend(u_d, 0, &error); /接收信号量OSTimeDly(OS_TICK
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 设计 实验 报告

链接地址:https://www.31ppt.com/p-2392871.html