凌阳单片机.docx
- 文档编号:25440869
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:40
- 大小:132.36KB
凌阳单片机.docx
《凌阳单片机.docx》由会员分享,可在线阅读,更多相关《凌阳单片机.docx(40页珍藏版)》请在冰豆网上搜索。
凌阳单片机
实验一 熟悉’nSP™IDE环境下的汇编程序和C程序的编写
1、实验目的
熟悉汇编程序和C程序的编写。
编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态。
2、实验设备
装有WINDOWS操作系统以及SunPlus IDE仿真开发环境的PC机一台; ì’nSP™十六位单片机实验板及扩展板。
3、实验原理
参照SPCE061A单片机教材和实验指导书熟悉凌阳单片机的开发环境。
4、实验步骤
1)将µ’nSP™IDE打开后,建立一个新工程。
2)在该项目的源文件夹(SOURCEFILES)下建立一个新的汇编语言文件。
3)编写汇编代码和C程序。
4)编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态,等等。
5、实验代码
流程图:
1)汇编程序代码:
.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;
2)C程序代码:
intmain()
{
inti,Sum=0;
for(i=0;i<=100;i++)
Sum=Sum+i;//Sum是累加的结果
while
(1){};//程序死循环
}//用变量Watch窗口看Sum的值
6、实验结果及分析
1)汇编程序结果
按
编译程序,点击
图标就可以在光标所在地设置断点;点击
图标就可以消除设置的断点,点击
运行程序,
可以打开watch窗口,查看变量的值,
可以看寄存器的值。
Watch窗口:
各寄存器的值如下:
2)C程序结果
Watch窗口:
各寄存器的值:
通过实验一了解到了u'nSPTMIDE的工程的建立,文件的添加,属性的修改等基本操作,并了解到了C语言和汇编编程的区别和各自的优缺点。
实验二 键盘与二极管实验
1、实验目的
通过本实验熟悉SunPlus SPCE061A单片机的I/O,定时器的使用方法。
中断系统的使用。
熟悉IDE开发环境的使用。
2、实验设备
装有WINDOWS操作系统以及SunPlus IDE仿真开发环境的PC机一台; ì’nSP™十六位单片机实验板及扩展板。
3、实验原理
通过键盘扫描获得键值后分别控制二极管的亮灭;使用定时器产生不同的显示模式。
4、实验步骤
1)连接PC机与SunPlus061A仿真板,连接实验板与仿真板;
2)运行IDE开发环境程序;建立新工程;
3)往新工程里添加C文件,编写主程序框架;往工程里添加ASM文件,编写汇编子程序;
4)往新工程中添加中断处理程序;添加头文件(hardware.inc等);
5)程序编译调试,观察运行结果,寄存器状态等;脱机运行。
要求:
对于每个不同的按键,分别有下列响应:
1.全亮;
2.逐个轮流点亮;
3.交替闪亮;
4.其他。
5、实验代码
流程图:
main.c:
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Buffer(volatileunsignedint*)0x7006
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
externunsignedGetKey(void);
voidDelay()
{//延时子程序
unsignedinti;
for(i=0;i<32768;i++)
{
*P_Watchdog_Clear=0x0001;//清WatchDog
}
}
intmain()
{
unsignedKey=0x0000,a=0x0055,b=0x00ff;
unsignedLedControl=0x0001;
unsignedKey_next=0x0000;
*P_IOA_Dir=0x00ff;//设置A口低8位为同向低输出,高8位为同向上拉输入
*P_IOA_Attrib=0x00ff;
*P_IOA_Data=0xff00;
while
(1)
{
Key=GetKey();//取键值
Key=Key>>8;//取LED显示初值
if(Key!
=0)
Key_next=Key;
switch(Key_next)
{
case0x0000:
break;
case0x0001:
//第一个键,全亮
*P_IOA_Data=0x00ff;
Delay();break;
case0x0010:
//第五个键,循环亮
*P_IOA_Data=LedControl;//送数据到A口
LedControl=LedControl<<1;
if(LedControl>0x00FF)
LedControl=0x0001;
Delay();break;
case0x0004:
//第三个键,一排排亮
*P_IOA_Data=a;
Delay();
a=a^0x00ff;break;
case0x0008:
//第四个键,全亮和全灭
*P_IOA_Data=b;
Delay();
b=b^0x00ff;break;
}
}
}
key.c(获取键函数):
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineKEY_ALL0xff00//使用IOA8~IOA15作为键盘输入口
unsignedGetKey(void)
{
unsignedKeyValue;
//初始化IOA的相应端口为上拉输入
*P_IOA_Dir&=~KEY_ALL;
*P_IOA_Attrib&=~KEY_ALL;
*P_IOA_Buffer|=KEY_ALL;//等待有键按下,即有端口变为0
while(KeyValue==0)
{
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
*P_Watchdog_Clear=1;//清看门狗
}
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
//等待按键抬起
while((*P_IOA_Data&KEY_ALL)^KEY_ALL)
{
*P_Watchdog_Clear=1;
}
returnKeyValue;
}
6、实验结果及分析
按IOA0键,8个灯全亮且常亮;
按IOA4键,8个灯按顺序逐个轮流循环点亮;
按IOA2键,1,3,5,7灯一起亮,然后2,4,6,8灯一起亮,这样两排交替闪亮;
按IOA3键,8个灯同时亮或同时灭(交替闪亮)。
该实验主要是通过扩展板上的按键来实现各个功能,并可以通过改变地址来更改按键,是通过key.c函数来实现。
实验三 实时时钟实验
1、实验目的
1)了解SPCE061PLL振荡器的功能及其应用。
2)掌握系统时钟单元P_SystemClock的设置方法。
3)熟悉系统时钟和CPU时钟频率的编程方法。
2、实验设备
1)装有µ’nSP™IDE仿真环境的PC机一台。
2)µ’nSP™十六位单片机实验箱一个。
3、实验原理
在SPCE061A内,P_SystemClock(写)($7013H)单元控制着系统时钟和CPU时钟。
通过设置该单元的B5-B7位可以改变系统时钟的频率(Fosc=20/24/32/40/49MHz);将第0-2位置为“111”可以使CPU时钟停止工作,系统切换至低功耗的备用状态。
在备用状态下,通过设置该单元的B4位可以接通或关闭32KHz实时时钟。
而且通过设置该单元的B3位可以使32768Hz时钟处自动弱振或强振状态。
本实验通过选择不同Fosc信号频率或改变CPUClk频率来观察发光二极管亮灭的快慢。
设置P_SystemClock单元:
b15-b8
b7-b5
b4
b3
b2-b0
PLL频率选择,Fosc(MHz)
32768Hz睡眠状态
32768Hz方式选择
CPU时钟选择
000:
24.576
001:
20.48
010:
32.768
011:
40.96
1--:
49.152
1:
在睡眠状态下,32768Hz
时钟仍处于工作状态(默认)
0:
在睡眠状态下,32768Hz时钟被关闭
1:
32768Hz时钟
处强振模式
0:
32768Hz时钟
处自动弱振模式(默认)
000:
Fosc
001:
Fosc/2
010:
Fosc/4
011:
Fosc/8
100:
Fosc/16
101:
Fosc/32
110:
Fosc/64
111:
停止(睡眠状态)
4、实验步骤
1)根据实验内容连接硬件电路并检查。
2)画流程图并编写程序代码。
3)编译程序,软件调试。
4)观察LED亮灭的快慢。
5、实验代码
流程图:
main.c:
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Buffer(volatileunsignedint*)0x7006
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineP_SystemClock(volatileunsignedint*)0x7013
#defineC_FoscCLK_200x00;//Fosc=20.480MHz
#defineC_FoscCLK_240x20;//Fosc=24.576MHz
#defineC_FoscCLK_320x40;//Fosc=32.768MHz
#defineC_FoscCLK_400x60;//Fosc=40.960MHz
#defineC_FoscCLK_490x80;//Fosc=49.152MHz
#defineCPUCLK_Fosc0x00;//CPUClk选Fosc
#defineCPUCLK_Fosc20x01;//CPUClk选Fosc/2
#defineCPUCLK_Fosc40x02;//CPUClk选Fosc/4
#defineCPUCLK_Fosc80x03;//CPUClk选Fosc/8
#defineCPUCLK_Fosc160x04;//CPUClk选Fosc/16
#defineCPUCLK_Fosc320x05;//CPUClk选Fosc/32
#defineCPUCLK_Fosc640x06;//CPUClk选Fosc/64
externunsignedGetKey(void);
voidDelay()
{//延时子程序
unsignedinti;
for(i=0;i<32768;i++)
{
*P_Watchdog_Clear=0x0001;//清WatchDog
}
}
voidLed()
{
unsigneda=0x00FF;//LED亮
*P_IOA_Data=a;
Delay();
a=0x00;//LED灭
*P_IOA_Data=a;
Delay();
}
intmain()
{
unsignedKey=0x0000,r1;
unsignedKey_next=0x0000;
*P_IOA_Dir=0x00ff;//设置A口低8位为同向低输出,高8位为同向上拉输入
*P_IOA_Attrib=0x00ff;
*P_IOA_Data=0xff00;
while
(1)
{
Key=GetKey();//取键值
Key=Key>>8;//取LED显示初值
if(Key!
=0)
Key_next=Key;
switch(Key_next)
{
case0:
r1=C_FoscCLK_20;break;
case1:
r1=C_FoscCLK_24;break;//Fosc
case2:
r1=C_FoscCLK_32;break;
case4:
r1=C_FoscCLK_40;break;
case8:
r1=C_FoscCLK_49;break;
}
r1|=CPUCLK_Fosc8;//CPUClk
*P_SystemClock=r1;//系统时钟选择设置,32768Hz时钟默认为自动弱振模式既B30为0
Led();
}
*P_Watchdog_Clear=0x0001;
}
键盘扫描程序:
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineKEY_ALL0xff00//使用IOA8~IOA15作为键盘输入口
unsignedGetKey(void)
{
unsignedKeyValue;
//初始化IOA的相应端口为上拉输入
*P_IOA_Dir&=~KEY_ALL;
*P_IOA_Attrib&=~KEY_ALL;
*P_IOA_Buffer|=KEY_ALL;
//等待有键按下,即有端口变为0
while(KeyValue==0)
{
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
*P_Watchdog_Clear=1;//清看门狗
}
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
//等待按键抬起
while((*P_IOA_Data&KEY_ALL)^KEY_ALL)
{
*P_Watchdog_Clear=1;
}
returnKeyValue;
}
6、实验结果:
逐次按键IOA0∽IOA3,系统频率依次升高,Led灯的闪烁频率加快。
该实验是通过61板中的P_SystemClock(写)($7013H)单元控制着系统时钟和CPU时钟,b5-b7位可以改变系统时钟的频率,b0–b2位来选择CPU的时钟频率。
设置不同的值,可以使Led灯闪烁的频率发生改变。
实验四 A2000手动实验
1、实验目的
1)了解凌阳单片机以SACM_A2000语音格式播放及程序的编写方法。
2)了解凌阳音频编码算法库(SACM_Lib )。
3)了解SACM_A2000的语音文件。
2、实验设备
1)装有SunPlus IDE仿真开发环境的PC机一台;
2)¨’nSP™十六位单片机实验板及扩展板;
3)麦克风、扬声器已经集成到实验扩展板上;
4)凌阳语音压缩工具软件。
3、实验原理
通过WINDOWS的录音机录制的PCM音频8K16WAV文件经SACM_A2000算法压缩后变为SUB_BAND的音频格式,压缩前为:
“.wav,8k/16bit;”压缩后为:
“.16k/*.20k/*.24k下载后用相应的解压缩算法进行播放。
4、实验步骤
1)连接PC机,仿真实验板;
2)录制语音文件;进行语音压缩转换;
3)将¨’nSP™IDE打开后,建立一个新工程;
4)往新建的工程内添加语音资源;打开新建C语言,将主程序写入;
5)在该项目的源文件夹(SOURCE FILES)下建立一个新的汇编语音文件;打开新建的汇编语言,将中断程序写入;
6)在该项目的源文件中加入hardware.asm文件;
7)编译程序,软件仿真,观察结果。
5、实验内容和结果
main.c:
#include"a2000.h"
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
unsignedintKeyScan(void);//键盘扫描函数
voidDelay(void);//延时函数
unsignedPlaySnd_Auto(unsignedintuiSndIndex,unsignedintuiDAC_Channel);
//========================================================
//语法格式:
intmain(void)
//实现功能:
调用语音播放函数,通过自动方式播放两段语音资源
//========================================================
voidmain(void)
{unsignedintuiKey;//num表示当前曲目
unsignedinta,b;
*P_IOA_Dir=0x0100;//初始化IOA0~7为下拉输入,IOA8输出高
*P_IOA_Attrib=0x0100;
*P_IOA_Data=0x0100;
while
(1)//停止状态
{
uiKey=KeyScan();
if(uiKey==0x0001)
{
uiKey=KeyScan();
if(uiKey==0)
{
while
(1)
{
a=PlaySnd_Auto(0,1);
if(a==0)
break;
elseif(a==1)
b=PlaySnd_Auto(1,1);
if(b==0)
{
break;
}
*P_Watchdog_Clear=0x0001;
}
}
}
*P_Watchdog_Clear=0x0001;
}
}
//========================================================
//语法格式:
voidPlaySnd_Auto(unsignedintuiSndIndex,unsignedintuiDAC_Channel)
//实现功能:
通过自动方式播放语音资源
//参数:
1.uiSndIndex:
语音资源序号2.uiDAC_Channel:
语音播放通道
//========================================================
unsignedPlaySnd_Auto(unsignedin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机