西电自动化单片机实验报告.docx
《西电自动化单片机实验报告.docx》由会员分享,可在线阅读,更多相关《西电自动化单片机实验报告.docx(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、单片机实验报告单片机实验报告班级:1304031学号:姓名:实验一:数码管实验一实验目的1.了解数码管的显示原理;2.掌握 JXARM9-2440 中数码管显示编程方法。二实验原理7 段 LED 由 7 个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。LED 显示器的接口一般有静态显示与动态显示接口两种方式。本实验中采用的是动态显示接口,其中数码管扫描控制地址为 0 x20007000,位 0位 5 每位分别对应一个数码管,将其中某位清 0 来选择相应的数码管,地址 0 x20006000 为数码管的数据寄存器。数码管采用共阳方式,向该地址写
2、一个数据就可以控制 LED 的显示,其原理图如图所示。三实验内容及步骤1、六个数码管同时正向显示 0-F,然后反向显示 F-0。1)参照模板工程 leddemo(modulesleddemoleddemo.apj),添加相应的文件,并修改 led 的工程设置;2)创建 led.c 并加入到工程 led 中;3)编写 LED 显示函数 void led_display(void),正向显示 0-F 然后反向显示 F-0,并循环执行以上动作,在每次显示之间延时一段时间;4)编译 led,成功后,下载并运行,观察结果。2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。步骤同上。3、在六个数
3、码管上依次显示“HELLO”,分辨不出轮流显示。步骤同上。4、在每个数码管上递增显示 0-9。步骤同上。四实验程序1、./*/*文件名称:LEDSEG7.C*/*实验现象:数码管依次显示出 0、1,2、9、a、b、C、d、E、F*/*/#define U8 unsigned charunsigned char seg7table16=/*01234567*/0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,/*89ABCDEF*/0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,;void Delay(
4、int time);/*/*函数说明:JXARM9-2410 7 段构共阳数码管测试*/*功能描述:依次在 7 段数码管上显示 0123456789ABCDEF*/*返回代码:无*/*参数说明:无*/*/void Test_Seg7(void)int i;*(U8*)0 x20007000)=0 x00;/*六个数码管都亮*/for(;)for(i=0;i=0 x0;i-)/*数码管从 F 到 0 依次显示出来*/*(U8*)0 x20006000)=seg7tablei;Delay(1000);/TODO/*/*Function name:循环延时子程序*/*Description:循环 t
5、ime 次*/*Return type:void*/*Argument:循环延时计数器*/*/void Delay(int time)int i;int delayLoopCount=1000;for(;time0;time-);for(i=0;i0;time-);for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);实验结果:数码管上显示 HELLO,几乎无延迟,同时显示。4.4./*/*文件名称:LEDSEG7.C*/*实验现象:数码管依次显示出 0、1,2、9、a、b、C、d、E、F*/*/#define U8 unsigned charunsign
6、ed char seg7table10=/*0,1,2,3,4,5,6,7,8,9*/0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;void Delay(int time);/*/*函数说明:JXARM9-2410 7 段构共阳数码管测试*/*功能描述:依次在 7 段数码管上显示 0123456789ABCDEF*/*返回代码:无*/*参数说明:无*/*/void Test_Seg7(void)int i;for(;)*(U8*)0 x20007000)=0 x3E;for(i=0;i0 x0A;i+)*(U8*)0 x
7、20006000)=seg7tablei;Delay(5000);*(U8*)0 x20007000)=0 x3D;for(i=0;i0 x0A;i+)*(U8*)0 x20006000)=seg7tablei;Delay(5000);*(U8*)0 x20007000)=0 x3B;for(i=0;i0 x0A;i+)*(U8*)0 x20006000)=seg7tablei;Delay(5000);*(U8*)0 x20007000)=0 x37;for(i=0;i0 x0A;i+)*(U8*)0 x20006000)=seg7tablei;Delay(5000);*(U8*)0 x200
8、07000)=0 x2F;for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);五结果及分析1六个数码管同时显示,从 0F,接着从 F0 反向显示。分析:通过地址 20007000 选择哪个数码管亮,通过地址 20006000 决定数码管输出的内容。再通过循环可完成轮流显示。2可分辨出:从数码管的右边至左边依次显示 hello分辨不出:数码管上显示 hello。分析:由于改变了 Delay 的数值,导致频率变化,所以可以产生两种效果。3每个数码管递增显示 09。分析:原理同一,靠循环实现。六实验总结1.由于数码管为共阳极,小数点为最高位,A 为最低位,所以
9、显示内容一定要计算正确。2.循环条件要选择正确。实验二:键盘输入实验一实验目的1、学习键盘驱动原理;2、掌握通过 CPU 的 I/O 扩展键盘的方法。二实验原理键盘实现方案采用专门的芯片实现键盘扫描采用软件实现键盘扫描软键盘实现方案当开关打开时,通过处理器的 I/O 口的一个上拉电阻提供逻辑 1;当开关闭合时,处理器的I/O 口的输入将被拉低到逻辑 0。矩阵键盘电路一个瞬时接触开关(按钮)放置在每一行与每一列的交叉点。每一行由一个输出端口的一位驱动,每一列由一个电阻器上拉且供给输入端口一位。键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下一旦处理器判定有一个键按下
10、,键盘扫描软件将过滤掉抖动并且判定哪个键被按下每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动,换句话说,扫描码将告诉应用程序按下哪个键键盘扫描算法初始化:所有的行(输出端口)被强行设置为低电平在没有任何键按下时,所有的列(输入端口)将读到高电平。任何键的闭合将造成其中的一列变为低电平。一旦检测到有键被按下,就需要找出是哪一个键。过程很简单,微处理器只需在其中一行上输出一个低电平。如果它在输入端口上发现一个 0 值,微处理器就知道在所选择行上产生了键的闭合三、实验内容及步骤(一)学习与分析例程中的各个程序以及主要函数,以进一步理解键盘的工作原理。
11、(二)获取按键值,在串口显示。(三)使按键按照如图的顺序显示出来。(四)将键盘按键值在数码管上显示。或自行开发。四实验程序:1./*包含文件*/#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h/*/Function name:Main/Description:JXARM9-2410 键盘实验主程序/实现功能:/Return type:void/Argument:void*/void Main(void)/*配置系统时钟*/ChangeClockDivider(2,1)
12、;U32 mpll_val=0;mpll_val=(9212)|(112)&0 xff,(mpll_val4)&0 x3f,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)unsigned char ch;ch=Key_GetKeyPoll();/TODO/获取键值if(ch!=0)P
13、RINTF(r%c键按下,ch);实验结果:在小键盘上按键,串口上显示按键对应字符,如按 0,串口上显示 0。2.在库函数中改变如下的 key 按键值,使对应于键盘上的位置#include#include 2410addr.h#include 2410lib.h#include timer.h#include interrupt.h#define RECV_CMD_MAX_BUF 2048char recv_bufRECV_CMD_MAX_BUF;intrecv_read=0;intrecv_write=0;char key_recv_bufRECV_CMD_MAX_BUF;intkey_re
14、cv_read=0;intkey_recv_write=0;/键盘扫描inttimer1_count=0;enum KEYBOARD_SCAN_STATUSKEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_SECOND,KEYBOARD_SCAN_THIRD,KEYBOARD_SCAN_FOURTH;int row=0;extern unsigned char output_0 x10000000;unsigned charascii_key,input_key4,input_key14,key_mask=0 x0F;unsigned char*keyboard_port_s
15、can=(unsigned char*)0 x2000C000;unsigned char*keyboard_port_value=(unsigned char*)0 x2000C000;intkeyboard_scan_status4=KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST;char key_get_char(int row,int col)char key=0;switch(row)case 0:if(col&0 x01)=0)key=D;else if(col&0 x0
16、2)=0)key=E;else if(col&0 x04)=0)key=F;else if(col&0 x08)=0)key=0;break;case 1:if(col&0 x01)=0)key=C;else if(col&0 x02)=0)key=7;else if(col&0 x04)=0)key=4;else if(col&0 x08)=0)key=1;break;case 2:if(col&0 x01)=0)key=B;else if(col&0 x02)=0)key=8;else if(col&0 x04)=0)key=5;else if(col&0 x08)=0)key=2;bre
17、ak;case 3:if(col&0 x01)=0)key=A;else if(col&0 x02)=0)key=9;else if(col&0 x04)=0)key=6;else if(col&0 x08)=0)key=3;break;default:break;return key;/*/Function name:recv_key/Description:将获取的键值加入按键缓冲区/Return type:void/Argument:int key*/void recv_key(int key)key_recv_bufkey_recv_write=key;key_recv_write+;
18、if(key_recv_write=RECV_CMD_MAX_BUF)key_recv_write=0;if(key_recv_write=key_recv_read)/缓冲区以满key_recv_read+;if(key_recv_read=RECV_CMD_MAX_BUF)key_recv_read=0;/*/Function name:Kbd_Scan/Description:定时器 1 中断服务程序,用于扫描键盘,每隔 10ms 一次中断/Return type:void/Argument:void*/void Kbd_Scan(void)int loopcnt=row,bexit=0
19、;int temp;/键盘扫描for(loopcnt=row;loopcnt=4)temp=loopcnt-4;elsetemp=loopcnt;switch(keyboard_scan_statustemp)case KEYBOARD_SCAN_FIRST:*keyboard_port_scan=output_0 x10000000&(0 x00000001temp);/*将 row 列置低电平*/keyboard_scan_statustemp=KEYBOARD_SCAN_SECOND;bexit=1;break;case KEYBOARD_SCAN_SECOND:input_keytem
20、p=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/if(input_keytemp=key_mask)keyboard_scan_statustemp=KEYBOARD_SCAN_FIRST;/*没有按键,回到开始状态*/elsekeyboard_scan_statustemp=KEYBOARD_SCAN_THIRD;/*有按键*/bexit=1;break;case KEYBOARD_SCAN_THIRD:if(*keyboard_port_value)&key_mask)!=input_keytemp)keyboard_scan_statuste
21、mp=KEYBOARD_SCAN_FIRST;elseascii_key=key_get_char(temp,input_keytemp);keyboard_scan_statustemp=KEYBOARD_SCAN_FOURTH;*keyboard_port_scan=output_0 x10000000&(0 x00000001temp);/*将 row 列置低电平*/bexit=1;break;case KEYBOARD_SCAN_FOURTH:input_key1temp=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/if(input_key
22、1temp=key_mask)/get a keyrecv_key(ascii_key);keyboard_scan_statustemp=KEYBOARD_SCAN_FIRST;else*keyboard_port_scan=output_0 x10000000&(0 x00000001=RECV_CMD_MAX_BUF)key_recv_read=0;return ch;/*/Function name:Key_GetKeyPoll(查询方式)/Description:如果有键按下返回键,否则返回 0/Return type:char/Argument:*/char Key_GetKeyP
23、oll()int row;unsigned charascii_key,input_key,input_key1,key_mask=0 x0F;for(row=0;row 4;row+)*keyboard_port_scan=output_0 x10000000&(0 x00000001row);/*将row 列置低电平*/Delay(3);/*延时*/input_key=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/if(input_key=key_mask)continue;/*没有按键*/*延时,再次获取扫描值,如果两次的值不等,则认为是一个干
24、扰*/Delay(3);if(*keyboard_port_value)&key_mask)!=input_key)continue;/等待按键松开while(1)*keyboard_port_scan=output_0 x10000000&(0 x00000001row);/*将 row 列置低电平*/Delay(3);input_key1=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/if(input_key1=key_mask)break;/*没有按键*/ascii_key=key_get_char(row,input_key);/*查表*/r
25、eturn ascii_key;/*显示结果*/return 0;实验结果:按下键盘的按键串口会按题图中所示对应显示3./*包含文件*/#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h#include#include#define IIRNUMBER 2#define U8 unsigned charunsigned char table16=/*01234567*/0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,/*8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动化 单片机 实验 报告
限制150内