嵌入式实验报告.docx

上传人:b****4 文档编号:27539242 上传时间:2023-07-02 格式:DOCX 页数:23 大小:79.94KB
下载 相关 举报
嵌入式实验报告.docx_第1页
第1页 / 共23页
嵌入式实验报告.docx_第2页
第2页 / 共23页
嵌入式实验报告.docx_第3页
第3页 / 共23页
嵌入式实验报告.docx_第4页
第4页 / 共23页
嵌入式实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

嵌入式实验报告.docx

《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

嵌入式实验报告.docx

嵌入式实验报告

嵌入式系统实验报告

 

姓名:

班级:

学号:

教师:

 

流水灯实验

一、实验目的

1.理解并掌握ARM的端口操作

2.熟悉HC595工作原理

二、实验内容

1掌握端口操作

2让流水灯依次显示

3、实验原理

1.端口操作原理

A.端口功能选择

由于ARM中端口基本上都有复用,所以对端口操作时首先要确定用该端口的什么功能,一般端口用作输入输出都是GPIO功能!

确定为GPIO功能的实现方法一般为对对应端口PINSEL清0,实现方法范例如下:

PINSEL0&=KEYBOARD_SMAT;如果KEYBOARD_SMAT等于0xffff00ff,那么P0.4~P0.7端口为GPIO功能!

首先是对PINSEL0操作说明是对于P0端口中的P0.0~P0.15操作,每个端口对应两bit,因为某些端口功能多于两种;所以例子中是对P0.4~P0.7操作。

(端口功能介绍见LPC2292数据手册)

B.端口方向选择

对端口确认为GPIO功能后,则需要确定该端口是输入输出,ARM中是通过IOXDIR寄存器实现!

如:

IO0DIR|=KEYBOARD_SCK;说明是对端口P0操作,在这里其操作的范围为整个端口P0,每一个端口只有输出输入判断,估在IOXDIR一个端口只需要一个bit就可以做出判断。

如果KEYBOARD_SCK=0X00000010,说明是对P0.4设置为输出。

如IO0DIR&=(KEYBOARD_KEY^0XFFFFFFFF);为相应的输入实现方式

C.清零与置位

在端口为输出时,对于一个端口可以置位也可以清0,在ARM中的实现方式如下!

如:

IO0CLR=KEYBOARD_SI;此语句是对KEYBOARD_SI为1的位全部清0,如果KEYBOARD_SI等于0x00000040,那么P0.6端口则清0,如果KEYBOARD_SI等于0xFFFFFFFF则是对整个P0清0;对应的IOxSET也是同样的方式,不同的它对相应端口置1;

D.输入电平判断

在端口为输入时,判断以个端口是低电平还是高电平则是通过IOXPIN这类寄存器实现的。

如:

if((IO0PIN&KEYBOARD_KEY)!

=0),如果KEYBOARD_KEY等于0x00000020说明是对于P0.5做判断,如果(IO0PIN&KEYBOARD_KEY)等于0,说明该端口为返回值为低电平!

同理高电平也是通过此类判断!

2.HC595工作原理

VCC:

接电源;GND接地

SCLR(10脚):

低电平时将移位寄存器数据清零,通常接VCC.

QH(9脚):

级联输出端,接下以个595的SI

G(13脚):

高电平时禁止输出(高阻态)。

QA~QH:

为八位并行输出端RCK,SCK,SI如下:

实际中我们主要是对595控制RCK,SCK,SI来实现595的功能的。

将一个八位数据转换到QA~QH上,以0,1的方式出现在QA~QH八个端口。

通过8次SCK上升沿的移位信号用SI口接收每位数据,实现将一个字节的数据装入595中。

SCK的上升沿发出一个移位信号,每位数据都移动到下一个移位寄存器中;遇到同步发送脉冲RCK(上升沿有效)时,将这个字节的数据输出,形成一个相当于8位或多位的并行数据;

4、实验流程图

五.代码实现

#include"config.h"

voidDelayNS(uint32dly)

{

uint32i;

for(;dly>0;dly--)

{

for(i=0;i<4000;i++);

}

}

intmain(void)

{

PINSEL0=0x01000000;

IO0DIR=0x1000000;

//IO0CLR=0x100000;

while

(1)

{

IO0SET=0x01000000;

DelayNS(1010);

IO0CLR=0x01000000;

DelayNS(1010);

}

}

 

阵屏汉字显示实验

一、实验目的

1.了解点阵屏显示基本原理

2熟悉74HC595芯片的原理,以及如何利用74HC595写程序实现串并转换。

3熟悉使用字模软件

4进一步熟悉ARM的端口操作

二、实验内容

1建立汉字字库

2在点阵屏上显示汉字

3、实验原理

点阵屏涉及到4个引脚,分别是P0.20~P0.17。

P0.4,P0.17,P0.18和P0.19,P0.20分别作为74HC595的SCK,SI,RCK。

(结合74HC595手册理解)通过SI口接收每位数据,P0.18和P0.19分别对应SI-X,SI-Y,用于控制行和列的显示;SCK的高电平发出移位信号,每位数据都移动到下一个移位寄存器中;遇到同步发送脉冲RCK时,将多位数据一次发送到寄存器中,形成一个相当于16位或多位的并行数据。

点阵显示是这样实现的。

利用串并转换将两个16位数据分别发送给P0.18和P0.19所对应的SI-X和SI-Y。

它们分别控制片选位和显示数据位。

(至于行列哪个作片选位哪个做数据显示位可由自己定,一般便于观察和结合字模软件,将点阵屏相对于实验箱正向的行作为数据显示位,列作为片选位)通过控制片选和数据显示位可以实现固定行显示固定的亮灭信息。

再通过扫描算法(与LED灯相似)实现点阵屏显示任意数据信息。

4、实验流程图

5、代码实现

time.c

/****************************************Copyright(c)**************************************************/

/**

;**日期:

2007.8.17

;**描述:

time.c,定时器初始化及控制文件。

用于初始化定时器和启动定时器,对应的宏为

;**Timer0_Enable和Timer1_Enalbe。

根据定时器的使用来定义TIMER0和TIEMR1,

;**在TARGET.c中的targetint函数中,可调用相应的TIMER0INIT(div,ovf)或TIMER1INIT(div,ovf)

;**进行初始化,其中Div为分频系数,可以任何数据,表示PCLK的div+1记数,ovf为溢出数据

;**,定时期采用以ovf为边界的循环记数,同时产生中断,T0_InterruptSetand

;**T1_InterruptSet两个函数为两定时器的中断设置,包括中断类型设置,中断优先级的设置

;**,中断使能等.

;**

;**--------------time.c文件

;**------------------------------------------------------------------------------------------------------*/

/************************************************

*Headerfilesegment*

***********************************************/

#include"config.h"

#include"latic.h"

#include"time.h"

/************************************************

*Functiondefinitionsegment*

***********************************************/

/*-----------------------------------------------------------------*/

/*--------------------------定时器0部分----------------------------*/

/*-----------------------------------------------------------------*/

#ifdefTime0_Enable

/************************************************************

函数名:

IRQ_Timer0Interrupt(void)

描述:

定时器0中断溢出处理程序,直接添加中断服务代码于此

************************************************************/

uint8counter=0;//控制移动

void__irqIRQ_Time0Interrupt(void)

{

/*------------------可在此添加中断服务程序--------------------*/

if(counter==0x8f)

{

counter=0;

LaticMove();//移动字符

}

counter++;

LaticScan();//点阵扫描

/*------------------------------------------------------------*/

T0IR=0x01;//复位MR0中断

VICVectAddr=0x00;//清除地址

}

/***************************************************************

函数名:

Timer0_InterruptSet

功能:

定时器0中断设置,包括中断类型,中断优先级,地址分配,中断使能

****************************************************************/

voidTime0_InterruptSet(void)

{

VICIntSelect&=0xffffffef;//设置中断类型(定时器0中断为IRQ,其它为FIQ)

VICVectCntl2=0x24;//优先级分配

(2).定时器0中断为4号中断,且使能定时器0中断

VICVectAddr2=(int)IRQ_Time0Interrupt;//传送中断服务程序的入口地址

VICIntEnable=0x00000010;//允许定时器0中断源产生中断

}

/***************************************************************

函数名:

Time0Init(uint32div,uint32ovf)

功能:

定时器0初始化函数,根据需要设置分频值

和定时器溢出值,定时器工作方式组合可以在里面设置

****************************************************************/

voidTime0Init(uint32div,uint32ovf)

{

T0PR=div;//分频值(定时器计数时钟频率=Fpclk/(div+1))

T0MCR=0x03;//MR0与TC值的匹配将产生中断,并使TC复位

T0MR0=ovf;//匹配值,可以认为是定时器的溢出值

//T0TCR=0x03;//TC0开始计数并复位.

Time0_InterruptSet();

}

/****************************************************************

函数名:

Timer0Start(void)

功能:

定时器0启动,在应用程序需要处调用

*****************************************************************/

voidTime0Start(void)

{

T0TCR=0x01;

}

#endif

/*-----------------------------------------------------------------*/

/*--------------------------定时器1部分----------------------------*/

/*-----------------------------------------------------------------*/

#ifdefTime1_Enable

/************************************************************

函数名:

IRQ_Timer1Interrupt(void)

功能:

定时器1中断溢出处理程序,直接添加中断服务代码于此

************************************************************/

void__irqIRQ_Time1Interrupt(void)

{

/*------------------可在此添加中断服务程序--------------------*/

T1IR=0x01;//清除中断

VICVectAddr=0x00;//清除地址

}

/***************************************************************

函数名:

Timer1_InterruptSet(void)

功能:

定时器1中断设置,包括中断类型,中断优先级,地址分配,中断使能

****************************************************************/

voidTime1_InterruptSet(void)

{

VICIntSelect&=0xffffffdf;//设置中断类型(定时器1中断为IRQ,其它为FIQ)

VICVectCntl3=0x25;//优先级分配(3).定时器1中断为5号中断,且使能定时器1中断

VICVectAddr3=(int)IRQ_Time1Interrupt;//传送中断服务程序的入口地址

VICIntEnable=0x00000020;//允许定时器1中断源产生中断

}

/***************************************************************

函数名:

Timer1Init(uint16div,uint32ovf)

功能:

定时器1初始化函数,根据需要设置分频值

和定时器溢出值,定时器工作方式组合可以在里面设置

****************************************************************/

voidTimer1Init(uint32div,uint32ovf)

{

T1PR=div;//分频值(定时器计数时钟频率=Fpclk/(div+1))

T1MCR=0x03;//MR0与TC值的匹配将产生中断,并使TC复位

T1MR0=ovf;//匹配值,可以认为是定时器的溢出值

//T0TCR=0x03;//TC0开始计数并复位.

Time1_InterruptSet();

}

/****************************************************************

函数名:

Timer1Start(void)

功能:

定时器1启动,在应用程序需要处调用

*****************************************************************/

voidTime1Start(void)

{

T1TCR=0x01;//定时器1开始计数

}

#endif

/******************************************************************************

*EndofEntireFile*

*****************************************************************************/

time.h

/****************************************Copyright(c)**************************************************/

/**

;**日期:

2007.8.17

;**描述:

time.h定时器定义头文件。

为time.c文件提供宏以及为其他函数提供调用参数

;**

;**

;**--------------time.h文件

;**------------------------------------------------------------------------------------------------------*/

#include"config.h"

#ifndef_TIME_H_

#define_TIME_H_

#defineTime0_Enable//定时器0功能定义允许

//#defineTime1_Enable//定时器1功能定义允许

/************************************************

*Functiondeclarationsegment*

***********************************************/

externvoidTime0Init(uint32div,uint32ovf);//初始化定时器0

externvoidTime0Start(void);//启动定时器0

externvoidTimer1Init(uint32div,uint32ovf);//初始化定时器1

externvoidTime1Start(void);//启动定时器1

#endif

/******************************************************************************

*EndofEntireFile*

*****************************************************************************/

main.c

#include"config.h"

#include"time.h"

#include"latic.h"

intmain(void)

{

Time0Init(2,5000);

LaticInit();

Time0Start();

while

(1)

{

;

}

}

latic.c

/****************************************Copyright(c)**************************************************/

/**

;**日期:

2007.8.18

;**描述:

latic.c西南科技大学计算机学院CS-II型实验Latic工作程序,控制

;**两个595来实现16X16点阵的显示,该文件给latic.h提供底层接口

;**

;**--------------latic.c文件

;**------------------------------------------------------------------------------------------------------*/

/************************************************

*Headerfilesegment*

***********************************************/

#include"config.h"

#include"latic.h"

#ifdefLatic_Enable

/************************************************

*Globalevariablesegment*

***********************************************/

constuint16LaticCharacter[][16]={

/*--文字:

西--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0002,0x7FF2,0x2812,0x2412,0x2212,0x21FE,0x2012,0x2012,0x2012,0x21FE,0x2212,0x2212,0x2212,0x7FF2,0x0002,0x0000,

/*--文字:

南--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0004,0x0004,0x7FE4,0x0424,0x0524,0x0564,0x05B4,0x7F2F,0x0524,0x05A4,0x0564,0x2524,0x4424,0x3FE6,0x0004,0x0000,

/*--文字:

科--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0410,0x0212,0x0192,0x0072,0xFFFE,0x0051,0x0491,0x0400,0x0422,0x02CC,0x0200,0x0200,0xFFFF,0x0100,0x0100,0x0000,

/*--文字:

技--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0108,0x4108,0x8088,0x7FFF,0x0048,0x4028,0x4000,0x20C8,0x1348,0x0C48,0x0C7F,0x1248,0x21C8,0x6048,0x2008,0x0000,

/*--文字:

大--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0020,0x8020,0x4020,0x2020,0x1020,0x0C20,0x03A0,0x007F,0x01A0,0x0620,0x0820,0x3020,0x6020,0xC020,0x4020,0x0000,

/*--文字:

学--*/

/*--宋体12;此字体下对应的点阵为:

宽x高=16x16--*/

0x0040,0x0230,0x0210,0x0212,0x025C,0x0254,0x4250,0x8251,0x7F5E,0x0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1