凌阳16位单片机实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[实验总结] 通过本次试验,我学会了在凌阳16为单片机上经行数模和模数转化。并完成了录音和 放音的功能。
第五次实验:中断实验
[实验内容] 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灯。
[num2]=r1
删去所有的延时程序。 需要更改的代码
更改前 R1 = 0xf09f; [P_TimerA_Data] = R1; [P_TimerB_Data] = R1;
更改后 R1 =0xfbff; [P_TimerA_Data] = R1; R1=0xdfff; [P_TimerB_Data] = R1;
第三次实验:系统时钟与定时器
[实验内容] 1) 学习实验七、八; 2) 对于实验七,
1、 固定初值,改变不同的输入时钟观察输出的变化; 答:改变:
.DEFINE
C_Time_Clk C_Time_Fosc_256;
LED 灯闪烁频率发生变化。频率越大,闪烁越快。
2、 固定时钟,如CLK为4096HZ,设置不同的计数初值,观察输出; 答:改变R1:
完整的程序: .DEFINE P_IOA_DATA .DEFINE P_IOA_DIR .DEFINE P_IOA_ATTRI .DEFINE P_IOB_DATA .DEFINE P_IOB_DIR .DEFINE P_IOB_ATTRI .DEFINE P_INT_CTRL .DEFINE P_INT_CLEAR .DEFINE P_TimerA_Data .DEFINE P_TimerA_Ctrl .DEFINE P_TimerB_Data .DEFINE P_TimerB_Ctrl .DEFINE C_Timea_Clk .DEFINE C_Timeb_Clk
各完成什么任务? 答:结果:转动旋钮,八个 LED 灯以二进制的形式亮灭,表示当前输入的大小。 寄存器设置: ①P_IOB_ATTRI、P_IOB_DIR、P_IOB_DATA:IOB 口设置为同向输出口。 ②P_ADC_MUX_Ctrl:选择通道 LINE_IN。 ③P_ADC_Ctrl:允许 A/D 转换
2、 学习实验五或实验六,写出实验结果。 实验五的结果:开始时,所有灯全灭,每次按一个开关,相应的灯就是被点亮。松开后, 相应的灯再一次熄灭。
3、对实验五或六修改,将以前的输入与输出口进行变换,即按键连接B口作为输入, A口为输出连接发光二极管,并要求发光二极管事先全灭,按下键时控制相应的二极 管亮。说明如何修改,写出修改地方的程序。
[实验中遇到的问题与解决措施] 对于冒泡排序,我有些淡忘。在写程序时,一开始,我用的是选择排序,但是在凌阳 16位单片机的程序里,变址寻址时,觉得很麻烦,所以就使用冒泡排序了。 [实验总结] 应熟悉对 ram 内自定义数据的使用。
第二次实验:并行I/O口
[实验内容] 1、 学习实验三或实验四,写出实验结果。 答:实验三的结果:从低位到高位,按照二进制1出现的顺序,依次点亮对应位的灯。
[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;
2) 编写完整的项目(或选择一个合适的实验进行拷贝,然后修改),实现定时器 A,B中断,控制发光A口和B口二极管分别以2s,4s周期闪烁; 说明实现的原理,写出关键的程序语句。
答:以实验九的程序为模板。 原理:在ram中定义两个变量num1和num2,用来保存当前LED灯的状态。每次触发一次中断 后,对num1或num2的取反(方法是与0x000F异或),并输出。此时LED灯的亮灭发生变化。
更改后 F_Key_Scan_ServiceLoop: r1 = [P_IOB_Data]; F_Key_Scan_ServiceLoop_2:
r1 = [P_IOB_Buffer]; r1 &= 0xFF7F; [P_IOB_Buffer] = r1; r1 = [P_IOB_Data]; r1 &= 0x000F; r2 = r1; r3 = r2 xor 0xffff; nop; nop; nop; r1 = [P_IOB_Buffer];
凌阳 16 位单片机实验报告
姓名:赵伟 学号:04103123
第一次实验:编程与环境学习
[实验准备] (要求实验前写出实验内容中的两个程序) 1) .IRAM Array .DW 5,89,40,12,55,32,18,46,77,21 .RAM .VAR G_Sum; .CODE .PUBLIC _main _main: R1 = 0x0002; R2 = 0x0000; L_SumLoop: R2 += R1; R1 += 2; CMP R1,200; JNA L_SumLoop; [G_Sum] = R2; L_ProgramEndLoop: JMP L_ProgramEndLoop; .END
[bp] = r2; [bp+1] = r3; r3 = 0x0001; [flag] = r3; FLAG: bp = bp+1; r1 -= 1; jnz LOOP2; r4 = [flag] jnz LOOP1; MAINLOOP: r1 = 0x0001; [P_Watchdog_Clear] = r1 JMP MAINLOOP;
R1=0xff9f; [P_TimerA_Data]=R1; LED灯闪烁频率发生变化。计数初值越小。闪烁越慢。
3、 选择同一时钟源,改变占空比,观察灯的闪烁变化。 答:周期不变,但在一个周期内,LED灯点亮的时间改变。
3) 将实验七中的定时器A改用定时器B完成。应作怎样的修改?写出修改的地方。
更改前
0x7000; 0x7002; 0x7003; 0x7005; 0x7007; 0x7008; 0x7010; 0x7011; 0x700A; 0x700B; 0x700C; 0x700D; 0x000d; 0x0004;
CPUCLK_Leabharlann Baiduosc32;
[实验总结] 在本次试验中,我学会了如何通过改变计数初值和输入时钟的频率来产生不同频率的 输出信号。最值得注意的是TimerA和TimerB的脉宽调制输出端口是不一样的。
第四次实验:A/D转换,双通道D/A
[实验内容] 1) 学习实验十七,观察结果,并说明实现 A/D 转换,需要对哪些寄存器进行设置?
r1 = [P_IOA_Buffer]; r1 &= 0xFF7F; [P_IOA_Buffer] = r1; r1 = [P_IOA_Data]; r1 &= 0x000F; r2 = r1; r3 = r2 xor 0xffff; nop; nop; nop; r1 = [P_IOA_Buffer];
更改后
_main:
_main:
R1=0x0100;
R1=0x0200;

增加:
.DEFINE P_TimerB_Data 0x700C;
.DEFINE P_TimerB_Ctrl
0x700D;
[P_TimerA_Data]=R1;
[P_TimerB_Data]=R1;
[P_TimerA_Ctrl]=R1;
2) .DEFINE P_Watchdog_Clear 0x7012 .IRAM array: .DW 5,89,40,12,55,32,18,46,77,21; .VAR flag; .CODE .PUBLIC _main; _main: LOOP1:
bp = array; r1 = 0x000A; r1=r1-1; r4 = 0x0000; [flag] = r4; LOOP2: r3 = [bp]; cmp r3,[bp+1]; jb FLAG; r2 = [bp+1];
需要增加的代码: .ram .var num1 .var num2
在_main:后增加 r1=0xffff [num1]=r1 [num2]=r1
在L_FIQ_TMA后增加: R1 = [num1] r1^= 0x000f [P_IOA_DATA] = R1 [num1]=r1
在L_FIQ_TMB后增加: R1 = [num2] r1^= 0x000f [P_IOB_DATA] = R1
(注:不要在源文件中修改。重新建立项目或拷贝到其它地方进行修改)
在main.asm中:
更改前
更改后
[P_IOB_Buffer] = R1;
[P_IOA_Buffer] = R1;
L_User_Init_IO:
L_User_Init_IO:
R1 = 0x0000;
R1 = 0x0000;
[P_IOA_Dir] = R1;
r1 |= 0x0080; [P_IOA_Buffer] = r1; r1 = [P_IOA_Data];
r1 |= 0x0080; [P_IOB_Buffer] = r1; r1 = [P_IOB_Data];
[实验总结] 实验三中,题目要求使用B入A出,我一开始,只修改了main.asm中的相关位置,发现 结果不对,后来当我一点一点分析后发现,key.asm中的相关代码页需要修改。最后实验成 功了。在以后的实验中,不但要看懂主程序,也要搞清楚其子程序和相关函数的实现。
2) 学习实验十八,观察结果,并说明实现 D/A 转换,需要对哪些寄存器进行设置?
各完成什么任务?如何实现三角波?
答:结果:声音逐渐增大后,突然消失。并循环往复。
寄存器设置:
①P_DAC_Ctrl:设置 DAC 输出数据锁存方式,A/D 转换方式。
②P_DAC1、P_DAC2:输出。
实现方法:
L_MainLoop1:
[P_DAC1]=R1;
[P_DAC2]=R1;
CALL L_Delay
//调用延时
R1+=R3
jmp L_MainLoop1
每次让 R1 加一个数 R3 并输出。这样声音逐渐增大。当 R1 溢出时,此时 R1=0,声音消失。
以此循环往复,实现三角波。
3) 学习十九,观察结果,并说明实验的原理。 答:设定定时器 A 的频率,即为采样率。采用自动方式,当定时器 A 溢出时,触发中断, 进入中断服务程序。把通过 MIC_IN 输入的语音信号经过 A/D 转换后,再经过 D/A 转换,并 在通过 AUD1 和 AUD2 两个通道播放
[P_TimerB_Ctrl]=R1;
4)对实验八 1) 选择不同FOSC信号频率,观察发光二极管亮灭快慢;
答:改变:
.DEFINE Fosc_CLK_RATE C_FoscCLK_49; 选取的频率大,闪烁越快。
2) 改变CPUCLK频率,观察发光二极管亮灭快慢。 答:改变:
.DEFINE CPU_CLK_RATE 选取的频率越大,闪烁越快。
[P_IOB_Attrib] = R1;
[P_IOA_Attrib] = R1;
R1 = 0xffff;
R1 = 0xffff;
[P_IOB_Data] = R1;
[P_IOA_Data] = R1;
在key.asm中: 更改前 F_Key_Scan_ServiceLoop: r1 = [P_IOA_Data]; F_Key_Scan_ServiceLoop_2:
相关文档
最新文档