嵌⼊式系统设计实验报告
西安邮电⼤学
嵌⼊式系统设计实验报告专业班级学号学⽣姓名指导教师
学期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  //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;