欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

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

    • 资源ID:1675558       资源大小:646.35KB        全文页数:67页
    • 资源格式: DOCX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    单片机实验报告 班级:1304031 学号: 姓名: 实验一:数码管实验一实验目的1.了解数码管的显示原理;2.掌握JXARM9-2440 中数码管显示编程方法。二实验原理7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。LED显示器的接口一般有静态显示与动态显示接口两种方式。本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。数码管采用共阳方式,向该地址写一个数据就可以控制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、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。步骤同上。4、在每个数码管上递增显示0-9 。步骤同上。四实验程序1、./*/*文件名称: LEDSEG7.C */*实验现象: 数码管依次显示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;void Delay(int time);/*/* 函数说明: JXARM9-2410 7段构共阳数码管测试 */* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */* 返回代码: 无 */* 参数说明: 无 */*/void Test_Seg7(void) int i; *(U8*)0x20007000)=0x00; /*六个数码管都亮*/ for( ; ;)for(i=0;i<0x10;i+) /*数码管从0到F依次显示出来*/ *(U8*)0x20006000)=seg7tablei; Delay(1000);for(0xf;i>=0x0;i-) /*数码管从F到0依次显示出来*/ *(U8*)0x20006000)=seg7tablei; Delay(1000);/ TODO /*/* Function name : 循环延时子程序 */* Description : 循环 'time' 次 */* Return type :void */* Argument : 循环延时计数器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);实验结果:6个数码管上一次显示0,1,2F,然后从F到0循环。2./*/*文件名称: LEDSEG7.C */*实验现象: 数码管依次显示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table4= /*O L E H*/ 0xC0,0xC7,0x86,0x89;void Delay(int time);/*/* 函数说明: JXARM9-2410 7段构共阳数码管测试 */* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */* 返回代码: 无 */* 参数说明: 无 */*/void Test_Seg7(void) for( ; ;) *(U8*)0x20007000)=0x3E; /*111110 *(U8*)0x20006000)=seg7table0; /第一个数码管显示O Delay(1000); *(U8*)0x20007000)=0x3D; /*111101 *(U8*)0x20006000)=seg7table1; /第二个数码管显示L Delay(1000); *(U8*)0x20007000)=0x3B; /*111011 *(U8*)0x20006000)=seg7table1; /第三个数码管显示L Delay(1000); *(U8*)0x20007000)=0x37; /*110111 *(U8*)0x20006000)=seg7table2; /第四个数码管显示E Delay(1000); *(U8*)0x20007000)=0x2F; /*101111 *(U8*)0x20006000)=seg7table3; /第五个数码管显示H Delay(1000); / TODO /*/* Function name : 循环延时子程序 */* Description : 循环 'time' 次 */* Return type :void */* Argument : 循环延时计数器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);实验结果:从左到右一次显示HELLO,之间有明显延迟。3./*/*文件名称: LEDSEG7.C */*实验现象: 数码管依次显示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table4= /*O L E H*/ 0xC0,0xC7,0x86,0x89;void Delay(int time);/*/* 函数说明: JXARM9-2410 7段构共阳数码管测试 */* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */* 返回代码: 无 */* 参数说明: 无 */*/void Test_Seg7(void) for( ; ;) *(U8*)0x20007000)=0x3E; /*111110 *(U8*)0x20006000)=seg7table0; /第一个数码管显示O Delay(5); *(U8*)0x20007000)=0x3D; /*111101 *(U8*)0x20006000)=seg7table1; /第二个数码管显示L Delay(5); *(U8*)0x20007000)=0x3B; /*111011 *(U8*)0x20006000)=seg7table1; /第三个数码管显示L Delay(5); *(U8*)0x20007000)=0x37; /*110111 *(U8*)0x20006000)=seg7table2; /第四个数码管显示E Delay(5); *(U8*)0x20007000)=0x2F; /*101111 *(U8*)0x20006000)=seg7table3; /第五个数码管显示H Delay(5); / TODO /*/* Function name : 循环延时子程序 */* Description : 循环 'time' 次 */* Return type :void */* Argument : 循环延时计数器 */*/void Delay(int time) int i;int delayLoopCount=5; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);实验结果:数码管上显示HELLO,几乎无延迟,同时显示。4./*/*文件名称: LEDSEG7.C */*实验现象: 数码管依次显示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table10= /*0,1,2,3,4,5,6,7,8,9*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90;void Delay(int time);/*/* 函数说明: JXARM9-2410 7段构共阳数码管测试 */* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */* 返回代码: 无 */* 参数说明: 无 */*/void Test_Seg7(void) int i; for( ; ;) *(U8*)0x20007000)=0x3E; for(i=0;i<0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3D; for(i=0;i<0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3B; for(i=0;i<0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x37; for(i=0;i<0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x2F; for(i=0;i<0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); / TODO /*/* Function name : 循环延时子程序 */* Description : 循环 'time' 次 */* Return type :void */* Argument : 循环延时计数器 */*/void Delay(int time) int i;int delayLoopCount=10000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);五结果及分析1六个数码管同时显示,从0F,接着从F0反向显示。分析:通过地址20007000选择哪个数码管亮,通过地址20006000决定数码管输出的内容。再通过循环可完成轮流显示。2可分辨出:从数码管的右边至左边依次显示hello分辨不出:数码管上显示hello。分析:由于改变了Delay的数值,导致频率变化,所以可以产生两种效果。3每个数码管递增显示09。分析:原理同一,靠循环实现。六实验总结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"/*/ Function name: Main/ Description : JXARM9-2410 键盘实验主程序/ 实现功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系统时钟 */ ChangeClockDivider(2,1); U32 mpll_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)unsigned char ch;ch=Key_GetKeyPoll();/ TODO / 获取键值if(ch != 0) PRINTF("r'%c'键按下", ch);实验结果:在小键盘上按键,串口上显示按键对应字符,如按0,串口上显示0。2.在库函数中改变如下的key按键值,使对应于键盘上的位置#include <string.h>#include "2410addr.h"#include "2410lib.h"#include "timer.h"#include "interrupt.h"#define RECV_CMD_MAX_BUF 2048char recv_bufRECV_CMD_MAX_BUF;int recv_read = 0;int recv_write = 0;char key_recv_bufRECV_CMD_MAX_BUF;int key_recv_read = 0;int key_recv_write = 0;/ 键盘扫描int timer1_count = 0;enum KEYBOARD_SCAN_STATUSKEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_SECOND,KEYBOARD_SCAN_THIRD,KEYBOARD_SCAN_FOURTH;int row = 0;extern unsigned char output_0x10000000;unsigned char ascii_key, input_key4, input_key14, key_mask = 0x0F;unsigned char*keyboard_port_scan = (unsigned char*)0x2000C000;unsigned char*keyboard_port_value = (unsigned char*)0x2000C000;int keyboard_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 & 0x01) = 0) key = 'D' else if(col & 0x02) = 0) key = 'E' else if(col & 0x04) = 0) key = 'F' else if(col & 0x08) = 0) key = '0' break;case 1:if(col & 0x01) = 0) key = 'C' else if(col & 0x02) = 0) key = '7' else if(col & 0x04) = 0) key = '4'else if(col & 0x08) = 0) key = '1'break;case 2:if(col & 0x01) = 0) key = 'B' else if(col & 0x02) = 0) key = '8' else if(col & 0x04) = 0) key = '5' else if(col & 0x08) = 0) key = '2' break;case 3:if(col & 0x01) = 0) key = 'A' else if(col & 0x02) = 0) key = '9' else if(col & 0x04) = 0) key = '6' else if(col & 0x08) = 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 +;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;int temp;/ 键盘扫描for( loopcnt = row; loopcnt < row + 4; loopcnt +)if(loopcnt >= 4)temp = loopcnt - 4;elsetemp = loopcnt;switch(keyboard_scan_statustemp)case KEYBOARD_SCAN_FIRST:*keyboard_port_scan = output_0x10000000 & (0x00000001<<temp); /*将row列置低电平*/keyboard_scan_statustemp = KEYBOARD_SCAN_SECOND;bexit = 1;break;case KEYBOARD_SCAN_SECOND:input_keytemp = (*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_statustemp = KEYBOARD_SCAN_FIRST;elseascii_key = key_get_char(temp, input_keytemp);keyboard_scan_statustemp = KEYBOARD_SCAN_FOURTH;*keyboard_port_scan = output_0x10000000 & (0x00000001<<temp); /*将row列置低电平*/bexit = 1;

    注意事项

    本文(西电自动化单片机实验报告.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开