单片机上机实验报告.docx
- 文档编号:29611311
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:77
- 大小:233.57KB
单片机上机实验报告.docx
《单片机上机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机上机实验报告.docx(77页珍藏版)》请在冰豆网上搜索。
单片机上机实验报告
单片机实验报告
姓名:
班级:
学号:
实验一数码管实验
一、实验目的
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,并循环执行以上动作,在每次显示之间延时一段时间;
4)编译led,成功后,下载并运行,观察结果。
2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。
步骤同上。
3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。
步骤同上。
*4、在每个数码管上递增显示0-9。
步骤同上。
五、实验程序
/****************************************************************************/
/*文件名称:
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++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
for(i=0xf;i>=0x0;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
}
//TODO
}
/****************************************************************************/
/*Functionname:
循环延时子程序*/
/*Description:
循环'time'次*/
/*Returntype:
void*/
/*Argument:
循环延时计数器*/
/****************************************************************************/
voidDelay(inttime){
inti;
intdelayLoopCount=10000;
for(;time>0;time--);
for(i=0;i } voidTest_Seg7(void){ inti; for(;;) { *((U8*)0x20007000)=0x3E; *((U8*)0x20006000)=seg7table[5]; Delay(10000); *((U8*)0x20007000)=0x3D; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3B; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x2F; *((U8*)0x20006000)=seg7table[1]; Delay(10000); } //TODO } 六、结果及分析。 我们了解了数码管的显示原理,基本掌握了JXARM9-2440中数码管显示编程方法,用数码管显示出了,字母和数字。 实验二键盘输入与I/O实验 一、实验目的 1、学习键盘驱动原理; 2、掌握通过CPU的I/O扩展键盘的方法 二、实验仪器 JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机、 串口连接线。 三、实验原理 键盘实现方案: 采用专门的芯片实现键盘扫描 采用软件实现键盘扫描 软键盘实现方案: 当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低到逻辑0。 开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。 尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。 当触点闭合时,其弹起就像一个球。 弹起效果将产生如下图所示的好几个脉冲。 弹起的持续时间通常将维持在5ms~30ms之间。 JXARM9-2440的键盘模块 四、实验内容及步骤 (一)学习与分析例程中的各个程序以及主要函数,以进一步理解键盘的工作原理。 (二)获取按键值,在串口显示。 (三)使按键按照如图的顺序显示出来。 (四)将键盘按键值在数码管上显示。 或自行开发。 步骤: 1)参照模板工程key(modules\key\key.apj),新建一个工程key,添加相应的文件,并修改key的工程设置; 2)创建main.c并加入到工程key中; 3)按照实验内容编写相应程序; 4)编译key; 5)下载程序并运行,按键看串口是否有显示;看数码管是否输出相应键值。 五、实验程序。 Keyboard.c #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='F'; elseif((col&0x02)==0)key='E'; elseif((col&0x04)==0)key='D'; elseif((col&0x08)==0)key='C'; break; case1: if((col&0x01)==0)key='B'; elseif((col&0x02)==0)key='9'; elseif((col&0x04)==0)key='6'; elseif((col&0x08)==0)key='3'; break; case2: if((col&0x01)==0)key='A'; 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='0'; elseif((col&0x02)==0)key='7'; elseif((col&0x04)==0)key='4'; elseif((col&0x08)==0)key='1'; 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_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; } } /******************************************************************** //Functionname: Kbd_Scan //Description: 定时器1中断服务程序,用于扫描键盘,每隔10ms一次中断 //Returntype: void //Argument: void *********************************************************************/ voidKbd_Scan(void) {intloopcnt=row,bexit=0; inttemp; //键盘扫描 for(loopcnt=row;loopcnt {if(loopcnt>=4) temp=loopcnt-4; else temp=loopcnt; switch(keyboard_scan_status[temp]) {caseKEYBOARD_SCAN_FIRST: *keyboard_port_scan=output_0x10000000&(~(0x00000001< keyboard_scan_status[temp]=KEYBOARD_SCAN_SECOND; bexit=1; break; caseKEYBOARD_SCAN_SECOND: input_key[temp]=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/ if(input_key[temp]==key_mask) keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST;/*没有按键,回到开始状态*/ else {keyboard_scan_status[temp]=KEYBOARD_SCAN_THIRD;/*有按键*/ bexit=1; } break; caseKEYBOARD_SCAN_THIRD: if(((*keyboard_port_value)&key_mask)! =input_key[temp]) keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST; else { ascii_key=key_get_char(temp,input_key[temp]); keyboard_scan_status[temp]=KEYBOARD_SCAN_FOURTH; *keyboard_port_scan=output_0x10000000&(~(0x00000001< bexit=1; } break; caseKEYBOARD_SCAN_FOURTH: input_key1[temp]=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/ if(input_key1[temp]==key_mask) { //getakey recv_key(ascii_key); keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST; }else { *keyboard_port_scan=output_0x10000000&(~(0x00000001< bexit=1;} break;} if(bexit) break;} row=temp;} /******************************************************************** //Functionname: Key_GetKey //Description: 如果有键按下返回键,否则返回0 //Returntype: char //Argument: *********************************************************************/ charKey_GetKey() {charch; if(key_recv_write==key_recv_read) {/*nokeyfound*/ ch=0;}else {ch=key_recv_buf[key_recv_read]; key_recv_read++; if(key_recv_read>=RECV_CMD_MAX_BUF) key_recv_read=0;} returnch; } /******************************************************************** //Functionname: Key_GetKeyPoll(查询方式) //Description: 如果有键按下返回键,否则返回0 //Returntype: char //Argument: *********************************************************************/ charKey_GetKeyPoll() {introw; unsignedcharascii_key,input_key,input_key1,key_mask=0x0F; for(row=0;row<4;row++) {*keyboard_port_scan=output_0x10000000&(~(0x00000001< Delay(3);/*延时*/ input_key=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/ if(input_key==key_mask)continue;/*没有按键*/ /*延时,再次获取扫描值,如果两次的值不等,则认为是一个干扰*/ Delay(3); if(((*keyboard_port_value)&key_mask)! =input_key)continue; //等待按键松开 while (1) { *keyboard_port_scan=output_0x10000000&(~(0x00000001< Delay(3); input_key1=(*keyboard_port_value)&key_mask;/*并获取第一次扫描值*/ if(input_key1==key_mask)break;/*没有按键*/} ascii_key=key_get_char(row,input_key);/*查表*/ returnascii_key;/*显示结果*/} return0;} 六、结果及分析。 成功将键盘输入与要求的图上对应。 实验三中断实验 一、实验目的 1、了解中断的作用; 2、掌握嵌入式系统中断的处理流程; 3、掌握ARM中断编程。 二、实验仪器 JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机。 三、实验原理 当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。 这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。 四、实验内容及步骤 (一)学习例程,对其关键程序与设置进行分析。 (二)编写中断处理程序,处理外部中断2,3,控制LED灯闪烁或数码管显示。 1、当外部中断2发生时,使8个LED在亮灭间切换; 2、当外部中断3发生时,使8个LED等依次亮一下。 *3、当中断发生时,控制数码管显示。 步骤: 1)参照模板工程,新建一个工程interrupt,添加相应的文件,并修改interrupt的工程设置; 2)加入如下文件到interrupt中: common\2440lib.c、;asm\2440init.s、asm\2440slib.s和common\interrupt.c。 3)根据实验内容编写外部中断2,3的中断处理程序,并保存为main.c文件,将该文件加入到工程中; 4)编译、下载并运行程序烁。 五、实验程序 1、当外部中断2发生时,使8个LED在亮灭间切换。 /*包含文件*/ #include"def.h" #include"2410
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 上机 实验 报告