西电ARM单片机实验报告.docx
- 文档编号:18129285
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:82
- 大小:381.06KB
西电ARM单片机实验报告.docx
《西电ARM单片机实验报告.docx》由会员分享,可在线阅读,更多相关《西电ARM单片机实验报告.docx(82页珍藏版)》请在冰点文库上搜索。
西电ARM单片机实验报告
西安电子科技大学
ARM单片机实验报告
实验一数码管实验
一、实验目的
1.了解数码管的显示原理;
2.掌握JXARM9-2440中数码管显示编程方法。
二、实验仪器
JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机。
三、实验原理
7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。
LED显示器的接口一般有静态显示与动态显示接口两种方式。
本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0来选择相应的数码管,地址0x20006000为数码管的数据寄存器。
数码管采用共阳方式,向该地址写一个数据就可以控制LED的显示,其原理图如图所示。
四、实验内容、步骤、程序、结果
1.六个数码管同时正向显示0-F,然后反向显示F-0。
1)参照模板工程led(modules\led\led.apj),新建一个工程led,添加相应的文件,并修改led的工程设置;
2)创建led.c并加入到工程led中;
3)编写LED显示函数voidled_display(void),正向显示0-F然后反向显示F-0,并循环执行以上动作,在每次显示之间延时一段时间;
程序如下:
/****************************************************************************/
/*文件名称:
LEDSEG7.C*/
/*实验现象:
数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/
/****************************************************************************/
#defineu8unsignedchar
unsignedcharseg7table[20]={
/*01234567*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
/*89ABCDEF*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
/*HELO*/
0x89,0x86,0xc7,0xc0};
/****************************************************************************/
/*函数说明:
JXARM9-24107段构共阳数码管测试*/
/*功能描述:
依次在7段数码管上显示0123456789ABCDEF*/
/*返回代码:
无*/
/*参数说明:
无*/
/****************************************************************************/
voidTest1_Seg7(void)
{
inti;
*((u8*)0x20007000)=0x00;
for(;;)
{
for(i=0;i<0x10;i++)
{
*((u8*)0x20006000)=seg7table[i];
delay(8000);
}
for(i=0xf;i>=0x0;i--)
{
*((u8*)0x20006000)=seg7table[i];
delay(8000);
}
}
}
/****************************************************************************/
/*Functionname:
循环延时子程序*/
/*Description:
循环'time'次*/
/*Returntype:
void*/
/*Argument:
循环延时计数器*/
/****************************************************************************/
voidDelay(inttime){
inti;
intdelayLoopCount=10000;
for(;time>0;time--);
for(i=0;i } 4)编译led,成功后,下载并运行,观察结果。 结果: 六个数码管同时正向显示0-F,然后反向显示F-0 2.在六个数码管上依次显示“HELLO”,可分辨出轮流显示。 程序如下(此处主要修改了seg7table中的值): /****************************************************************************/ /*文件名称: LEDSEG7.C*/ /*实验现象: 数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/ /****************************************************************************/ voidTest2_Seg7(void) { *((u8*)0x20007000)=0x00; for(;;) { *((u8*)0x20007000)=0x2f; *((u8*)0x20006000)=seg7table[16]; delay(8000); *((u8*)0x20007000)=0x37; *((u8*)0x20006000)=seg7table[17]; delay(8000); *((u8*)0x20007000)=0x3b; *((u8*)0x20006000)=seg7table[18]; delay(8000); *((u8*)0x20007000)=0x3d; *((u8*)0x20006000)=seg7table[18]; delay(8000); *((u8*)0x20007000)=0x3e; *((u8*)0x20006000)=seg7table[19]; delay(8000); } }/****************************************************************************/ /*Functionname: 循环延时子程序*/ /*Description: 循环'time'次*/ /*Returntype: void*/ /*Argument: 循环延时计数器*/ /****************************************************************************/ voidDelay(inttime){ inti; intdelayLoopCount=10000; for(;time>0;time--); for(i=0;i } 结果: 在六个数码管上依次显示“HELLO”,可分辨出轮流显示。 3.在六个数码管上依次显示“HELLO”,分辨不出轮流显示。 步骤同上。 程序如下(相对于步骤2,此处仅将Delay的延时从10000调至1): voidTest3_Seg7(void) { *((u8*)0x20007000)=0x00; for(;;) { *((u8*)0x20007000)=0x2f; *((u8*)0x20006000)=seg7table[16]; delay (1); *((u8*)0x20007000)=0x37; *((u8*)0x20006000)=seg7table[17]; delay (1); *((u8*)0x20007000)=0x3b; *((u8*)0x20006000)=seg7table[18]; delay (1); *((u8*)0x20007000)=0x3d; *((u8*)0x20006000)=seg7table[18]; delay (1); *((u8*)0x20007000)=0x3e; *((u8*)0x20006000)=seg7table[19]; delay (1); } } 结果: 在六个数码管上依次显示“HELLO”,不可分辨出轮流显示。 *4.在每个数码管上递增显示0-9。 步骤同上。 程序如下: /****************************************************************************/ /*文件名称: LEDSEG7.C*/ /*实验现象: 数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/ /****************************************************************************/ voidTest4_Seg7(void) {inti; for(;;) { *((u8*)0x20007000)=0x3e; for(i=0;i<0x0a;i++) { *((u8*)0x20006000)=seg7table[i]; delay(3000); } *((u8*)0x20007000)=0x3d; for(i=0;i<0x0a;i++) { *((u8*)0x20006000)=seg7table[i]; delay(3000); } *((u8*)0x20007000)=0x37; for(i=0;i<0x0a;i++) { *((u8*)0x20006000)=seg7table[i]; delay(3000); } *((u8*)0x20007000)=0x2f; for(i=0;i<0x0a;i++) { *((u8*)0x20006000)=seg7table[i]; delay(3000); } *((u8*)0x20007000)=0x1f; for(i=0;i<0x0a;i++) { *((u8*)0x20006000)=seg7table[i]; delay(3000); } } }/****************************************************************************/ /*Functionname: 循环延时子程序*/ /*Description: 循环'time'次*/ /*Returntype: void*/ /*Argument: 循环延时计数器*/ /****************************************************************************/ voidDelay(inttime){ inti; intdelayLoopCount=1000; for(;time>0;time--); for(i=0;i } 结果: 在每个数码管上递增显示0-9。 五、实验分析及总结 本实验中,数码管采用共阳极类型,所以是给0亮,操作时,先给地址0x20007000的某位给0,让指定的某位亮,然后给地址0x20006000送入编码好的数据,即seg7table,以此来实现让数码管显示指定的数。 实验二键盘输入实验 一、实验目的 1、学习键盘驱动原理; 2、掌握通过CPU的I/O扩展键盘的方法。 二、实验仪器 JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机、串口连接线。 三、实验原理 1.键盘实现方案 1)采用专门的芯片实现键盘扫描 2)采用软件实现键盘扫描 2.软键盘实现方案 当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低到逻辑0。 3.按键抖动 开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。 尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。 当触点闭合时,其弹起就像一个球。 弹起效果将产生如下图所示的好几个脉冲。 弹起的持续时间通常将维持在5ms~30ms之间。 4.矩阵键盘电路 1)一个瞬时接触开关(按钮)放置在每一行与每一列的交叉点。 每一行由一个输出端口的一位驱动,每一列由一个电阻器上拉且供给输入端口一位。 2)键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。 3)一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。 4)每个键被分配一个称为扫描码的唯一标识符。 应用程序利用该扫描码,根据按下的键来判定应该采取什么行动,换句话说,扫描码将告诉应用程序按下哪个键。 5.键盘扫描算法 1)初始化: 所有的行(输出端口)被强行设置为低电平。 2)在没有任何键按下时,所有的列(输入端口)将读到高电平。 3)任何键的闭合将造成其中的一列变为低电平。 4)一旦检测到有键被按下,就需要找出是哪一个键。 过程很简单,微处理器只需在其中一行上输出一个低电平。 如果它在输入端口上发现一个0值,微处理器就知道在所选择行上产生了键的闭合。 6.一旦检测到有键被按下,就需要找出是哪一个键。 过程很简单,微处理器只需在其中一行上输出一个低电平。 如果它在输入端口上发现一个0值,微处理器就知道在所选择行上产生了键的闭合 JXARM9-2440具有4×4的软键盘。 原理图如下: 四、实验内容、步骤、程序、结果 1.获取按键值,在串口显示。 1)参照模板工程key(modules\key\key.apj),新建一个工程key,添加相应的文件,并修改key的工程设置; 2)创建main.c并加入到工程key中; 3)按照实验内容编写相应程序; 4)编译key; 5)下载程序并运行,按键看串口是否有显示;看数码管是否输出相应键值。 程序如下: /*包含文件*/ #include"def.h" #include"2410lib.h" #include"option.h" #include"2410addr.h" #include"interrupt.h" /******************************************************************** //Functionname: Main //Description: JXARM9-2410键盘实验主程序 //实现功能: //Returntype: void //Argument: void *********************************************************************/ voidMain(void) { /*配置系统时钟*/ ChangeClockDivider(2,1); U32mpll_val=0; mpll_val=(92<<12)|(1<<4)| (1); ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3); /*初始化端口*/ Port_Init(); /*初始化串口*/ Uart_Init(0,115200); Uart_Select(0); /*打印提示信息*/ PRINTF("\n---键盘测试程序---\n"); PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200,8,N,1)\n"); /*开始回环测试*/ while (1) { unsignedcharch; ch=Key_GetKeyPoll();//TODO //获取键值 if(ch! =0) { PRINTF("\r'%c'键按下",ch); } } } 结果: 在串口显示键盘输入的对应值 2.使按键按照如下表的顺序显示出来。 步骤同上。 0 1 2 3 4 5 6 7 8 9 A B C D E F 修改的程序如下(此处仅需修改keyboard.c中的部分地方): charkey_get_char(introw,intcol) { charkey=0; switch(row) { case0: if((col&0x01)==0)key='9'; elseif((col&0x02)==0)key='5'; elseif((col&0x04)==0)key='1'; elseif((col&0x08)==0)key='D'; break; case1: if((col&0x01)==0)key='8'; elseif((col&0x02)==0)key='4'; elseif((col&0x04)==0)key='0'; elseif((col&0x08)==0)key='C'; break; case2: if((col&0x01)==0)key='7'; elseif((col&0x02)==0)key='3'; elseif((col&0x04)==0)key='F'; elseif((col&0x08)==0)key='B'; break; case3: if((col&0x01)==0)key='6'; elseif((col&0x02)==0)key='2'; elseif((col&0x04)==0)key='E'; elseif((col&0x08)==0)key='A'; break; default: break; } returnkey; } 结果: 按键按照表中的顺序显示出来。 3.将键盘按键值在数码管上显示。 步骤如上。 程序如下: /*包含文件*/ #include"def.h" #include"2410lib.h" #include"option.h" #include"2410addr.h" #include"interrupt.h" #defineU8unsignedchar unsignedcharseg6table[16]={ /*01234567*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, /*89ABCDEF*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, }; /******************************************************************** //Functionname: Main //Description: JXARM9-2410键盘实验主程序 //实现功能: //Returntype: void //Argument: void *********************************************************************/ voidMain(void) { /*配置系统时钟*/ ChangeClockDivider(2,1); U32mpll_val=0; mpll_val=(92<<12)|(1<<4)| (1); ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3); /*初始化端口*/ Port_Init(); /*初始化串口*/ Uart_Init(0,115200); Uart_Select(0); /*打印提示信息*/ PRINTF("\n---键盘测试程序---\n"); PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200,8,N,1)\n"); /*开始回环测试*/ while (1) { unsignedcharch; ch=Key_GetKeyPoll();//TODO //获取键值 if(ch! =0) { PRINTF("\r'%c'键按下",ch); //数码管显示 *((U8*)0x20007000)=0x3e; if(ch>='0'&&ch<='9') { ch=ch-48; *((U8*)0x20006000)=seg6table[ch]; } if(ch>='A'&&ch<='F') { ch=ch-55; *((U8*)0x20006000)=seg6table[ch]; } } } } 结果: 数码管上显示出对应的按键值。 五、实验分析及总结 按键的程序可以根据自己的需求修改,也可改变行列,让输入值不同。 本实验中按键的读取是通过Key_GetKeyPoll()来实现的。 实验三中断实验 一、实验目的 1、了解中断的作用; 2、掌握嵌入式系统中断的处理流程; 3、掌握ARM中断编程。 二、实验仪器 JXARM9-2440教学实验箱、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 单片机 实验 报告