嵌入式课程设计电梯实验报告.docx
《嵌入式课程设计电梯实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计电梯实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计电梯实验报告
西安邮电学院
嵌入式硬件课程设计报告
嵌入式系统硬件课程设计题目
电梯控制系统
系部名称
:
计算机系
专业名称
:
计算机科学与技术
班级
:
计科0703班
学号
:
学生姓名
:
指导教师
:
时间
:
20010年12月6日—12月17日
1.实验目的
1)熟悉ARM(LPC2131)&ADSV1.2的环境。
2)了解LPC2131DemoBoard资源、环境;掌握ADS工具使用。
3)熟练掌握ADS工具的使用,掌握ARMC程序设计、调试技术。
4)理解ARM芯片引脚功能选择,理解GPIO的使用设置、输入驱动方法。
5)理解UART串行通信原理,学习ARMUART资源的驱动编程。
2.实验仪器及设备
1)EasyARM2131开发实验板。
2)TKStudioIDE集成开发环境。
3.实验内容
Ø基础实验
内容1:
ARM(LPC2131)&ADSV1.2环境熟悉
♦LPC2131硬件环境介绍;
♦ADS工具简介;
要求:
了解LPC2131DemoBoard资源、环境;掌握ADS工具使用。
内容2:
ADS模板工具&ARMC语言程序设计
♦ADS环境中编程模板的理解与使用;
♦使用ADS工具,基于LPC2131进行简单的C程序设计;
要求:
熟练掌握ADS工具的使用,掌握ARMC程序设计、调试技术;
内容3:
GPIOOutput(LED、Beep)实验
♦理解ARM芯片引脚功能选择;
♦理解GPIO的使用设置、输出驱动方法;
♦熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;
要求:
实现一个秒闪航标灯和蜂鸣。
内容4:
GPIOInput(KeyInput)实验
♦理解ARM芯片引脚功能选择;
♦理解GPIO的使用设置、输入驱动方法;
♦熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;
要求:
实现一个秒闪航标灯和可按键控制的蜂鸣器。
内容5:
EintVIC实验
♦理解ARM芯片引脚功能选择;
♦理解外中断的含义与应用;
♦熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;
要求:
实现一个秒闪航标灯和可按键控制的蜂鸣器(用外中断方式实现)。
内容6:
定时器
♦理解ARM芯片引脚功能选择;
♦理解GPIO的使用设置、输入/输出驱动方法;
♦熟练掌握AD定S工具,基于LPC2131进行简单的C程序设计;
要求:
基于ucosII的GPIO、时器、RTC、串口等综合实验。
内容7:
异步串行口UART
♦理解ARM芯片引脚功能选择;
♦理解GPIO的使用设置、输入/输出驱动方法;
♦理解UART串行通信原理,学习ARMUART资源的驱动编程;
♦熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;
要求:
结合前边内容,实现LPC2131和PC端串行传输数据信息。
Ø课程设计任务要求
课题名称:
电梯控制系统。
要求该控制器应具备如下功能:
♦通过键盘输入楼层,输入之后数码管从当前位置向上或向下运行。
♦运行到对应楼层,显示楼层号。
♦灯表示运行楼层。
♦数码管数字大小增减表示向上、向下。
4.设计过程
1)设计方案
用LED灯显示当前电梯的起始楼层和目标楼层
用数码管显示电梯当前所在的楼层
当电梯到达目标楼层时,用蜂鸣器发出蜂鸣,提示已经到达
通过UART来控制输入楼层,中断控制
2)流程图
3)电路图
按键输入检测电路图
8路LED控制电路图
UART0
数码管
4)程序模块说明
a.定义模块:
#include"config.h"
#defineBEEP1<<7//P0.7控制蜂鸣器,低电平蜂鸣
/*LED8~LED18个LED分别由P1.25~P1.18控制*/
constuint32LEDS8=(0xFF<<18);//P1[25:
18]控制LED8~LED1,低电平点亮
#defineHC595_CS(1<<29)//P0.29口为74HC595的片选
typedefstructNode
{
uint8floor;
structNode*next;
}Node,*LinkList;
/*定义串口模式设置数据结构*/
typedefstructUartMode
{
uint8datab;//字长度,5/6/7/8可选
uint8stopb;//停止位,1/2可选
uint8parity;//奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;
LinkListL;
uint8up,down,keep,stop;//UART0数据接收缓冲区
volatileuint8rcv_new;//接收新数据标志
/*流水灯花样,低电平点亮,注意调用时候用了取反操作*/
constuint32LED_TBL[]={
//0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加
0x01,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮
};
/*此表为LED0~F以及L、P的字模*/
uint8constDISP_TAB[]={
//0123456789
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
};
**函数名称:
DelayNS()
**函数功能:
长软件延时
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
**函数名称:
MSPI_Init()
**函数功能:
初始化SPI接口,设置为主机。
**入口参数:
无
**出口参数:
无
**函数名称:
MSPI_SendData()
**函数功能:
向SPI总线发送数据。
**入口参数:
data待发送的数据
**出口参数:
返回值为读取的数据
b.接收输出模块:
**函数名称:
IRQ_UART0()
**函数功能:
串口0接收中断服务程序
**入口参数:
无
**出口参数:
无
void__irqIRQ_UART0(void)
{
Node*p;
if((U0IIR&0x0F)==0x04)
{p=(Node*)malloc(sizeof(Node));
rcv_new=1;//设置接收到新的数据标志
p->floor=U0RBR;//读取FIFO的数据,并清除中断
if((p->floor-48)>0&&(p->floor-48)<9)
{
p->next=L->next;
L->next=p;
VICVectAddr=0x00;//中断处理结束
}
else
{
rcv_new=0;//设置接收到新的数据标志
VICVectAddr=0x00;//中断处理结束
}
}
}
**函数名称:
UART0_SendByte()
**函数功能:
向串口0发送1字节数据
**入口参数:
dat要发送的数据
**出口参数:
无
voidUART0_SendByte(uint8dat)
{
U0THR=dat;//要发送的数据
}
**函数名称:
UART0_SendBuf()
**函数功能:
向串口发送8字节数据
**入口参数:
无
**出口参数:
无
voidUART0_SendBuf(void)
{
uint8i;
//for(i=0;i<8;i++)
UART0_SendByte(L->next->floor);
while((U0LSR&0x20)==0);//等待数据发送完毕
}
c.主程序模块:
**函数名称:
main()
**函数功能:
从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
**调试说明:
需要PC串口显示终端软件如EasyARM.exe。
uint8rcv_data;
intmain(void)
{
Node*p;
uint8start,end;
uint8i,j,sum=0,k;
uint32temp;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
UARTMODEset;
start=1;
set.datab=8;
set.stopb=1;
set.parity=0;
rcv_new=0;
loop:
PINSEL0=0x00005505;//设置I/O连接到UART0
PINSEL1=0x00000000;
IODIR=HC595_CS;
PINSEL2=PINSEL2&(~0x08);//P1[25:
16]连接GPIO
IO1DIR=LEDS8;//设置LED1控制口为输出
MSPI_Init();//初始化SPI接口
UART0_Init(115200,set);//串口初始化
U0FCR=0x01;//使能FIFO,并设置触发点为8字节
U0IER=0x01;//允许RBR中断,即接收中断
IRQEnable();//使能IRQ中断
/*使能UART0中断*/
VICIntSelect=0x00000000;//设置所有的通道为IRQ中断
VICVectCntl0=0x20|0x06;//UART0分配到IRQslot0,即最高优先级
VICVectAddr0=(uint32)IRQ_UART0;//设置UART0向量地址
VICIntEnable=1<<0x06;//使能UART0中断
p=L->next;
while
(1)
{
if(rcv_new==1)
{
rcv_new=0;
end=rcv_buf[0]-48;
UART0_SendByte(p->floor);
//UART0_SendBuf();
if(start{
for(i=start;i<=end;i++)
{
for(j=start;j<=end;j++)
{
sum+=LED_TBL[j];
IO1SET=~((sum)<<18);
DelayNS(20);
IO1CLR=((sum)<<18);
DelayNS(20);
}
rcv_data=MSPI_SendData(DISP_TAB[i]);//发送显示数据
sum=0;
}
}
else{
for(i=start;i>=end;i--)
{
for(j=start;j>=end;j--)
{
sum+=LED_TBL[j];
IO1SET=~((sum)<<18);
DelayNS(20);
IO1CLR=((sum)<<18);
DelayNS(20);
}
rcv_data=MSPI_SendData(DISP_TAB[i]);//发送显示数据
//DelayNS(20);//延时
sum=0;
}
}
for(k=0;k<4;k++)
{
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEP;//设置BEEP控制口为输出
IO0SET=BEEP;//BEEP停止蜂鸣
DelayNS(20);
IO0CLR=BEEP;//BEEP蜂鸣
DelayNS(20);
IO0SET=BEEP;
}
start=end;
gotoloop;
//rcv_data=MSPI_SendData(DISP_TAB[end-48]);//发送显示数据
//DelayNS(40);//延时
}
}
return0;
}
5.实验过程:
●实验步骤:
首先熟悉开发环境,以及开发板的应用。
熟悉板子上的各个接口的功能。
其次,做基础实验,对GPIO,定时,中断,UART做进一步的熟悉。
然后,对电梯的原理做进一步的了解,设计出基本要求,以及需要的模块和部件。
最后,对各个功能做组合,并进行融合,修改,并做进一步的优化
●遇到的问题
遇到的问题1:
当输入的楼层有多个时,因为缓存数组只有八个,所以会有丢失数据的现象。
解决办法:
缓存用链表来存数据,这样既可以避免数据丢失,而且在用完一个数据后可以及时释放,避免了空间的浪费。
遇到的问题2:
电梯只能按照输入的顺序来运作,不能够判断最优路径。
解决办法:
在电梯运作之前,对缓存的数据进行优化排序,选出最优路径再运作。
实验结果:
实现了基本的简单电梯功能。
6.实验总结和实验心得
通过这次课程设计,我学到了很多东西,原先我对嵌入式系统并没有很深刻的了解,在做完课程设计后,我对,数码管,蜂鸣器,流水灯等一些期间应用有了更深刻的了解,知道了他们的结构和功能,以及相关的函数的功能与运用,真正的把所学的东西运用到了实际中,更好的把课本知识与实际相结合,对我以后的学习有很大帮助。