西安电子科技大学机电院单片机上机实验报告第一次实验:编程与环境学习[实验目的]1) 熟悉µ’nSP™ IDE环境及在该环境下用汇编语言或C语言编写应用程序;2) 熟悉简单的µ’nSP™汇编语言指令。
[实验设备]装有WINDOWS系统和µ’nSP™ IDE仿真环境的PC机一台。
[实验内容[1)用汇编实现1到200中的偶数的累加计算;2)用汇编语言编写一个排序程序。
.IRAMArray .DW 5,89,40,12,55,32,18,46,77,21[实验步骤]1)将µ’nSP™ IDE打开后,建立一个新工程;2)在该项目的源文件夹(SOURCE FILES)下建立一个新的汇编语言文件;3)编写汇编代码;4)编译程序软件调试观察并跟踪其结果。
[实验准备](要求实验前写出实验内容中的两个程序)实验1:实验程序:.RAM //定义RAM 段.VAR G_Sum; //定义G_Sum 存储累加结果.CODE //定义CODE.PUBLIC _main; //主程序声_main:R1 = 0x0002;R2 = 0x0000;L_SumLoop:R2 += R1; //累加值保存到R2R1 +=2 ;CMP R1,200; //是否加到100JNAL_SumLoop; //否返回到L_SumLoop;[G_Sum] = R2; //保存最终值L_ProgramEndLoop:JMPL_ProgramEndLoop;.END实验2:实验程序:.IRAMArray .DW 5,89,40,12,55,32,18,46,77,21.var flag//定义数据交换标志.code.public _main_main:R1=0x000a; //设置要比较的数的个数;BP=Array;//取待排序数的有效地址;R4=0x0000;[flag]=R4 ;//清交换标志L_LOOP:R2=[BP];R3=[BP+1];cmp r2,r3;//比较相邻两数的大小;JBE L_LOOP1;[BP]=R3;//不符合大小顺序,交换位置,存储在原位置[BP+1]=R2 ;R3=0x0001 ;[flag]=R3;//交换标志置1L_LOOP1:BP=BP+1;//符合大小顺序的两数位置R1-=1;JNZ L_LOOP;R4=[flag];Jnz _main;MAINLOOP: //看门狗操作nop:jmp MAINLOOP;.END[实验总结]第二次实验:并行I/O口(可参考实验三、四、五、六)实验三:使用汇编语言实现A口的输出实验实验四:使用C语言实现A口的输出实验实验五:使用汇编语言实现A口为输入B口为输出实验实验六:使用C语言实现A口为输入B口为输出实验[实验目的]1)通过实验掌握A口、B口作为输入和输出口时的使用方法;2)使用汇编语言或C语言来实现A口或B口作为输入和输出口的实验。
[实验原理]实验三、四:通过点亮不同发光二极管来显示A口输出的数值不同。
实验五、六:根据按键的不同,A口的数据就不同,则传送到B口的数据就不同,相应的发光二极管被控制。
1)逻辑电平指示灯:具有8 路,阳极接电阻排至V5( Vcc),I/O 端口低电平“点亮”。
逻辑电平指示灯电路8 路图见下图:逻辑电平指示灯电路原理图2)1*8键盘电路可分别“H”或“L”,由SW 选择,配合内部的上拉/下拉电阻合理使用。
1*8 键盘电路原理图[实验硬件连接]实验三、四:实验五、六:[实验内容]1、学习实验三或实验四,写出实验结果。
答:实验三的结果:从低位到高位,按照二进制1出现的顺序,依次点亮对应位的灯。
2、学习实验五或实验六,写出实验结果。
答:实验五的结果:开始时,所有灯全灭,每次按一个开关,相应的灯就是被点亮。
松开后,相应的灯再一次熄灭。
3、对实验五或六修改,将以前的输入与输出口进行变换,即按键连接B口作为输入,A口为输出连接发光二极管,并要求发光二极管事先全灭,按下键时控制相应的二极管亮。
说明如何修改,写出修改地方的程序。
(注:不要在源文件中修改。
重新建立项目或拷贝到其它地方进行修改)Main函数里:L_User_Init_IO: 改为:L_User_Init_IO:R1 = 0x0000; R1 = 0x0000;[P_IOA_Dir] = R1; [P_IOB_Dir] = R1;[P_IOA_Attrib] = R1; [P_IOB_Attrib] = R1;[P_IOA_Data] = R1; [P_IOB_Data] = R1R1 = 0xffff; R1 = 0xffff;[P_IOB_Dir] = R1; [P_IOA_Dir] = R1;[P_IOB_Attrib] = R1; [P_IOA_Attrib] = R1;R1 = 0x0000; R1 = 0x0000;[P_IOB_Data] = R1; [P_IOA_Data] = R1;RETF; RETF;KEY函数里:(1)F_Key_Scan_ServiceLoop:r1 = [P_IOA_Data]; //从IOA口获取按键数据改为:F_Key_Scan_ServiceLoop:r1 = [P_IOB_Data] ; //从IOB口获取按键数据(2)F_Key_Scan_ServiceLoop_2:r1 = [P_IOA_Buffer];//IOA7位置为0r1 &= 0xFF7F;[P_IOA_Buffer] = r1;r1 = [P_IOA_Data]; //从IOA口获取按键数据r1 &= 0x000F;r2 = r1;r3 = r2 xor 0xffff;nop;nop;r1 = [P_IOA_Buffer];// IOA7位置为1r1 |= 0x0080;[P_IOA_Buffer] = r1;r1 = [P_IOA_Data];改为:r1 = [P_IOB_Buffer]; // IOA7位置为0r1 &= 0xFF7F;[P_IOB_Buffer] = r1;r1 = [P_IOB_Data];//从IOB口获取按键数据r1 &= 0x000F;r2 = r1;r3 = r2 xor 0xffff;nop;nop;r1 = [P_IOB_Buffer]; // IOA7位置为1r1 |= 0x0080;[P_IOB_Buffer] = r1;r1 = [P_IOB_Data];(注:程序主要的修改是调换A、B口属性值,由于要求发光二极管事先全灭,所以把原来的同相改为反相,而初始值不变([P_IOB_Data]=0x0000)。
[实验总结]实验三中,题目要求使用B入A出,我一开始,只修改了main.asm中的相关位置,发现结果不对,后来当我一点一点分析后发现,key.asm中的相关代码页需要修改。
最后实验成功了。
在以后的实验中,不但要看懂主程序,也要搞清楚其子程序和相关函数的实现。
第三次实验:系统时钟与定时器参看:实验七:定时器Timer A/B实验实验八:系统时钟实验[实验目的]1)通过实验了解定时器Timer A/B的结构及使用方法;掌握预置数单元P_TimerA/B_Data和定时控制单元P_ TimerA/B_Ctrl的设置方法;熟悉定时器Timer A/B的编程方法。
2)了解SPCE061 PLL 振荡器的功能及其应用;掌握系统时钟单元P_SystemClock的设置方法;熟悉系统时钟和CPU时钟频率的编程方法。
[实验原理]实验七:TimerA和TimerB定时器启动后在预置数单元P_TimerA_Data或P_TimerB_Data内置入一个计数初值N后,定时器/计数器会在选择的时钟源频率下开始向计数增加的方向计数,N+1,N+2,……FFFEH,当计数到FFFFH后定时器/计数器溢出。
一方面,产生一个中断请求信号TA_TimeOut_Int或TB_TimeOut_IntCPU,响应后执行相应的中断服务程序,与此同时计数初值N会被自动重新置入定时器/计数器内并重复上述加计数的过程。
另一方面,该溢出信号会作为脉宽调制输出计数器的时钟源输入,使其输出一个具有四位可调的脉宽调制占空比输出信号APWMO或BPWMO,其中IOB8,IOB9分别为APWM,BPWM的输出端。
IOB8接一个发光二极管,可以通过观察二极管亮灭的快慢来对比频率的变化。
实验八:在SPCE061A内,P_SystemClock(写)($7013H)单元控制着系统时钟和CPU时钟,通过设置该单元的b5-b7位可以改变系统时钟的频率(Fosc=20/24/32/40/49MHz);将第0-2位置为111可以使CPU时钟停止工作,系统切换至低功耗的备用状态。
本实验通过选择不同Fosc信号频率或改变CPUClk频率来观察发光二极管亮灭的快慢。
[实验硬件连接]实验七:定时器A时,IOB8接一个发光二极管实验八:[实验内容]1)学习实验七、八;2)对于实验七,1、固定初值,改变不同的输入时钟观察输出的变化;改变:LED灯闪烁频率发生变化。
频率越大,闪烁越快。
2、固定时钟,如CLK为4096HZ,设置不同的计数初值,观察输出;答:改变R1: R1=0xff9f;[P_TimerA_Data]=R1;R1=C_Time_Clk_4096;LED灯闪烁频率发生变化。
计数初值越小。
闪烁越慢。
3、选择同一时钟源,改变占空比,观察灯的闪烁变化。
答:周期不变,但在一个周期内,LED灯点亮的时间改变。
3)将实验七中的定时器A改用定时器B完成。
应作怎样的修改?写出修改的地方。
.DEFINE P_TimerB_Data 0x700C;.DEFINE P_TimerB_Ctrl 0x700D;_main:R1=0x0200; //IOB9 设置为同相低电平输出口[P_IO B_DIR]=R1;[P_IO B_ATTRI]=R1;R1=0x0000;[P_IO B_DATA ]=R1;R1=0x0200;[P_Feedback]=R1; //设置IOB9 口为BPWMO 端口R1=0xff9f; //设定TA_TIMEOUT/16=(C_Time_Clk/96)/16=8kHz//R1=0x0f9f;[P_Timer B_Data]=R1;R1=C_Time_Clk;//R1=C_Time_Pwm[P_Timer B_Ctrl]=R1;注:定义P_TimerB_Data和P_TimerB_Ctrl,改特殊功能输出口IOB8为IOB9并改变[P_Feedback]的值;4)对实验八1 选择不同FOSC信号频率,观察发光二极管亮灭快慢;2 改变CPUCLK频率,观察发光二极管亮灭快慢。