单片机实验报告
- 格式:docx
- 大小:136.05 KB
- 文档页数:18
单片机实验报告学院机电工程学院专业自动化学生姓名学号第一次实验编程与环境学习1)用汇编实现1到200中的偶数的累加计算实验程序:.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;.END2)用汇编语言编写一个排序程序。
实验程序:.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口1)使用汇编语言实现A口的输出实验;2)使用汇编语言实现A口为输入B口为输出的实验;实验结果及分析:两个实验程序的编写重点在于属性的设置,第一的实验设置A口为同相的低电平输出口,并通过寄存器R1的数值递增实现发光二极管的亮灭现象的变化,以显示不同的输出数值,中间还加入了延时子程序,便于我们清楚的观察现象;第二个实验设置A口为带下拉电阻的输入、B口为同相低电平输出,通过键值输入A口,在相应的B口显示输出值(发光二极管的亮灭)。
3)对实验五或六修改,将以前的输入与输出口进行变换,即按键连接B口作为输入,A口为输出连接发光二极管,并要求发光二极管事先全灭,按下键时控制相应的二极管亮。
说明如何修改,写出修改地方的程序。
[I_Key] = R1; //保存键值[P_IOA_Buffer] = R1; //LED 显示JMPL_MainLoop;L_User_Init_IO:R1 = 0x0000; //设B口为带下拉电阻的输入[P_IOB_Dir] = R1;[P_IOB_Attrib] = R1;[P_IOB_Data] = R1;R1 = 0xffff; //设A口为低电平输出[P_IO_Dir] = R1;R1=0x0000;[P_IOB_Attrib] = R1;// 设置A口为反相输出;[P_IOB_Data] = R1;RETF;.END注:程序主要的修改是调换A、B口属性值,由于要求发光二极管事先全灭,所以把原来的同相改为反相,而初始值不变([P_IOB_Data]=0x0000)。
第三次实验系统时钟与定时器对于实验七,1、固定初值,改变不同的输入时钟观察输出的变化;固定时钟,如CLK为4096HZ,设置不同的计数初值,观察输出;选择同一时钟源,改变占空比,观察灯的闪烁变化。
.DEFINE C_Time_Clk C_Time_Fosc_256; //频率选择.DEFINE C_Time_Pwm C_TimePwm_4; //脉宽选择R1=0xff9f; //设定TA_TIMEOUT/16=(C_Time_Clk/96)/16=8kHz //R1=0x0f9f;[P_TimerA_Data]=R1;R1=C_Time_Clk;//R1=C_Time_Pwm[P_TimerA_Ctrl]=R1;选择不同的C_Time_Clk和C_Time_Pwm可以设置不同的频率和占空比;通过给[P_TimerA_Data]赋不同的值可以设置定时器的初值;通过给[P_TimerA_Ctrl]赋不同的值可以决定是改变频率还是脉宽;对于同一初值,输入时钟频率越高,灯的闪烁越快;对于同一时钟,初值越大,灯的闪烁越快,占空比越大,灯一次所亮的时间越长。
2、将实验七中的定时器A改用定时器B完成。
应作怎样的修改?写出修改的地方。
改动如下:.DEFINE P_TimerB_Data 0x700C;.DEFINE P_TimerB_Ctrl 0x700D;_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]的值;3、对实验八1)选择不同FOSC信号频率,观察发光二极管亮灭快慢;改变CPUCLK频率,观察发光二极管亮灭快慢。
实验分析: R1 = Fosc_CLK_RATE; //FoscR1| = CPU_CLK_RATE; //CPUClk不同的FOSC信号频率和CPUCLK频率决定了程序语句执行速度的快慢,进而决定了延时子程序所延时间的长短,即显示灯亮灭时间的长短,所以当两者频率增大时,发光二极管亮灭变快。
第四次实验A/D转换、D/A转换[实验内容]1)学习实验十七,观察结果,并说明实现A/D转换,需要对哪些寄存器进行设置?各完成什么任务?答:需要对P_ADC ,P_ADC_Ctrl,P_ADC_MUX_Ctrl,P_ADC_MUX_Data,寄存器进行设置。
其中P_ADC存储输入转换量的数据,P_ADC_Ctrl控制A/D转换的允许工作情况,P_ADC_MUX_Ctrl用于判断转换是否完成及输入通道的选择,P_ADC_MUX_Data用于读取ADC转换的数据。
具体实现是:r1 = 0x0001 ; //选择ADC通道0[P_ADC_MUX_Ctrl] = r1;r1 = 0x0001; //使能ADC[P_ADC_Ctrl] = r1;r1 = [P_ADC_MUX_Data]; //启动ADC2)学习实验十八,观察结果,并说明实现D/A转换,需要对哪些寄存器进行设置?各完成什么任务?如何实现三角波?答:需要设置P_DAC2 ,P_DAC1 ,P_DAC_Ctrl,P_DAC2单元是一个带10位缓冲寄存器DAR2的10位D/A转换单元,用于锁存DAC2的输入数据量;P_DAC1单元是一个带10位缓冲寄存器DAR1的10位D/A转换单元,用于锁存DAC2的输入数据量或从其中读取数据。
P_DAC_Ctrl用于设置DAC数据锁存方式,A/D转换方式,设置双DAC 音频输出。
具体实现是:r1 = 0x0000 ;[P_DAC_Ctrl] = r1 ; //允许DAC,b1 = 0,设置DAC输出的数据锁存方式r2 = 0x0040 ; //DAC的高十位有效0000 0000 0100 0000,是因为10位D/A 转换是高十位r1 = 0x0000 ;[P_DAC1] = r1 ; //把数值输出到DAC1[P_DAC2] = r1 ; //把数值输出到DAC2实现三角波;R1=0x0040 ;LOOP1:R1+=0x0040 ;CMP R1,0xff80 ;JB LOOP2 ;[P_DAC1]=R1 ;[P_IOB_DATA]=R1 ;CALL L_Delay;JMP LOOP1 ;LOOP2:R1-=0x0040 ;CMP R1,0x0040 ;JB LOOP1[P_DAC1]=R1 ;[P_IOB_DATA]=R1;CALL L_Delay;JMP LOOP2 ;3)学习十九,观察结果,并说明实验的原理。
答:外部信号由通道MIC_IN输入,再经过缓冲器和放大器。
AGC功能将通过MIC_IN 通道输入的模拟信号的放大值控制在一定范围内,然后经采样-保持模块被送至比较器,进行A/D转换后送入P_ADC(7014H)。
本实验通过编程实现录放音的功能,采用自动方式即定时器A溢出执行ADC转换,通过A/D将MIC_IN输入的语音信号转换为数字信号,再通过D/A 的两个通道AUD1和AUD2播放。
第五次实验中断实验1)编写完整的项目(或选择一个合适的实验进行拷贝,然后修改),实现定时器A,B中断,控制发光A口和B口二极管分别以2s,4s周期闪烁;原理:FIQ 有FIQ_PWM FIQ_TMA 和FIQ_TMB 三个中断源,当定时器A 或B 计满溢出时产生中断请求信号TA_TIMEOUT_INT 或TA_TIMEOUT_INT,CPU 响应后进入中断执行相应的子程序控制二极管发光A 口的低四位接LED 灯B 口的低四位接LED 灯..DEFINE C_Timea_Clk 0x001B;//设置时钟源A为8KHZ频率.DEFINE C_Timeb_Clk 0x0004;//设置时钟源B为4KHZ频率R1 = 0xBFFF;[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_PWM FIQ_TMA FIQ_TMB[P_INT_CTRL] = R1设所需定时时间为t,输入时钟信号周期为T,频率为f,初值为N,则t=(FFFFH-N)*T由程序可知,设定两定时器初值相同为BFFF,则可取定时器A、定时器B的频率分别为8KHZ和4KHZ,就可满足定时时间为2S和4S。
2)编写完整的项目(或选择一个合适的实验进行拷贝,然后修改),实现时基信号中断,控制发光A口和B口二极管分别以2s,4s周期闪烁。
原理:IRQ5 中断对应4Hz 2Hz 中断源,通过写P_INT_Ctrl来设置中断允许程序运行后就会产生相应的中断. 我们编写一个用中断方式控制发光二极管亮灭程序, 中断程序里读取P_INT_Ctrl单元,判断是哪个中断源转到相应中断程序控制对应发光二极管亮或灭. 需要改动的程序段:L_irq5_2:CMP R2,3 //比较是否为2秒JBE L_LED2HZ_OFF //小于等于则LED 灭R1 = 0xfff0 //大于则LED 亮[P_IOA_DATA] = R1CMP R2,7 //比较是否为4秒JBE L_LED2Hz_RET //小于等于则LED 继续亮R2 = 0x000 //否则G_Time1单元清零返回中断L_irq5_4:CMP R2,3 //比较是否为1秒JBE L_LED4HZ_OFF //小于等于则LED 灭R1 = 0xfff0 //大于则LED 亮[P_IOB_DATA] = R1CMP R2,7 //比较是否为2秒JBE L_LED4Hz_RET //小于等于则LED 继续亮R2 = 0x000 //否则G_Time2 单元清零返回中断第六次实验语音实验1、建新项目(或拷贝一个项目修改),使用s480格式,编写二首或三首曲子的循环播放,并写出主程序主程序修改如下:main(){intSpeechIndex = 0; // 选择第一首语音while(1){SACM_S480_Initial(Auto);SACM_S480_Play(SpeechIndex,DAC1+DAC2,Ramp_UpDn_On);//播放第一首歌曲while(SACM_S480_Status()&0x01) //判断第一首是否播完SACM_S480_ServiceLoop();SpeechIndex++;if(SpeechIndex==3)SpeechIndex=0;}}2、说明采用凌阳单片机对语音的制作到播放的过程。