《单片机原理及应用》实验指导书.docx
《《单片机原理及应用》实验指导书.docx》由会员分享,可在线阅读,更多相关《《单片机原理及应用》实验指导书.docx(45页珍藏版)》请在冰豆网上搜索。
![《单片机原理及应用》实验指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4e153828-495b-48cb-bf63-3fc176a126d9/4e153828-495b-48cb-bf63-3fc176a126d91.gif)
《单片机原理及应用》实验指导书
《单片机原理及应用》
实验指导书
梁光胜编
华北电力大学信息工程系
电子科学与技术实验室
二零零五年十月
前言
1.实验总体目标
掌握凌阳16位单片机SPCE061A的硬件结构和工作原理,掌握利用汇编语言和C语言混合编程的方法设计单片机应用程序的方法,掌握集成软件开发平台的使用方法,为进一步开发应用打下坚实的基础。
⒉适用专业
电子科学与技术
⒊先修课程
数字电子技术基础、C语言程序设计
⒋实验课时分配
实验项目
学时
10个基本型实验
自行安排
设计型实验
实验一定时器TimerA/B实验
2
实验二系统时钟实验
2
实验三FIQ中断实验
2
实验四键唤醒实验
2
实验五A/D转换实验
2
实验六双通道D/A实验
2
实验七片内2KSRAM和32K闪存读写
2
综合型实验
实验一简易复读机的设计与实现
2
实验二语音电子钟的设计与实现
4
⒌实验环境
计算机1台、凌阳16位单片机SPCE061A实验箱1套、μ’nSP™IDE集成开发软件1套、示波器1台。
⒍实验总体要求
以凌阳16位单片机SPCE061A为硬件载体,能够熟练利用汇编语言和C语言混合编程的方法设计单片机应用程序,能够初步掌握单片机应用系统的设计与实现方法。
⒎本实验的重点、难点及教学方法建议
本实验的重点:
掌握凌阳16位单片机SPCE061A的硬件结构、工作原理和指令系统,能够独立完成所列出的实验内容。
本实验的难点:
两个综合型实验题目。
教学方法建议:
指导教师通过一个简单实例,带领学生将设计的全过程完整走一遍,后面的实验内容要求学生独立全面完成。
目录
第一章
SPCE061A基本型实验
实验一
熟悉μ’nSP™IDE环境下的汇编程序的编写
4
实验二
熟悉μ’nSP™IDE环境下的C语言的编写
6
实验三
使用汇编语言实现A口的输出实验
7
实验四
使用C语言实现A口的输出实验
9
实验五
使用汇编语言实现A口为输入B口为输出实验
10
实验六
使用C语言实现A口为输入B口为输出实验
12
实验七
IRQ5中断实验
14
实验八
SACM-A2000实验
17
实验九
SACM-480实验
20
实验十
SACM-240实验
23
第二章
SPCE061A设计型实验
26
实验一
定时器TimerA/B实验
26
实验二
系统时钟实验
27
实验三
FIQ中断实验
28
实验四
键唤醒实验
29
实验五
A/D转换实验
30
实验六
双通道D/A实验
31
实验七
片内2KSRAM和32K闪存读写
32
第三章
SPCE061A综合型实验
34
实验一
简易复读机的设计与实现
34
实验二
语音电子钟的设计与实现
34
第一章SPCE061A基本型实验
实验一熟悉μ’nSP™IDE环境下的汇编程序的编写
一、实验目的
熟悉μ’nSP™IDE环境及在该环境下用汇编语言编写的应用程序;熟悉简单的μ’nSP™汇编语言指令。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台。
三、实验步骤
1、将μ’nSP™IDE打开后,建立一个新工程。
2、在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
3、编写汇编代码。
4、编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态,等等。
四、程序流程图
五、程序范例
//===============================================================//
//Program:
计算1to100累加值
//Output:
[sum]=5050(十进制)或13BA(十六进制)
//===============================================================//
.RAM//定义预定义RAM段
.varR_Sum;//定义变量
.CODE//定义代码段
.public_main;//对main程序段声明
_main:
r1=0x0001;//r1=[1..100]
r2=0x0000;//寄存器清零
L_SumLoop:
r2+=r1;//累计值存到寄存器r2
r1+=1;//下一个数值
cmpr1,100;//加到100否
jnaL_SumLoop;//如果r1<=100跳到L_SumLoop
[R_Sum]=r2;//在R_Sum中保存最终结果
L_ProgramEndLoop:
//程序死循环
jmpL_ProgramEndLoop;
六、程序练习
在μ’nSP™IDE下用汇编语言使用冒泡法编写一个排序程序。
.iram
array:
.dw5,89,40,12,55,32,18,46,77,21
实验二熟悉μ’nSP™IDE环境下的C语言的编写
一、实验目的
熟悉μ’nSP™IDE环境及在该环境下用C语言编写的应用程序。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台。
三、实验步骤
1、将μ’nSP™IDE打开后,建立一个新工程。
2、在该项目的源文件夹(SOURCEFILES)下建立一个新的C语言文件。
3、编写C语言代码。
4、编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态,等等。
四、程序范例
//===============================================================//
//Program:
计算1to100累加值
//Output:
[sum]=5050(十进制)或13BA(十六进制)
//===============================================================//
intmain()
{
inti,Sum=0;
for(i=0;i<=100;i++)
Sum=Sum+i;//Sum是累加的结果
while
(1){};//程序死循环
//用变量Watch窗口看Sum的值
}
五、程序练习
在μ’nSP™IDE下用C语言使用冒泡法编写一个排序程序。
IntArray[]={{5,89,40,12,55,32,18,46,77,21}
实验三使用汇编语言实现A口的输出实验
一、实验目的
通过实验了解A口作为输出口时的使用方法;使用汇编语言来实现A口作为输出口的方法。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台、μ’nSP™十六位单片机实验箱一个。
三、实验原理
通过点亮不同发光二极管来显示A口输出的数值不同。
四、实验步骤
1、根据硬件连接图连接好硬件。
2、将μ’nSP™IDE打开后,建立一个新工程。
3、在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
4、编写汇编代码。
5、编译程序,软件调试,跟踪结果,观察LED及各个寄存器状态等等。
五、硬件连接图
六、程序流程图
七、程序范例
//*******************************************************************
.INCLUDEhardware.inc;//包括hardware.inc文件
.RAM
.VARR_LedCounter;//定义变量
.VARR_DelayCounter;
.CODE
.public_main;//对_main程序声明
_main:
R1=0xFFFF;//设置A口为同相低电平输出口
[P_IOA_Dir]=R1;
[P_IOA_Attrib]=R1;
R1=0x0000;
[P_IOA_Data]=R1;
[R_LedCounter]=R1;//对LEDcounter清零
L_MainLoop:
R1=[R_LedCounter];
[P_IOA_Data]=R1;//送数据到A口
R1=[R_LedCounter];
R1+=1;//LEDCounter加1
[R_LedCounter]=R1;
R1=0x0000;//DelayCounter清零
[R_DelayCounter]=R1;
callF_Delay;//延时
jmpL_MainLoop;//跳到L_MainLoop循环点亮LED
//////////////////////////////////////////
//功能:
延时子函数
//////////////////////////////////////////
F_Delay:
L_DelayLoop:
R1=0x0001;//清看门狗
[P_Watchdog_Clear]=R1;
R1=[R_DelayCounter];
R1+=1;//Delaycounter加1
[R_DelayCounter]=R1;
jnzL_DelayLoop;//加到65536吗?
retf;
八、程序练习
使用汇编语言实现B口的输出实验。
实验四使用C语言实现A口的输出实验
一、实验目的
通过实验了解A口作为输出口时的使用方法;使用C语言来实现A口作为输出口的方法。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台、μ’nSP™十六位单片机实验箱一个。
三、实验原理
通过点亮不同发光二极管来显示A口输出的数值不同。
四、实验步骤
1、根据硬件连接图连接好硬件。
2、将μ’nSP™IDE打开后,建立一个新工程。
3、在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
4、编写C语言代码。
5、编译程序,软件调试。
6、跟踪结果,观察LED及各个寄存器状态等等。
五、硬件连接图
硬件连接图同实验三。
六、程序范例
#include"hardware.h"
voidDelay()
{//延时子程序
unsignedinti;
for(i=0;i<32768;i++){}
}
intmain()
{intLedCounter=0;
intTemp;
//设置A口的Dir,Data,Attrib
SP_Init_IOA(0xffff,0xffff,0xffff);
//设置A口为无数据反相功能的高电平输出端
//SP_Init_IOA(xx,xx,xx)在hardware.h文件中已被定义
while
(1)
{SP_Export(Port_IOA_Data,LedCounter);//送数据到A口
//SP_Export(xx,xx)在hardware.h文件中已被定义
LedCounter++;
Delay();
}
}
七、程序练习
使用C语言实现B口的输出实验
实验五使用汇编语言实现A口为输入B口为输出实验
一、实验目的
通过实验了解A口作为输入、B口为输出口时的使用方法;使用汇编语言来实现A口作为输入、B口为输出口的方法。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台、μ’nSP™十六位单片机实验箱一个。
三、实验原理
根据按键的不同,A口的数据就不同,则传送到B口的数据就不同,相应的发光二极管就被点亮。
四、硬件连接图
五、实验步骤
1、根据硬件连接图连接好硬件。
2、将μ’nSP™IDE打开后,建立一个新工程。
3、在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
4、编写程序代码。
5、编译程序,软件调试。
6、按键并观察LED及各个寄存器的状态。
六、程序流程图
七、程序范例
.INCLUDEhardware.inc;
.INCLUDEkey.inc;//包括key.inc文件
.RAM
.VARR_KeyCode;//定义变量保存键值
.CODE
.public_main;//对main程序声明
_main:
callF_User_Init_IO;//初始化IO口
callF_Key_Scan_Initial;//初始化键盘扫描
L_MainLoop:
callF_Key_Scan_ServiceLoop;//扫描键盘
callF_Key_DebounceCnt_Down;//Keydebounce
callF_SP_GetCh;//取键值
cmpR1,0x0000;//是否有键按下
jeL_MainLoop;//没有,继续检测
[R_KeyCode]=R1;//有,保存键值
[P_IOB_Buffer]=R1;//送到B口显示
jmpL_MainLoop;
F_User_Init_IO:
r1=0x0000;//设置A口为带下拉电阻的输入端
[P_IOA_Dir]=r1;
[P_IOA_Attrib]=r1;
[P_IOA_Data]=r1;
r1=0xffff;//设置B口为无数据反相功能的低电
[P_IOB_Dir]=r1;//平输出
[P_IOB_Attrib]=r1;
r1=0x0000;
[P_IOB_Data]=r1;
retf;
八、程序练习
使用汇编语言实现A口的输出B口为输入实验
实验六使用C语言实现A口为输入B口为输出实验
一、实验目的
通过实验了解A口作为输入、B口为输出口时的使用方法;使用C语言来实现A口作为输入、B口为输出口的方法。
二、实验设备
装有WINDOWS系统和μ’nSP™IDE仿真环境的PC机一台、μ’nSP™十六位单片机实验箱一个。
三、实验原理
根据按键的不同,A口的数据就不同,则传送到B口的数据就不同,相应的发光二极管就被点亮。
四、硬件连接图
五、实验步骤
1、根据硬件连接图连接好硬件。
2、将μ’nSP™IDE打开后,建立一个新工程。
3、在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
4、编写程序代码。
5、编译程序,软件调试。
6、按键并观察LED及各个寄存器状态。
六、程序流程图
七、程序范例
#include"hardware.h"
intmain()
{
intKey;//设置Dir,Data,Attrib
SP_Init_IOA(0x0000,0x0000,0x0000);//设置A口为带下拉电阻的输入
SP_Init_IOB(0xffff,0x0000,0xffff);//设置B口为无数据反相功能的低电平输出
System_Initial();
while
(1)
{
Key=SP_GetCh();//取键值
switch(Key)
{
case0x0000:
//没有键按下
break;
case0x0001:
//Key1
case0x0002:
//Key2
case0x0004:
//Key3
case0x0008:
//Key4
case0x0010:
//Key5
case0x0020:
//Key6
case0x0040:
//Key7
case0x0080:
//Key8
SP_Export(Port_IOB_Buffer,Key);//在B口显示按下的键值
break;
default:
break;
}
System_ServiceLoop();
}
}
八、程序练习
使用C语言实现A口的输出B口为输入实验
实验七IRQ5中断实验
一、实验目的
了解IRQ5的中断向量和中断源;掌握中断控制单元P_INT_Ctrl,P_INT_Clear的设置方法;熟悉中断的编程方法。
二、实验设备
装有μ’nSP™IDE仿真环境的PC机一台、μ’nSP™十六位单片机实验箱一个。
三、实验原理
IRQ5中断对应4Hz、2Hz中断源,通过写P_INT_Ctrl来设置中断允许,程序运行后就会产生相应的中断。
我们编写一个用中断方式控制发光二极管亮灭程序,中断程序里读取P_INT_Ctrl单元,判断是哪个中断源,转到相应中断程序控制对应发光二极管亮或灭.从而了解IRQ5中断的组成及编程。
四、实验步骤
1、根据实验内容自行设计,连接硬件电路并检查。
2、画流程图并编写程序代码。
3、编译程序,软件调试。
4、观察LED、各个寄存器状态等等。
五、程序流程图
六、程序范例
Note:
IRQ5中断有两个中断源:
2Hz和4Hz,每个中断分别控制二极管的亮灭//即2Hz中断控制与A口的IOA0-IOA3位相连的LED,4Hz中断控制与IOB口的IOB0-IOB3位相连的LED灯。
.defineP_IOA_DATA0x7000;
.defineP_IOA_DIR0x7002;
.defineP_IOA_ATTRI0x7003;
.defineP_IOB_DATA0x7005;
.defineP_IOB_DIR0x7007;
.defineP_IOB_ATTRI0x7008;
.defineP_INT_CTRL0x7010;
.defineP_INT_CTRL_NEW0x702D;
.defineP_INT_CLEAR0x7011;
.defineP_Watchdog_Clear0x7012;
.RAM
.VARTIME2
.VARTIME4
.code
.public_main
_main:
intoff
r1=0xffff//IOA口为同相高电平输出口;
[P_IOA_ATTRI]=r1
[P_IOA_DIR]=r1
[P_IOA_DATA]=r1
r1=0xffff//IOB口为同相高电平输出口;
[P_IOB_ATTRI]=r1
[P_IOB_DIR]=r1
[P_IOB_DATA]=r1
r1=0x000c//开中断IRQ5_4Hz和IRQ5_2Hz
[P_INT_CTRL]=r1
[P_INT_CTRL_NEW]=r1
R1=0
[TIME2]=r1
[TIME4]=r1
intirq
loop:
r1=0x0001;
[P_Watchdog_Clear]=r1//清看门狗
jmploop
.text
.public_IRQ5
_IRQ5:
pushr1,r5to[sp]//压栈保护
r1=0x0008
testr1,[P_INT_CTRL]//比较是否为4Hz的中断源
jnzl_irq5_4//是,则转至对应程序段
l_irq5_2:
//否,则进入2Hz程序段
r1=0x0004
[P_INT_CLEAR]=r1
r2=[TIME2]
r2+=0x0001
[TIME2]=R2
cmpr2,2//比较是否为1秒
jbeLED2HZ_OFF//小于等于则LED灭
r1=0xfff0//大于则LED亮
[P_IOA_DATA]=r1
cmpr2,4//比较是否为两秒
jbeLED2Hz_RET//小于等于则LED继续亮
r2=0x000//否则,TIME1单元清零,返回中断
[TIME2]=R2
jmpLED2Hz_RET
LED2HZ_OFF:
r1=0xffff
[P_IOA_DATA]=r1
LED2Hz_RET:
popr1,r5from[sp]
RETI
l_irq5_4:
r1=0x0008
[P_INT_CLEAR]=r1
r2=[TIME4]
r2+=0x0001
[TIME4]=R2
cmpr2,2//比较是否为0.5秒
jbeLED4HZ_OFF//小于等于则LED灭
r1=0xfff0//大于则LED亮
[P_IOB_DATA]=r1
cmpr2,4//比较是否为1秒
jbeLED4Hz_RET//小于等于则LED继续亮
r2=0x000//否则,TIME2单元清零,返回中断
[TIME4]=R2
jmpLED4Hz_RET
LED4HZ_OFF:
r1=0xffff
[P_IOB_DATA]=r1
LED4Hz_RET:
popr1,r5from[sp]
RETI
实验八SACM-A2000实验
一、实验目的
了解凌阳单片机以SACM_A2000语音格式播放及程序的编写方法;了解凌阳音频编码算法库(SACM_Lib);了解SACM_A2000的语音文件。
二、实验设备
装有u’nspIDE仿真环境的PC机一台、μ