嵌入式-电梯

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Forpersonaluseonlyinstudyandresearch;notforcommercialuse艿膆肁西安邮电大学虿莈嵌入式系统设计实验报告莃螃专业莈蒈班级螄膁学号蒁薈学生姓名膅袃指导教师膀薈学期薆2013-2014学年第2学期莀完成日期罿2014-06-25蚈蚂基于lpc2131的模拟电梯控制实验肂一、二、螇实验目的1、2、螈熟悉ARM&ADSV1.2的环境3、4、肃理解LPC2131芯片引脚功能的选择5、6、薀理解GPIO的使用设置、输入驱动方法7、8、螀理解SPI全双工同步串行通信原理,学习ARMSPI资源的驱动编程9、10、袈学习在LPC2131上移植ucosⅡ系统二、三、蒄实验内容及要求1、2、节通过键盘输入楼层,输入之后数码管从当前位置向上或向下运行,流水灯表示运动方向。3、4、蕿流水灯在运行中显示电梯正在运行的方向,并且在电梯到达时在该楼层闪烁3次。5、6、羈电梯运行到对应楼层,数码管显示楼层号。7、8、袅流水灯表示电梯运行楼层。9、10、蚀系统可同时满足多用户需求。达到该系统与现实电梯系统的一致性。芈三、四、肇系统总体设计(总体方案及系统框图)芆主要是创建了四个任务,分别为电梯总任务、按键检测任务、电梯方向改变任务及电梯向上或向下运行任务,然后启动多任务环境,通过事件标志组发送和接收消息,进而实现电梯的一些基本的功能。蒂莁膇蒃肀膇袄薂衿莇膄蜂鸣器模块蚇LPC2131芅SPI芃串口模块芇数码管显示模块蚅螁蚀蒇蒃葿薇膃羁芈蚆薄四、五、蚃系统详细设计(模块详细设计及流程图)芁螆羅螂LED显示与键盘模块肁开始系统初始化是否有按键按下?YY本层是否为目标层?确定方向NN运行电梯是否到达?是否有按键按下?NNYYNN开门YY确定方向YY是否和当前方向一致?YY之前方向的任务是否结束?NNYYNN肀五、六、螆系统测试(数据测试结果及分析)莆通过键盘按键输入楼层数,发送到开发板,数码管和LED灯初始化时会停留在电梯的第一层。接受到数据后数码管会自动变化到该楼层,并且LED灯在数码管变化的同时会显示电梯当前的运动状态,上或者下。在程序运行的任何期间都可以从键盘输入电梯的楼层数。而且程序会自动判断要满足的用户的优先级。袃此次试验达到的效果基本与现实中电梯的运行模式达到了一致。蝿六、总结袆在整个课程设计中,我们组员一起认真地查找相关资料,然后又对书中的相关内容仔细翻阅,通过虚心请教和不懈的努力,最终完成了整个设计,心中的喜悦实在无以言表。此刻,我非常感谢我们组长的鼓励和帮助,感谢同学们诸多的帮助!本次设计不仅让我收获了许多,也让我对以前所学习的ARM知识有了进一步的深化与巩固,最关键的是,它给了我一份自信。但我很明白,作品中还存在着比较多的不足,这些都需要进一步的改善,我会不骄傲,不气馁,用着自信与执着尽最大努力将其完善。七、八、蒃附录(代码+注释)芁薈#includeconfig.h羆#includestdlib.h羄羂#defineKEY1116//P0.16连接KEY1薁#defineKEY2117//P0.17连接KEY2肆#defineKEY3118//P0.18连接KEY3莄#defineKEY4119//P0.19连接KEY4蒀#defineKEY5120//P0.20连接KEY5荿#defineKEY6121//P0.21连接KEY6膆#defineBEEP17//P0.7控制蜂鸣器BEEP螅#defineHC595_CS(129)//P0.29口为74HC595的片选膂#defineTaskStkLengh64//DefinetheTask0stacklength定义用户任务0的堆栈长度膈芆intsemaphore[7]={0,0,0,0,0,0,0};//定义一个信号量数组膆intcurrent_floor;蚀intwork_count=0;膁intdirection;莅intis_working;芃莂uint8constDISP_TAB[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//数码管显示数字列表羀OS_STKTaskStk[TaskStkLengh];//DefinetheTask0stack定义用户任务0的堆栈莅OS_STKTask0Stk[TaskStkLengh];蚄OS_STKTask1Stk[TaskStkLengh];肄OS_STKTask2Stk[TaskStkLengh];虿蒅OS_FLAG_GRP*direct_chan;//事件标志组肅OS_EVENT*u_d;蒂蒈薅voidElevator(void*pdata);//电梯总任务声明蒆voidIs_button_press(void*pdata);//检测按键任务声明芄voidDirection_change(void*pdata);//电梯方向改变任务声明蒁voidUp_down(void*pdata);//电梯向上、向下运行任务声明蚅薃voidMSPI_Init(void)蚁{芀PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;//设置管脚连接SPI螅//PINSEL0=(PINSEL0&(~(0xFF8)))|(0x158);羃SPI_SPCCR=0x52;//设置SPI时钟分频莃SPI_SPCR=(03)|//CPHA=0,数据在SCK的第一个时钟沿采样肈(14)|//CPOL=1,SCK为低有效聿(15)|//MSTR=1,SPI处于主模式莄(06)|//LSBF=0,SPI数据传输MSB(位7)在先袁(07);//SPIE=0,SPI中断被禁止肁}腿螅uint8MSPI_SendData(uint8data)薃{袀IOCLR=HC595_CS;//片选74HC595艿膆SPI_SPDR=data;肁while(0==(SPI_SPSR&0x80));//等待SPIF置位,即等待数据发送完毕虿莈IOSET=HC595_CS;莃return(SPI_SPDR);螃}莈蒈intmain(void)螄{膁INT8Uerror;蒁薈OSInit();膅袃u_d=OSSemCreate(0);//创建向上或向下的信号量膀direct_chan=OSFlagCreate(0,&error);//创建方向改变的事件标志组薈薆OSTaskCreate(Elevator,(void*)0,&TaskStk[TaskStkLengh-1],2);//创建电梯总任务莀罿OSStart();//启动多任务环境蚈return0;蚂}肂螇voidElevator(void*pdata)螈{肃pdata=pdata;薀TargetInit();//初始化目标板螀袈PINSEL1=0x00000000;//选择管脚连接到GPIO蒄节IO0DIR=BEEP;//设置蜂鸣器为输出蕿羈IO0DIR=~(0x3F)16;//选择按键作为输入袅蚀芈PINSEL2&=~0x08;//选择管脚连接到GPIO肇IO1DIR=0xFF18;//选择流水灯作为输出芆IO1SET=0xFF18;//使流水灯处于高电平,灯熄灭蒂莁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);//延时莇}蚅}螁蚀蒇voidIs_button_press(void*pdata)//判断按键任务螂{蒃INT8Uerror;葿薇pdata=pdata;膃TargetInit();//目标板初始化化羁芈while(1)蚆{薄蚃if((IO0PIN&KEY1)==0)//按下1号键芁{螆if(semaphore[1]!=1)//羅{肁IO1CLR=118;//使第一个流水灯点亮肀semaphore[1]=1;//将信号量置位螆work_count++;//电梯工作量增加莆}袃}蝿elseif((IO0PIN&KEY2)==0)//按下2号键时袆{蒃if(semaphore[2]!=1)芁{薈IO1CLR=119;//使第二个流水灯点亮羆semaphore[2]=1;羄work_count++;羂}薁}肆elseif((IO0PIN&KEY3)==0)//按下3号键时莄{蒀if(semaphore[3]!=1)荿{膆IO1CLR=120;//使第三个流水灯点亮螅semaphore[3]=1;膂work_count++;膈}芆}膆elseif((IO0PIN&KEY4)==0)//按下4号键时蚀{膁if(semaphore[4]!=1)莅{芃IO1CLR=121;//使第四个流水灯点亮莂羀semaphore[4]=1;莅work_count++;蚄}肄}虿elseif((IO0PIN&KEY5)==0)//按下5号键时蒅{肅if(semaphore[5]!=1)蒂{蒈IO1CLR=122;//使第五个流水灯点亮薅蒆semaphore[5]=1;芄work_count++;蒁}蚅}薃elseif((IO0PIN&KEY6)==0)//按下6号键时蚁{芀if(semaphore[6]!=1)螅{羃IO1CLR=123;莃semaphore[6]=1;肈work_count++;聿}莄}袁肁if(is_working==1)//判断电梯是否运行腿{螅OSTimeDly(OS_TICKS_PER_SEC*0.2);//延时0.2秒薃}袀elseif(work_count!=0)艿{膆OSFlagPost(direct_chan,0x02,OS_FLAG_SET,&error);//事件标志组发送出去肁OSTimeDly(OS_TICKS_PER_SEC*0.2);//延时0.2秒虿}莈else莃{螃direction=0;莈}蒈}螄}膁蒁薈voidDirection_change(void*pdata)膅{袃uint8error;膀intfloor_temp;薈intup,down;薆莀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=6&&!semaphore[floor_temp];floor_temp++);蚅if(floor_temp==7)//如果楼层已到达顶层时,改变方向向下运行莃{蚀direction=-1;聿}肆}袁elseif(direction==-1)葿{膈for(floor_temp=current_floor-1;floor_temp=1&&!semaphore[floor_temp];floor_temp--);蒇if(floor_temp==0)//如果楼层已到达底层时,改变方向向上运行薃{蒂direction=1;芈}薄}芅elseif(direction==0)芁{莈is_working=1;羅OSTimeDly

1 / 69
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功