单片机实验报告.docx
- 文档编号:29189620
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:39
- 大小:244.29KB
单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
单片机实验报告
西安电子科技大学
机电院
单片机上机实验报告
第一次实验:
编程与环境学习
[实验目的]
1)熟悉µ’nSP™IDE环境及在该环境下用汇编语言或C语言编写应用程序;
2)熟悉简单的µ’nSP™汇编语言指令。
[实验设备]
装有WINDOWS系统和µ’nSP™IDE仿真环境的PC机一台。
[实验内容[
1)用汇编实现1到200中的偶数的累加计算;
2)用汇编语言编写一个排序程序。
.IRAM
Array.DW5,89,40,12,55,32,18,46,77,21
[实验步骤]
1)将µ’nSP™IDE打开后,建立一个新工程;
2)在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件;
3)编写汇编代码;
4)编译程序软件调试观察并跟踪其结果。
[实验准备]
(要求实验前写出实验内容中的两个程序)
实验1:
实验程序:
.RAM//定义RAM段
.VARG_Sum;//定义G_Sum存储累加结果
.CODE//定义CODE
.PUBLIC_main;//主程序声
_main:
R1=0x0002;
R2=0x0000;
L_SumLoop:
R2+=R1;//累加值保存到R2
R1+=2;
CMPR1,200;//是否加到100
JNAL_SumLoop;//否返回到L_SumLoop;
[G_Sum]=R2;//保存最终值
L_ProgramEndLoop:
JMPL_ProgramEndLoop;
.END
实验2:
实验程序:
.IRAM
Array.DW5,89,40,12,55,32,18,46,77,21
.varflag//定义数据交换标志
.code
.public_main
_main:
R1=0x000a;//设置要比较的数的个数;
BP=Array;//取待排序数的有效地址;
R4=0x0000;
[flag]=R4;//清交换标志
L_LOOP:
R2=[BP];
R3=[BP+1];
cmpr2,r3;//比较相邻两数的大小;
JBEL_LOOP1;
[BP]=R3;//不符合大小顺序,交换位置,存储在原位置
[BP+1]=R2;
R3=0x0001;
[flag]=R3;//交换标志置1
L_LOOP1:
BP=BP+1;//符合大小顺序的两数位置
R1-=1;
JNZL_LOOP;
R4=[flag];
Jnz_main;
MAINLOOP:
//看门狗操作
nop:
jmpMAINLOOP;
.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]=R1
R1=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位置为0
r1&=0xFF7F;
[P_IOA_Buffer]=r1;
r1=[P_IOA_Data];//从IOA口获取按键数据
r1&=0x000F;
r2=r1;
r3=r2xor0xffff;
nop;
nop;
r1=[P_IOA_Buffer];//IOA7位置为1
r1|=0x0080;
[P_IOA_Buffer]=r1;
r1=[P_IOA_Data];
改为:
r1=[P_IOB_Buffer];//IOA7位置为0
r1&=0xFF7F;
[P_IOB_Buffer]=r1;
r1=[P_IOB_Data];//从IOB口获取按键数据
r1&=0x000F;
r2=r1;
r3=r2xor0xffff;
nop;
nop;
r1=[P_IOB_Buffer];//IOA7位置为1
r1|=0x0080;
[P_IOB_Buffer]=r1;
r1=[P_IOB_Data];
(注:
程序主要的修改是调换A、B口属性值,由于要求发光二极管事先全灭,所以把原来的同相改为反相,而初始值不变([P_IOB_Data]=0x0000)。
[实验总结]
实验三中,题目要求使用B入A出,我一开始,只修改了main.asm中的相关位置,发现结果不对,后来当我一点一点分析后发现,key.asm中的相关代码页需要修改。
最后实验成功了。
在以后的实验中,不但要看懂主程序,也要搞清楚其子程序和相关函数的实现。
第三次实验:
系统时钟与定时器
参看:
实验七:
定时器TimerA/B实验
实验八:
系统时钟实验
[实验目的]
1)通过实验了解定时器TimerA/B的结构及使用方法;掌握预置数单元P_TimerA/B_Data和定时控制单元P_TimerA/B_Ctrl的设置方法;熟悉定时器TimerA/B的编程方法。
2)了解SPCE061PLL振荡器的功能及其应用;掌握系统时钟单元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完成。
应作怎样的修改?
写出修改的地方。
.DEFINEP_TimerB_Data0x700C;
.DEFINEP_TimerB_Ctrl0x700D;
_main:
R1=0x0200;//IOB9设置为同相低电平输出口
[P_IOB_DIR]=R1;
[P_IOB_ATTRI]=R1;
R1=0x0000;
[P_IOB_DATA]=R1;
R1=0x0200;
[P_Feedback]=R1;//设置IOB9口为BPWMO端口
R1=0xff9f;//设定TA_TIMEOUT/16=(C_Time_Clk/96)/16=8kHz
//R1=0x0f9f;
[P_TimerB_Data]=R1;
R1=C_Time_Clk;
//R1=C_Time_Pwm
[P_TimerB_Ctrl]=R1;
注:
定义P_TimerB_Data和P_TimerB_Ctrl,改特殊功能输出口IOB8为IOB9并改变[P_Feedback]的值;
4)对实验八
1选择不同FOSC信号频率,观察发光二极管亮灭快慢;
2改变CPUCLK频率,观察发光二极管亮灭快慢。
答:
不同的FOSC信号频率和CPUCLK频率决定了程序语句执行速度的快慢,进而决定了延时子程序所延时间的长短,即显示灯亮灭时间的长短,所以当两者频率增大时,发光二极管亮灭变快。
[实验总结]
在本次试验中,我学会了如何通过改变计数初值和输入时钟的频率来产生不同频率的输出信号。
最值得注意的是TimerA和TimerB的脉宽调制输出端口是不一样的。
第四次实验:
A/D转换,双通道D/A
参看:
实验十七:
A/D转换
实验十八:
双通道D/A
实验十九:
一路输入的录音
[实验目的]
1)了解ADC输入接口的结构与转换原理;熟悉模拟量输入口LINE_IN1—LINE_IN7的使用;掌握P_ADCP_ADC_Ctrl单元的设置方法。
2)了解音频输出接口的结构与转换原理;掌握P_DAC2P_DAC1P_DAC_Ctrl单元的设置方法。
3)了解ADC输入接口的结构转换原理及实时录音并实时播放的功能;熟悉麦克风输入口MIC_IN的使用;进一步掌握P_ADC、P_ADC_Ctrl、P_DAC1、P_DAC2、P_DAC_Ctrl各单元的设置方法。
[实验设备]同以前实验。
[实验内容]
1)学习实验十七,观察结果,并说明实现A/D转换,需要对哪些寄存器进行设置?
各完成什么任务?
答:
结果:
转动旋钮,八个LED灯以二进制的形式亮灭,表示当前输入的大小。
寄存器设置:
①P_IOB_ATTRI、P_IOB_DIR、P_IOB_DATA:
IOB口设置为同向输出口。
②P_ADC_MUX_Ctrl:
选择通道LINE_IN。
③P_ADC_Ctrl:
允许A/D转换
2)学习实验十八,观察结果,并说明实现D/A转换,需要对哪些寄存器进行设置?
各完成什么任务?
如何实现三角波?
答:
结果:
声音逐渐增大后,突然消失。
并循环往复。
寄存器设置:
1P_DAC_Ctrl:
设置DAC输出数据锁存方式,A/D转换方式。
2 ②P_DAC1、P_DAC2:
输出。
每次让R1加一个数R3并输出。
这样声音逐渐增大。
当R1溢出时,此时R1=0,声音消失。
以此循环往复,实现三角波。
3)学习十九,观察结果,并说明实验的原理。
答:
设定定时器A的频率,即为采样率。
采用自动方式,当定时器A溢出时,触发中断,进入中断服务程序。
把通过MIC_IN输入的语音信号经过A/D转换后,再经过D/A转换,并在通过AUD1和AUD2两个通道播放
[实验总结]
通过本次试验,我学会了在凌阳16为单片机上经行数模和模数转化。
并完成了录音和放音的功能
第五次实验:
中断实验
参看包括实验九、十、十一、十二、十三、十四、十五
实验九:
FIQ中断实验
实验十:
IRQ0/IRQ1/IRQ2中断实验
实验十一:
IRQ4中断
实验十二:
IRQ5中断实验
实验十三:
IRQ6中断实验
实验十四:
外部中断EXT1,EXT2实验
实验十五:
键唤醒
[实验目的]
1)了解各中断向量和中断源;掌握中断控制单元P_INT_Ctrl,P_INT_Clear的设置方法;熟悉中断的编程方法。
2)了解SPCE061睡眠和唤醒的结构原理;熟悉SPCE061睡眠和唤醒的编程方法。
[实验设备]同上
[实验原理]
实验九:
FIQ中断对应PWM、TMA、TMB中断源;通过写P_INT_Ctrl来设置中断允许,FIQ_TMA,FIQ_TMB中断源分别是通过定时器A、定时器B产生的。
当计满溢出时产生中断请求信号TA_TIMEOUT_Int或TB_TIMEOUT_Int,CPU响应后进入中断执行相应的子程序,中断程序里可以通过读取P_INT_Ctrl单元,判断是哪个中断源并进入相应的子程序控制发光二极管点亮。
实验十:
IRQ0_TWM、IRQ1_TMA、IRQ2_TMB中断源,通过写P_INT_Ctrl来设置中断允许,IRQ_TMA和IRQ_TMB中断源分别是通过定时器A、定时器B产生的。
当计数满溢出时产生中断请求信号TA_TIMEOUT_Int或TB_TIMEOUT_IntCPU,响应后进入对应的中断,并在相应的中断程序里执行控制发光二极管亮灭的程序。
实验十一、十二、十三、十四:
IRQ3、IRQ4、IRQ5、IRQ6中断分别对应不同频率的中断源,通过写P_INT_Ctrl来设置中断允许,CPU响应后进入中断,编写一个用中断方式控制发光二极管亮灭的程序,中断程序里读取P_INT_Ctrl单元,判断是哪个中断源,转到相应中断程序,控制对应发光二极管亮或灭。
IRQ3是外部中断。
实验十五:
系统正常运行时点亮8个LED,按KEY1,系统接收到睡眠信号时,关闭系统时钟(PLL振荡器)进入睡眠状态,8个LED全部熄灭,系统睡眠指示灯(黄色LED)被点亮,按任意键,收到唤醒信号后接通系统时钟(PLL振荡器),同时CPU会响应唤醒事件的处理并进行初始化,这时8个LED循环亮灭。
[实验硬件连接]
实验九:
A口的低四位接LED灯,B口的低四位接LED灯
实验十:
A口的低四位接LED灯,B口的低四位接LED灯
实验十一:
IRQ4中断有三个中断源1KHz、2KHz和4KHz,每一个中断分别控制与IOA0-IOA1、IOA2-IOA3和IOA4-IOA7相连的LED灯。
实验十二:
IRQ5中断有两个中断源2Hz和4Hz,每个中断分别控制二极管的亮灭,即2Hz中断控制与A口的IOA0-IOA3位相连的LED,4Hz中断控制与IOB口的IOB0-IOB3位相连的LED灯。
实验十三:
中断有两个中断源IRQ6_TMB1和IRQ6_TMB2,每个中断都控制着二极管亮灭,即IRQ6_TMB2中断控制与B口的低4位相连的LED的亮灭,IRQ6_TMB1中断控制与A口的低4位相连的LED的亮灭。
实验十四:
实验十五:
[实验内容]
1)按照要求学习实验十一、十二、十三、十四、十五。
分别记录各实验的结果。
实验十一:
与IOA0-IOA1相连的灯:
1秒亮,1秒灭,以此循环。
与IOA2-IOA3相连的灯:
0.5秒亮,0.5秒灭,以此循环。
与IOA4-IOA7相连的灯:
0.25秒亮,0.25秒灭,以此循环。
实验十二:
与IOA0-IOA3相连的灯:
1秒亮,1秒灭,以此循环。
与IOB0-IOB3相连的灯:
0.5秒亮,0.5秒灭,以此循环。
实验十三:
与IOA0-IOA3相连的灯:
1秒亮,1秒灭,以此循环。
与IOB0-IOB3相连的灯:
0.5秒亮,0.5秒灭,以此循环。
实验十四:
当与IOB2相连的开关产生一个负跳沿时,与IOA0-IOA3相连的LED灯点亮。
当与IOB3相连的开关产生一个负跳沿时,与IOA4-IOA7相连的LED灯点亮。
实验十五:
当与IOA0相连的键按下时,进入睡眠,熄灭与IOB0-IOB7相连LED灯。
按任
意键唤醒,循环熄灭与IOB0-IOB7相连LED灯。
2)编写完整的项目(或选择一个合适的实验进行拷贝,然后修改),实现定时器A,B中断,控制发光A口和B口二极管分别以2s,4s周期闪烁;
说明实现的原理,写出关键的程序语句。
答:
实现原理:
IRQ1_TMA、IRQ2_TMB中断源,通过写P_INT_Ctrl来设置中断允许,IRQ_TMA和IRQ_TMB中断源分别是通过定时器A、定时器B产生的。
当计数满溢出时产生中断请求信号TA_TIMEOUT_Int或TB_TIMEOUT_Int,CPU响应后进入对应的中断,并在相应的中断程序里执行控制发光二极管亮灭的程序。
实验程序:
//*****************************************************************************/
//名称:
IRQ_0_1_2
//来源:
《SPCE061A单片机实验指导书》,"实验十IRQ0/IRQ1/IRQ2中断实验"
//描述:
IRQ0_PWM、IRQ1_TMA、IRQ2_TMB三个中断,当定时器A或B
//计满溢出时产生中断请求信号TA_TIMEOUT_INT或TA_TIMEOUT_INT,
//CPU响应后执行相应的中断服务子程序
//A口的低四位接LED灯,B口的低四位接LED灯.
//日期:
2002/12/5
//*****************************************************************************/
.DEFINEP_IOA_DATA0x7000;
.DEFINEP_IOA_DIR0x7002;
.DEFINEP_IOA_ATTRI0x7003;
.DEFINEP_IOB_DATA0x7005;
.DEFINEP_IOB_DIR0x7007;
.DEFINEP_IOB_ATTRI0x7008;
.DEFINEP_INT_CTRL0x7010;
.DEFINEP_INT_CLEAR0x7011;
.DEFINEP_TimerA_Data0x700A;
.DEFINEP_TimerA_Ctrl0x700B;
.DEFINEP_TimerB_Data0x700C;
.DEFINEP_TimerB_Ctrl0x700D;
.DEFINEC_Timea_Clk0x020d;1024
.DEFINEC_Timeb_Clk0x0004;4096
.CODE
//=============================================================================
//函数:
main()
//描述:
主函数
//=============================================================================
.PUBLIC_main
_main:
INToff;
R1=0xffff;//A口设置为同相高电平输出
[P_IOA_ATTRI]=R1;
[P_IOA_DIR]=R1;
//R1=0x0000;
[P_IOA_DATA]=R1;
R1=0xffff;//B口设置为同相高电平输出
[P_IOB_DIR]=R1;
[P_IOB_ATTRI]=R1;
//R1=0x0000;
[P_IOB_DATA]=R1;
R1=0xfbff;
[P_TimerA_Data] = R1;
R1=0xdfff;
[P_TimerB_Data] = R1;
R1=C_Timea_Clk;
[P_TimerA_Ctrl]=R1;
R1=C_Timeb_Clk;
[P_TimerB_Ctrl]=R1;
R1=0x5400;//开中断IRQ0_TMA、IRQ1_TMA、IRQ1_TMB
[P_INT_CTRL]=R1;
INTIRQ;
L_Loop:
NOP;
NOP;
NOP;
JMPL_Loop;
.TEXT
.PUBLIC_IRQ0;
.PUBLIC_IRQ1;
.PUBLIC_IRQ2;
_IRQ0:
PUSHR1,R5TO[sp];//压栈保护
R1=0x4000;
[P_INT_CLEAR]=R1;
P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告