OA自动化西电自动化单片机实验报告.docx

上传人:b****7 文档编号:15439981 上传时间:2023-07-04 格式:DOCX 页数:98 大小:47.60KB
下载 相关 举报
OA自动化西电自动化单片机实验报告.docx_第1页
第1页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第2页
第2页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第3页
第3页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第4页
第4页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第5页
第5页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第6页
第6页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第7页
第7页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第8页
第8页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第9页
第9页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第10页
第10页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第11页
第11页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第12页
第12页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第13页
第13页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第14页
第14页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第15页
第15页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第16页
第16页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第17页
第17页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第18页
第18页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第19页
第19页 / 共98页
OA自动化西电自动化单片机实验报告.docx_第20页
第20页 / 共98页
亲,该文档总共98页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

OA自动化西电自动化单片机实验报告.docx

《OA自动化西电自动化单片机实验报告.docx》由会员分享,可在线阅读,更多相关《OA自动化西电自动化单片机实验报告.docx(98页珍藏版)》请在冰点文库上搜索。

OA自动化西电自动化单片机实验报告.docx

OA自动化西电自动化单片机实验报告

(OA自动化)西电自动化单片机实验报告

 

单片机实验报告

 

班级:

1304031

学号:

姓名:

 

实验一:

数码管实验

一.实验目的

1.了解数码管的显示原理;

2.掌握JXARM9-2440中数码管显示编程方法。

二.实验原理

7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。

LED显示器的接口一般有静态显示与动态显示接口两种方式。

本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0来选择相应的数码管,地址0x20006000为数码管的数据寄存器。

数码管采用共阳方式,向该地址写一个数据就可以控制LED的显示,其原理图如图所示。

 

三.实验内容及步骤

1、六个数码管同时正向显示0-F,然后反向显示F-0。

1)参照模板工程leddemo(modules\leddemo\leddemo.apj),添加相应的文件,并修改led的工程设置;

2)创建led.c并加入到工程led中;

3)编写LED显示函数voidled_display(void),正向显示0-F然后反向显示F-0,并循环执行以上动作,在每次显示之间延时一段时间;

4)编译led,成功后,下载并运行,观察结果。

2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。

步骤同上。

3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。

步骤同上。

4、在每个数码管上递增显示0-9。

步骤同上。

四.实验程序

1、./*******************************************************************/

/*文件名称:

LEDSEG7.C*/

/*实验现象:

数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/

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

#defineU8unsignedchar

unsignedcharseg7table[16]={

/*01234567*/

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

/*89ABCDEF*/

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,

};

voidDelay(inttime);

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

/*函数说明:

JXARM9-24107段构共阳数码管测试*/

/*功能描述:

依次在7段数码管上显示0123456789ABCDEF*/

/*返回代码:

无*/

/*参数说明:

无*/

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

voidTest_Seg7(void)

{

inti;

*((U8*)0x20007000)=0x00;/*六个数码管都亮*/

for(;;)

{

for(i=0;i<0x10;i++)/*数码管从0到F依次显示出来*/

{

*((U8*)0x20006000)=seg7table[i];

Delay(1000);

}

for(0xf;i>=0x0;i--)/*数码管从F到0依次显示出来*/

{

*((U8*)0x20006000)=seg7table[i];

Delay(1000);

}

}

//TODO

}

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

/*Functionname:

循环延时子程序*/

/*Description:

循环'time'次*/

/*Returntype:

void*/

/*Argument:

循环延时计数器*/

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

voidDelay(inttime)

{

inti;

intdelayLoopCount=1000;

for(;time>0;time--);

for(i=0;i

}

实验结果:

6个数码管上一次显示0,1,2…F,然后从F到0循环。

2./*******************************************************************/

/*文件名称:

LEDSEG7.C*/

/*实验现象:

数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/

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

#defineU8unsignedchar

unsignedcharseg7table[4]={/*OLEH*/0xC0,0xC7,0x86,0x89};

voidDelay(inttime);

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

/*函数说明:

JXARM9-24107段构共阳数码管测试*/

/*功能描述:

依次在7段数码管上显示0123456789ABCDEF*/

/*返回代码:

无*/

/*参数说明:

无*/

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

voidTest_Seg7(void)

{

for(;;)

{

*((U8*)0x20007000)=0x3E;//**111110

*((U8*)0x20006000)=seg7table[0];//第一个数码管显示O

Delay(1000);

*((U8*)0x20007000)=0x3D;//**111101

*((U8*)0x20006000)=seg7table[1];//第二个数码管显示L

Delay(1000);

*((U8*)0x20007000)=0x3B;//**111011

*((U8*)0x20006000)=seg7table[1];//第三个数码管显示L

Delay(1000);

*((U8*)0x20007000)=0x37;//**110111

*((U8*)0x20006000)=seg7table[2];//第四个数码管显示E

Delay(1000);

*((U8*)0x20007000)=0x2F;//**101111

*((U8*)0x20006000)=seg7table[3];//第五个数码管显示H

Delay(1000);

}

}

//TODO

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

/*Functionname:

循环延时子程序*/

/*Description:

循环'time'次*/

/*Returntype:

void*/

/*Argument:

循环延时计数器*/

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

voidDelay(inttime)

{

inti;

intdelayLoopCount=1000;

for(;time>0;time--);

for(i=0;i

}

实验结果:

从左到右一次显示HELLO,之间有明显延迟。

3./*******************************************************************/

/*文件名称:

LEDSEG7.C*/

/*实验现象:

数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/

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

#defineU8unsignedchar

unsignedcharseg7table[4]={/*OLEH*/0xC0,0xC7,0x86,0x89};

voidDelay(inttime);

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

/*函数说明:

JXARM9-24107段构共阳数码管测试*/

/*功能描述:

依次在7段数码管上显示0123456789ABCDEF*/

/*返回代码:

无*/

/*参数说明:

无*/

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

voidTest_Seg7(void)

{

for(;;)

{

*((U8*)0x20007000)=0x3E;//**111110

*((U8*)0x20006000)=seg7table[0];//第一个数码管显示O

Delay(5);

*((U8*)0x20007000)=0x3D;//**111101

*((U8*)0x20006000)=seg7table[1];//第二个数码管显示L

Delay(5);

*((U8*)0x20007000)=0x3B;//**111011

*((U8*)0x20006000)=seg7table[1];//第三个数码管显示L

Delay(5);

*((U8*)0x20007000)=0x37;//**110111

*((U8*)0x20006000)=seg7table[2];//第四个数码管显示E

Delay(5);

*((U8*)0x20007000)=0x2F;//**101111

*((U8*)0x20006000)=seg7table[3];//第五个数码管显示H

Delay(5);

}

}

//TODO

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

/*Functionname:

循环延时子程序*/

/*Description:

循环'time'次*/

/*Returntype:

void*/

/*Argument:

循环延时计数器*/

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

voidDelay(inttime)

{

inti;

intdelayLoopCount=5;

for(;time>0;time--);

for(i=0;i

}

实验结果:

数码管上显示HELLO,几乎无延迟,同时显示。

4./*****************************************************************/

/*文件名称:

LEDSEG7.C*/

/*实验现象:

数码管依次显示出0、1,2、……9、a、b、C、d、E、F*/

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

#defineU8unsignedchar

unsignedcharseg7table[10]={/*0,1,2,3,4,5,6,7,8,9*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voidDelay(inttime);

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

/*函数说明:

JXARM9-24107段构共阳数码管测试*/

/*功能描述:

依次在7段数码管上显示0123456789ABCDEF*/

/*返回代码:

无*/

/*参数说明:

无*/

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

voidTest_Seg7(void)

{inti;

for(;;)

{

*((U8*)0x20007000)=0x3E;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x3D;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x3B;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x37;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x2F;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

}

}

//TODO

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

/*Functionname:

循环延时子程序*/

/*Description:

循环'time'次*/

/*Returntype:

void*/

/*Argument:

循环延时计数器*/

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

voidDelay(inttime){

inti;

intdelayLoopCount=10000;

for(;time>0;time--);

for(i=0;i

}

五.结果及分析

1.六个数码管同时显示,从0——F,接着从F——0反向显示。

分析:

通过地址20007000选择哪个数码管亮,通过地址20006000决定数码管输出的内容。

再通过循环可完成轮流显示。

2.可分辨出:

从数码管的右边至左边依次显示hello

分辨不出:

数码管上显示hello。

分析:

由于改变了Delay的数值,导致频率变化,所以可以产生两种效果。

3.每个数码管递增显示0——9。

分析:

原理同一,靠循环实现。

六.实验总结

1.由于数码管为共阳极,小数点为最高位,A为最低位,所以显示内容一定要计算正确。

2.循环条件要选择正确。

 

实验二:

键盘输入实验

一.实验目的

1、学习键盘驱动原理;

2、掌握通过CPU的I/O扩展键盘的方法。

二.实验原理

键盘实现方案

采用专门的芯片实现键盘扫描

采用软件实现键盘扫描

软键盘实现方案

当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低到逻辑0。

 

矩阵键盘电路

一个瞬时接触开关(按钮)放置在每一行与每一列的交叉点。

每一行由一个输出端口的一位驱动,每一列由一个电阻器上拉且供给输入端口一位。

键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下

一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下

每个键被分配一个称为扫描码的唯一标识符。

应用程序利用该扫描码,根据按下的键来判定应该采取什么行动,换句话说,扫描码将告诉应用程序按下哪个键

键盘扫描算法

初始化:

所有的行(输出端口)被强行设置为低电平在没有任何键按下时,所有的列(输入端口)将读到高电平。

任何键的闭合将造成其中的一列变为低电平。

一旦检测到有键被按下,就需要找出是哪一个键。

过程很简单,微处理器只需在其中一行上输出一个低电平。

如果它在输入端口上发现一个0值,微处理器就知道在所选择行上产生了键的闭合

三、实验内容及步骤

(一)学习与分析例程中的各个程序以及主要函数,以进一步理解键盘的工作原理。

(二)获取按键值,在串口显示。

(三)使按键按照如图的顺序显示出来。

(四)将键盘按键值在数码管上显示。

或自行开发。

四.实验程序:

1./*包含文件*/

#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);

}

}

}

实验结果:

在小键盘上按键,串口上显示按键对应字符,如按0,串口上显示0。

2.在库函数中改变如下的key按键值,使对应于键盘上的位置

#include

#include"2410addr.h"

#include"2410lib.h"

#include"timer.h"

#include"interrupt.h"

 

#defineRECV_CMD_MAX_BUF2048

charrecv_buf[RECV_CMD_MAX_BUF];

intrecv_read=0;

intrecv_write=0;

charkey_recv_buf[RECV_CMD_MAX_BUF];

intkey_recv_read=0;

intkey_recv_write=0;

//键盘扫描

inttimer1_count=0;

enumKEYBOARD_SCAN_STATUS

{

KEYBOARD_SCAN_FIRST,

KEYBOARD_SCAN_SECOND,

KEYBOARD_SCAN_THIRD,

KEYBOARD_SCAN_FOURTH

};

introw=0;

externunsignedcharoutput_0x10000000;

unsignedcharascii_key,input_key[4],input_key1[4],key_mask=0x0F;

unsignedchar*keyboard_port_scan=(unsignedchar*)0x2000C000;

unsignedchar*keyboard_port_value=(unsignedchar*)0x2000C000;

intkeyboard_scan_status[4]={

KEYBOARD_SCAN_FIRST,

KEYBOARD_SCAN_FIRST,

KEYBOARD_SCAN_FIRST,

KEYBOARD_SCAN_FIRST

};

charkey_get_char(introw,intcol)

{

charkey=0;

switch(row)

{

case0:

if((col&0x01)==0)key='D';

elseif((col&0x02)==0)key='E';

elseif((col&0x04)==0)key='F';

elseif((col&0x08)==0)key='0';

break;

case1:

if((col&0x01)==0)key='C';

elseif((col&0x02)==0)key='7';

elseif((col&0x04)==0)key='4';

elseif((col&0x08)==0)key='1';

break;

case2:

if((col&0x01)==0)key='B';

elseif((col&0x02)==0)key='8';

elseif((col&0x04)==0)key='5';

elseif((col&0x08)==0)key='2';

break;

case3:

if((col&0x01)==0)key='A';

elseif((col&0x02)==0)key='9';

elseif((col&0x04)==0)key='6';

elseif((col&0x08)==0)key='3';

break;

default:

break;

}

returnkey;

}

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

//Functionname:

recv_key

//Description:

将获取的键值加入按键缓冲区

//Returntype:

void

//Argument:

intkey

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

voidrecv_key(intkey)

{

key_recv_buf[key_recv_write]=key;

key_recv_write++;

if(key_recv_

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2