OA自动化西电自动化单片机实验报告.docx
《OA自动化西电自动化单片机实验报告.docx》由会员分享,可在线阅读,更多相关《OA自动化西电自动化单片机实验报告.docx(98页珍藏版)》请在冰点文库上搜索。
![OA自动化西电自动化单片机实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/4/6cabf1e9-9f93-41c2-a99f-0a29bdcb800f/6cabf1e9-9f93-41c2-a99f-0a29bdcb800f1.gif)
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_