1、 .end (2) array: .dw 5,89,40,12,55,32,18,46,77,21 .var flag bp=array r1=0x0009 r4=0x0000 flag=r4r3=bp cmp r3,bp+1 jb next r2=bp+1 bp=r2 bp+1=r3 r3=0x0001 flag=r3 next:bp=bp+1 r1-=1 jnz loop r4=flag jnz _mainnop 实验中遇到的问题与解决措施 编写程序中出现了一些逻辑错误,错将r1置为0x000a,改正后得到了正确结果。 第二次实验:并行i/o口 实验三:使用汇编语言实现a口的输出实验 实验
2、四:使用c语言实现a口的输出实验 实验五:使用汇编语言实现a口为输入b口为输出实验 实验六:使用c语言实现a口为输入b口为输出实验 1)通过实验掌握a口、b口作为输入和输出口时的使用方法;2)使用汇编语言或c语言来实现a口或b口作为输入和输出口的实验。 1)装有windows系统和nsp? ide仿真环境的pc机一台; 2)nsp?十六位单片机实验箱一个。 实验原理 实验三、四:通过点亮不同发光二极管来显示a口输出的数值不同。 实验五、六:根据按键的不同,a口的数据就不同,则传送到b口的数据就不同,相应的发光二极管被点亮。 该实验中用到实验箱中的逻辑电平指示灯和1*8的键盘。 1)逻辑电平指示
3、灯:具有8 路,阳极接电阻排至v5( vcc),i/o 端口低电平“点亮”。逻辑电平指示灯电路8 路图见下图: 逻辑电平指示灯电路原理图 2)1*8键盘电路 可分别“h” 或 “l”, 由sw 选择,配合内部的上拉/下拉电阻合理使用。 1*8 键盘电路原理图 实验硬件连接 实验内容二:b口输入,a口输出 iob7 iob6 iob5 iob4 iob3 iob2 iob1 iob0 ioa7 ioa6 ioa5 ioa4 ioa3 ioa2 ioa1 ioa0 实验内容 1、根据所提供的程序学习实验三、四、五、六。 2、建立一个项目,编写程序,实现: 按键连接b口作为输入,a口为输出连接发光二
4、极管。通过按键控制相应的发光二极管亮或灭。 (要求写出实验内容2的程序,加入适当的指令说明) (1) 在试验5,6基础上改编程序实现b口输入a口输出: main函数里: l_user_init_io: 改为:l_user_init_io: 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;p_ioa_attrib = r1;r1 = 0x0000; p_iob_data = r1;retf;
5、key函数里: (1) f_key_scan_serviceloop: r1 = p_ioa_data; f_key_scan_serviceloop: /从ioa口获取按键数据 r1 = p_iob_data ; (2) f_key_scan_serviceloop_2: r1 = p_ioa_buffer; r1 &= 0xff7f; p_ioa_buffer = r1;= 0x000f;r2 = r1; r3 = r2 xor 0xffff; nop;nop; r1 |= 0x0080;r1 & r1 = p_iob_data; r2 = r1; /从iob口获取按键数据 /io
6、a7位置为0 /从ioa口获取按键数据 / ioa7位置为1 / ioa7位置为0 /从iob口获取按键数据 开始时未改动按键函数,始终无变化,改动后,实验现象和预期的一样。 第三次实验:系统时钟与定时器 参看实验七:定时器timer a/b实验 实验八:系统时钟实验 1) 通过实验了解定时器timer a/b的结构及使用方法;掌握预置数单元 p_timera/b_data和定时控制单元p_ timera/b_ctrl的设置方法;熟悉定时器timer a/b的编程方法。 2) 了解spce061 pll 振荡器的功能及其应用;掌握系统时钟单元 p_systemclock的设置方法;熟悉系统时钟
7、和cpu时钟频率的编程方法。 实验设备 同前。 实验七:timera和timerb定时器启动后在预置数单元p_timera_data或p_timerb_data内置入一个计数初值n后,定时器/计数器会在选择的时钟源频率下开始向计数增加的方向计数,n+1,n+2,fffeh,当计数到ffffh后定时器/计数器溢出。 一方面,产生一个中断请求信号ta_timeout_int或tb_timeout_intcpu,响应后执行相应的中断服务程序,与此同时计数初值n会被自动重新置入定时器/计数器内并重复上述加计数的过程。 另一方面,该溢出信号会作为脉宽调制输出计数器的时钟源输入,使其输出一个具有四位可调的
8、脉宽调制占空比输出信号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频率来观察发光二极管亮灭的快慢。iob8接一个发光二极管 实验八: 1)学习实验七、
9、八; 2)建立新的项目,在定时器b下完成下列任务: 当输入时钟分别为clka=fosc/2、clka=fosc/256、 clka=32768hz、clka=8192hz、clka=4096hz时观察输出频率; 固定时钟,如clk为4096hz,设置不同的计数初值,观察溢出时 iob9输出; 选择同一时钟源,改变占空比,观察灯的闪烁变化。 3)对实验八 1)选择不同fosc信号频率,观察发光二极管亮灭快慢; 2)改变cpuclk频率,观察发光二极管亮灭快慢。 一, 写出实验内容二的程序,并说明如何完成或设置内容二中各个任务,预计实验结果。 在定时器b下工作: 实验七程序更改:第一初始化改变:
10、.define p_timera_data 0x700a;改为.define p_timerb_data 0x700c; .define p_timera_ctrl0x700d; 0x700b;改为 .define p_timerb_ctrl 第二iob8输出改为iob9 :改为: r1=0x0100; r1=0x0200; p_ioa_dir=r1; 第三定时器a改为定时器b: r1=0xff9f;r1=0xff9f; p_timera_data=r1;p_timerb_data=r1; r1=c_time_clk_4096;r1=c_time_clk_4096; p_timera_ctrl
11、=r1; p_timerb_ctrl=r1; 然后在保存运行即可实验现象和原例七timera的结果类似。 实验总结 通过此次实验掌握了设置计数初值,频率和占空比的方法。而且观察到了不同的频率,计数初值,占空比对应的会有不同的实验现象。 第四次实验:定时器中断和时基中断 参看实验九:fiq中断实验 实验十:irq0/irq1/irq2中断实验 实验十一:irq4中断实验 实验十二:irq5中断实验 实验十三:irq6中断实验 1)了解fiq的中断向量和中断源; 掌握中断控制单元p_int_ctrl、p_int_clear的设置方法;熟悉定时器中断的编程方法。 2)了解irq0、irq1、irq2
12、的中断向量和中断源; 熟悉定时器中断的编程方法。 了解irq4的中断向量和中断源; 熟悉时基中断的编程方法 4) 了解irq5的中断向量和中断源; 5) 了解irq6的中断向量和中断源; 熟悉时基中断的编程方法 实验设备 同前。 3) 实验九:fiq中断对应pwm、tma、tmb中断源;通过写p_int_ctrl来设置中断允许,fiq_tma,fiq_tmb中断源分别是通过定时器a、定时器b产生的。当计满溢出时产生中断请求信号ta_timeout_int或tb_timeout_int,cpu响应后进入中断执行相应的子程序,中断程序里可以通过读取p_int_ctrl单元,判断是哪个中断源并进入相
13、应的子程序控制发光二极管点亮。 实验十:irq0_pwm、irq1_tma、irq2_tmb中断源,通过写p_int_ctrl来设置中断允许,irq1_tma和irq2_tmb 中断源分别是通过定时器a、定时器b产生的。当计数满溢出时产生中断请求信号ta_timeout_int或tb_timeout_int,cpu响应后进入对应的中断,并在相应的中断程序里执行控制发光二极管亮灭的程序。 实验十一:irq4中断对应 4096hz、2048hz、1024hz中断源,通过写p_int_ctrl来设置中断允许cpu响应后进入中断。我们编写一个用中断方式控制发光二极管亮灭程序,中断程序里读取p_int_
14、ctrl单元,判断是哪个中断源转到相应中断程序控制对应发光二极管亮或灭,从而了解irq4 中断的组成及编程。 实验十二:irq5中断对应4hz、2hz中断源,通过写p_int_ctrl来设置中断允许程序运行后就会产生相应的中断。我们编写一个用中断方式控制发光二极管亮灭程序,中断程序里读取p_int_ctrl单元,判断是哪个中断源转到相应中断程序控制对应发光二极管亮或灭,从而了解irq5 中断的组成及编程。 实验十三:irq6 中断对应tmb1、tmb2中断源,先设置 p_timebase_setup通过改变tmb1_clk可以选择时基频率tmb1:8/16/32/64hz;同样改变tmb2_c
15、lk可以选择时基频tmb2: 128/256/5122/1024hz。写p_int_ctrl设置中断允许,cpu响应中断后可以通过读取p_int_ctrl 单元,判断是哪个中断源并进入相应的子程序控制发光二极管亮灭。 实验九、十、十二十三:a口的低四位接led灯, b口的低四位接led灯。a口的低八位接led灯。 实验内容 1学习实验九、十、十一、十二、十三; 2 建立新的项目,选用fiq方式或irq方式实现定时器中断,使a口输出控制的发光二极管以1s的周期闪烁;使b口输出控制的发光二极管以2s的周期闪烁。 3建立新项目,选用irq4、irq5或irq5实现时基中断,使a口输出控制的发光二极管
16、以2s的周期闪烁;使b口输出控制的发光二极管以4s的周期闪烁。 实验准备 要求: 1、写出实验内容2的程序,并说明如何完成或设置内容二中各个任务,预计实验结果。 实验程序: 选用fiq中断方式中的定时器中断源,定时器a或b计满溢出产生中断请求信号。 .include hardware.inc; .define c_timea_clk 0x0005; .define c_timeb_clk 0x0004; .code.public _main int off r1 = 0xffff 平输出口; p_ioa_attri = r1 p_ioa_dir = r1 p_ioa_data = r1 同相高
17、电平输出 ; p_iob_dir = r1 p_iob_attri = r1 p_iob_data = r1 r1 = 0xdfff; p_timera_data = r1; p_timerb_data = r1; r1 = c_timea_clk; p_timera_ctrl = r1; r1 = c_timeb_clk; p_timerb_ctrl = r1; r1 = 0xa800 fiq_tma、fiq_tmb p_int_ctrl = r1 int fiq l_loop: jmp l_loop .text .public _fiq _fiq: push r1,r5 to sp / r
18、1 = 0x0800 test r1,p_int_ctrl / jnz l_fiq_tmb r1 = 0x2000 jnz l_fiq_tma l_fiq_pwm: r1 = 0x8000 p_int_clear = r1 pop r1,r5 from sp reti l_fiq_tma: /ioa口设为同相高电 /b口的低8位设置为 /开中断fiq_pwm、压栈保护 比较是否为fiq_tmb /是,则转至对应程序段 否,则比较是否为fiq_tma/是,则转至对应程序段 /否,则进入fiq_pwm中断r1 = 0xfff0 r5 = 0xffff; /延时 l_delay1: r2 -= 1;
19、 jnz l_delay1; /熄灭led r1 = 0x2000; p_int_clear = r1; pop r1,r5 from sp; reti; l_fiq_tmb: r1 = 0xfff0; r2 = 0xffff; /延时 l_delay2: jnz l_delay2; r1 = 0x0800; pop r2,r5 from sp; 实验现象: 运行程序,与a口相连接的发光二极管闪烁两次,此时与b口相连接的发光二极管闪烁一次;a口的灯闪烁较快,b口的灯闪烁较慢,而且可以判断出a口灯的闪烁的周期是1s,b口灯的闪烁周期是2s。 2、写出实验内容3的程序,并说明如何完成或设置内容3中
20、各任务,预计实验结果。 选用irq6实现时基中断。 .define c_tmb1clk_8hz0x0000 .define c_tmb1clk_16hz0x0001 .define c_tmb1clk_32hz0x0002 .define c_tmb1clk_64hz0x0003 .define c_tmb2clk_128hz 0x0000 .define c_tmb2clk_256hz 0x0004 .define c_tmb2clk_512hz 0x0008 .define c_tmb2clk_1024hz 0x000c .define c_tmb1_clk c_tmb1clk_64hz
21、.define c_tmb2_clk c_tmb2clk_128hz .ram.var g_time1 .var g_time2 r1 = 0xffff /设置ioa口为同相高电平输出口 r1 = 0xffff /设置iob口为同相高电平输出口 r1 = c_tmb1_clk r1 |= c_tmb2_clk p_timebase_setup = r1 r1 = 0x0003 /开中断irq6_c_tmb1和irq6_c_tmb2 r1 = 0 g_time1 = r1 g_time2 = r1 int irq; nop .public _irq6 _irq6: push r1,r5 to s
22、p /压栈保护 r1 = 0x0001 test r1,p_int_ctrl /比较是否为irq6_c_tmb2的中断源 jnz l_irq6_c_tmb2 /是,则转至对应程序段 l_irq6_c_tmb1: /否,则进入irq6_c_tmb1程序段; r2 = g_time1 r2 += 0x0001 g_time1 = r2cmp r2,128 /比较是否为2秒; jbe l_led1_off /小于等于则led灭; r1 = 0xfff0 /大于则led亮; cmp r2,256 /比较是否为4秒; jbe l_led1_ret /小于等于则led继续亮; r2 = 0x000 /否则
23、,g_time1单元清零,返回中断; g_time1 = r2 jmp l_led1_ret l_led1_off: l_led1_ret: r1 = 0x0002 l_irq6_c_tmb2: r2 = g_time2 r2+ = 0x0001 g_time2 = r2 cmp r2,128 /比较是否为1秒; jbe l_led2_off /小于等于则led灭; cmp r2,256 /比较是否为2秒; jbe l_led2_ret /小于等于则led继续亮; r2 = 0x0000 /否则,g_time2单元清零,返回中断; jmp l_led2_ret l_led2_off: l_led2_ret: 利用时基中断实现上述功能,现象同上。a口灯的闪烁的周期是2s,b口灯的闪烁周期是4s。实验总结 通过此次实验更加直观的理解了定时器中断和时基中断的内容和区别。 第五次实验:a/d转换,双通道d/a 实验十七:a/d转换 实验十八:双通道d/a 实验十九:一路输入的录音 1)了解adc输入接口的结构与转换原理;熟悉模拟量输入口line_in1 line_in7的使用;掌握p_adc p_adc_ctrl单元的设置方法; 2)了解音频输出接口的结构与转换原理;掌握p_dac2、p_dac1、 p_da
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1