通信与信息工程学院
2013/20##学年 第一学期
课程设计 实验报告
模 块 名 称 凌阳单片机
专 业 电子信息工程
学 生 班 级 B100111
学 生 学 号
学 生 姓 名
指 导 教 师 赵建立
报告内容
实验1 熟悉’nSP? IDE环境下的汇编程序和C程序的编写
实验目的:
熟悉汇编程序和C程序的编写。编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态,等等。
实验设备:装有WINDOWS操作系统以及SunPlus IDE仿真开发环境的PC机一台;
ì’nSP™十六位单片机实验板及扩展板。
实验原理:参照SPCE061A单片机教材和实验指导书熟悉凌阳单片机的开发环境。
实验2 键盘与二极管实验
实验目的:通过本实验熟悉SunPlus SPCE061A单片机的I/O,定时器的使用方法。中断系统的
使用。熟悉IDE开发环境的使用。
实验设备:装有WINDOWS操作系统以及SunPlus IDE仿真开发环境的PC机一台;十六位单片机实验板及扩展板。
实验原理:通过键盘扫描获得键值后分别控制二极管的亮灭;使用定时器产生不同的显示模
式。
实验步骤:
1).连接PC机与SunPlus061A仿真板;
2).连接实验板与仿真板;
3.运行IDE开发环境程序;
4.建立新工程;
5.往新工程里添加C文件,编写主程序框架;
6.往工程里添加ASM文件,编写汇编子程序;
7.往新工程中添加中断处理程序;
8.添加头文件(hardware.inc等);
9.程序编译调试,观察运行结果,寄存器状态等;
10.脱机运行。
要求:对于每个不同的按键,分别有下列响应:
1.全亮;
2.逐个轮流点亮;
3.交替闪亮;
4.其他。
(综合要求:键盘和LED灯能同时工作,定时器要用定时器中断方式实现。)
5、实验代码
流程图:
main.c:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
extern unsigned GetKey(void);
void Delay()
{ //延时子程序
unsigned int i;
for(i=0; i<32768; i++)
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
int main()
{
unsigned Key = 0x0000,a=0x0055,b=0x00ff;
unsigned LedControl = 0x0001;
unsigned Key_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)
{
case 0x0000:
break;
case 0x0001: //第一个键,全亮
*P_IOA_Data=0x00ff;
Delay();break;
case 0x0010://第五个键,循环亮
*P_IOA_Data = LedControl; //送数据到A口
LedControl = LedControl << 1;
if(LedControl > 0x00FF)
LedControl = 0x0001;
Delay();break;
case 0x0004://第三个键,一排排亮
*P_IOA_Data=a;
Delay();
a=a^0x00ff;break;
case 0x0008://第四个键,全亮和全灭
*P_IOA_Data=b;
Delay();
b=b^0x00ff;break;
}
}
}
key.c(获取键函数):
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define KEY_ALL 0xff00 //使用IOA8~IOA15作为键盘输入口
unsigned GetKey(void)
{
unsigned KeyValue;
//初始化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;
}
return KeyValue;
}
6、实验结果:
按IOA0键,8个灯全亮且常亮;
按IOA2键,1,3,5,7灯一起亮,然后2,4,6,8灯一起亮,这样两排交替闪亮;
按IOA3键,8个灯同时亮或同时灭(交替闪亮)。
按IOA4键,8个灯按顺序逐个轮流循环点亮;
实验3 实时时钟实验
实验目的:
1)了解SPCE061 PLL 振荡器的功能及其应用。
2)掌握系统时钟单元P_SystemClock的设置方法。
3)熟悉系统时钟和CPU时钟频率的编程方法。
实验设备:
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频率来观察发光二极管亮灭的快慢。
实验步骤:
1)根据实验内容连接硬件电路并检查。
2)画流程图并编写程序代码。
3)编译程序,软件调试。
4)观察LED亮灭的快慢,并通过示波器观察波形。
要求: LED亮灭的快慢及通过示波器观察波形反映的定时信号与设计一致.
(综合要求:要能通过键盘动态改变系统时钟和CPU时钟频率。)
5、实验代码
流程图:
main.c:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_SystemClock (volatile unsigned int *)0x7013
#define C_FoscCLK_20 0x00; //Fosc=20.480MHz
#define C_FoscCLK_24 0x20; //Fosc=24.576MHz
#define C_FoscCLK_32 0x40; //Fosc=32.768MHz
#define C_FoscCLK_40 0x60; //Fosc=40.960MHz
#define C_FoscCLK_49 0x80; //Fosc=49.152MHz
#define CPUCLK_Fosc 0x00; //CPUClk选Fosc
#define CPUCLK_Fosc2 0x01; //CPUClk选Fosc/2
#define CPUCLK_Fosc4 0x02; //CPUClk选Fosc/4
#define CPUCLK_Fosc8 0x03; //CPUClk选Fosc/8
#define CPUCLK_Fosc16 0x04; //CPUClk选Fosc/16
#define CPUCLK_Fosc32 0x05; //CPUClk选Fosc/32
#define CPUCLK_Fosc64 0x06; //CPUClk选Fosc/64
extern unsigned GetKey(void);
void Delay()
{ //延时子程序
unsigned int i;
for(i=0; i<32768; i++)
{
*P_Watchdog_Clear=0x0001; //清WatchDog
}
}
void Led()
{
unsigned a = 0x00FF; //LED亮
*P_IOA_Data= a;
Delay();
a = 0x00; //LED灭
*P_IOA_Data= a;
Delay();
}
int main()
{
unsigned Key = 0x0000,r1;
unsigned Key_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)
{
case 0:
r1=C_FoscCLK_20;break;
case 1:
r1=C_FoscCLK_24;break; //Fosc
case 2:
r1=C_FoscCLK_32; break;
case 4:
r1=C_FoscCLK_40;break;
case 8:
r1=C_FoscCLK_49; break;
}
r1|=CPUCLK_Fosc8; //CPUClk
*P_SystemClock=r1; //系统时钟选择设置,32768Hz时钟默认为自动弱振模式既B30为0
Led();
}
*P_Watchdog_Clear=0x0001;
}
键盘扫描程序:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define KEY_ALL 0xff00 //使用IOA8~IOA15作为键盘输入口
unsigned GetKey(void)
{
unsigned KeyValue;
//初始化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;
}
return KeyValue;
}
6、实验结果:
逐次按键IOA0∽IOA3,系统频率依次升高,Led灯的闪烁频率加快。
实验4 A2000手动实验
实验目的:
1)了解凌阳单片机以SACM_A2000语音格式播放及程序的编写方法。
2)了解凌阳音频编码算法库(SACM_Lib )。
3)了解SACM_A2000的语音文件。
实验设备:
1)装有SunPlus IDE仿真开发环境的PC机一台;
2)¨’nSP™十六位单片机实验板及扩展板;
3)麦克风、扬声器已经集成到实验扩展板上;
4)凌阳语音压缩工具软件。
实验原理:通过WINDOWS的录音机录制的PCM音频8K16WAV文件经SACM_A2000算法压缩后变为SUB_BAND的音频格式,压缩前为:“.wav,8k/16bit;”压缩后为:“.16k/*.20k/*.24k下载
后用相应的解压缩算法进行播放。
实验步骤:
1)连接PC机,仿真实验板;
2)录制语音文件;
3)进行语音压缩转换;
4)将¨’nSP™IDE打开后,建立一个新工程;
5)往新建的工程内添加语音资源;
6)打开新建C语言,将主程序写入;
7)在该项目的源文件夹(SOURCE FILES)下建立一个新的汇编语音文件;
8)打开新建的汇编语言,将中断程序写入;
9)在该项目的源文件中加入hardware.asm文件;
10)编译程序,软件仿真,观察结果。
要求:能够用键盘控制语音的选择播放。
(综合要求:掌握声音文件生成方法及声音播放控制程序的编写)
5、实验内容和结果
main.c:
#include "a2000.h"
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
unsigned int KeyScan(void); //键盘扫描函数
void Delay(void); //延时函数
unsigned PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel);
//========================================================
// 语法格式: int main(void)
// 实现功能: 调用语音播放函数,通过自动方式播放两段语音资源
//========================================================
void main(void)
{ unsigned int uiKey; //num表示当前曲目
unsigned int a,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;
else if(a==1)
b=PlaySnd_Auto(1,1);
if(b==0)
{
break;
}
*P_Watchdog_Clear = 0x0001;
}
}
}
*P_Watchdog_Clear = 0x0001;
}
}
//========================================================
// 语法格式: void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel)
// 实现功能: 通过自动方式播放语音资源
// 参数: 1.uiSndIndex:语音资源序号 2.uiDAC_Channel:语音播放通道
//========================================================
unsigned PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel)
{ unsigned int uiKey;
SACM_A2000_Initial(1); //初始化语音播放,自动方式
SACM_A2000_Play(uiSndIndex,uiDAC_Channel,3); //播放语音
while((SACM_A2000_Status() & 0x0001) != 0)
{ uiKey = KeyScan();
if (uiKey == 0x0001)
{
uiKey = KeyScan();
if(uiKey ==0)
{
SACM_A2000_Pause();
while(1)
{
uiKey = KeyScan();
if(uiKey == 0x0001)
{
uiKey = KeyScan();
if(uiKey ==0)
break;
}
*P_Watchdog_Clear = 0x0001;
}
}
SACM_A2000_Resume();
}
else if(uiKey == 0x0002)
{
uiKey = KeyScan();
if(uiKey ==0)
{
SACM_A2000_Stop();
return 0;
}
}
else if(uiKey == 0x0004)
{
uiKey = KeyScan();
if(uiKey ==0)
{
SACM_A2000_Stop();
Delay();
Delay();
Delay();
Delay();
Delay();
Delay();
Delay();
return 1;
}
}
SACM_A2000_ServiceLoop(); //服务程序
*P_Watchdog_Clear = 0x0001;
}
return 1;
}
//键盘扫描程序
unsigned int KeyScan(void)
{
unsigned int uiData;
unsigned int uiTemp;
uiData = *P_IOA_Data; //读取IOA端口输入
uiData = uiData&0x00ff; //仅取低八位有效值
if(uiData!=0) //非零则表示有键按下
{
Delay(); //延时消抖
uiTemp = *P_IOA_Data;
uiTemp = uiTemp&0x00ff; //仅取低八位有效值
if(uiData != uiTemp)
uiData = 0; //两次读数不相等,则置返回值为0
}
return uiData; //返回键值
}
void Delay(void) //延时程序
{
unsigned int uiCount;
for(uiCount = 0;uiCount <= 3000;uiCount++)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}
6、实验结果:
通过用61板上的key1、key2、key3键来控制语音的播放(总共两首语音),具体如下:
key1键:开始播放语音,且顺序播放;
Key2键:暂停播放语音
Key3键:跳过当前曲目播放下一首语音
实验5 UART实验
实验目的:
1)了解SPCE061A串行口(UART)的结构、与PC机串行通讯的原理。
2)了解UART的各配置单元P_UART_BaudScalarLow (7024H)、P_UART_BaudScalarHigh (7025H)、 P_UART_Command1(7021H)和P_UART_Command2 (7022H)的功能及控制方法。
3)掌握PC机与单片机通讯的编程方法。
实验设备:
1) 装有µ’nSP? IDE仿真环境的PC机一台。
2) µ’nSP?十六位单片机实验箱一个。
3)连接软条线一根。
实验原理:
UART模块提供了一个全双工标准接口,用于完成SPCE061A与外设之间的串行通讯。借助于IOB口的特殊功能和UART IRQ中断,可以同时完成UART接口的接收发送数据的过程。 硬件电路原理为:使用一根连接软条线就可以实现串口自环测试。
实验步骤:
1)根据内容自行设计硬件连接图,连接硬件并检查。
2)画流程图并编写程序代码。
3)编译程序,软件调试。
4)观察LED、各个寄存器状态。
要求:
在从内存中能观测到发送和接收的数据。
(综合要求:按不同的键时向 PC发送不同内容的字符串。)
5、实验代码
流程图:
main.c:
#define P_IOA_Data (unsigned int*)0x7000
#define P_IOA_Buffer (unsigned int*)0x7001
#define P_IOA_Dir (unsigned int*)0x7002
#define P_IOA_Attrib (unsigned int*)0x7003
#define P_IOA_Latch (unsigned int*)0x7004
#define P_IOB_Data (unsigned int*)0x7005
#define P_IOB_Buffer (unsigned int*)0x7006
#define P_IOB_Dir (unsigned int*)0x7007
#define P_IOB_Attrib (unsigned int*)0x7008
#define P_Watchdog_Clear (unsigned int*)0x7012
#define P_ADC (unsigned int*)0x7014
#define P_ADC_Ctrl (unsigned int*)0x7015
#define P_ADC_MUX_Ctrl (unsigned int*)0x702B
#define P_ADC_MUX_Data (unsigned int*)0x702C
unsigned int KeyScan(void);
void Delay(void);
unsigned int adc(unsigned int channel);
int main(void)
{
unsigned int Key ,kk;
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x00f8;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0x40ff;
*P_IOB_Attrib=0x40ff;
*P_IOB_Data=0x4000;
kk=4;
while(1)
{
Key = KeyScan();
switch(Key)
{
case 0x01:kk=4;break;
case 0x02:kk=5;break;
case 0x04:kk=6;break;
default:break;
}
*P_IOB_Data=adc(kk);
*P_Watchdog_Clear = 0x0001;
}
}
unsigned int adc(unsigned int channel) //A/D转换程序
{
unsigned int item;
unsigned int Key;
*P_ADC_Ctrl=0x0001;
*P_ADC_MUX_Ctrl=channel;
item=*P_ADC_MUX_Data;
while(1)
{
while(!(*P_ADC_MUX_Ctrl & 0x8000)) //判断AD转换是否完成
*P_Watchdog_Clear=0x0001;
item=*P_ADC_MUX_Data;
item&=0xff00;
item>>=8;
item|=0x4000;
return item;
}
}
unsigned int KeyScan(void)
{
unsigned int uiData;
if((*P_IOA_Data&0x0007) != 0) //非零则表示有键按下
{
Delay(); //延时消抖
if((*P_IOA_Data&0x0007) != 0)
{
uiData = *P_IOA_Data&0x0007;
while((*P_IOA_Data&0x0007) != 0)//按下状态
*P_Watchdog_Clear = 1;
return uiData;
} //两次读数不相等,则置返回值为0
}
return 0; //返回键值
}
void Delay(void)
{
unsigned int uiCount;
for(uiCount = 0;uiCount <= 3000;uiCount++)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}
6、实验结果:
用61板上的key1、 key2 、key3键来控制模拟量的输入(key1、 key2 、key3对应于61板上的IOA0、IOA1、IOA2),具体如下:
key1键,选择IOA3口作为模拟电平的输入口,若将IOA3口接3.3V高电平,IOB口输出为全1,Led灯全亮;若将IOA3口接地,B口输出为全0,Led灯全灭;将A3口接61板上参考电压VREF,IOB口输出0111 1001.
按key2、key3键,分别选择IOA4、IOA5口作为模拟电平的输入口,现象可类比IOA3口上。
实验6 A/D转换
实验目的:
1)了解ADC输入接口的结构与转换原理
2)熟悉模拟量输入口LINE_IN1—LINE_IN7的使用
3)掌握 P_ADC、 P_ADC_CTRL单元的设置方法
实验设备:
1)装有µ’nSP? IDE仿真环境的PC机一台
2)µ’nSP?十六位单片机实验箱一个
实验原理:
ADC工作方式分手动和自动两种当ADC工作在自动方式下:
1)外部信号由LIN_IN[1~7]即IOA[0~6]输入并直接被送入缓冲器P_ADC_MUX_Data($702BH);,在ADC自动方式被启用后,会产生出一个启动信号,即RDY=0。此时,DAC0的电压模拟量输出值与外部的电压模拟量输入值进行比较,以尽快找出外部电压模拟量的数字量输出值,A/D转换的结果保存在SAR内。
2)当10位A/D转换完成时,RDY会被置‘1’。此时,用户通过读取P_ADC_MUX_Data($702BH)单元可以获得10位A/D转换的数据。而从该单元读取数据后,又会使RDY自动清‘0’来重新开始进行A/D转换。 本实验通过改变LINE_IN端口的模拟电压来改变IOB口输出的数据,采用自动方式即定时器A溢出执行ADC转换,可以通过发光二极管的点亮了解转换的数据值。
实验步骤:
1)根据实验内容连接硬件电路并检查。
2)画流程图并编写程序代码。
3)编译程序,软件调试。
4) 通过改变输入电压,来观察LED灯的亮灭。
要求:1)LED灯的亮灭与输入电压值相符合。
(综合要求:可用按键控制选择外部信号。)
5、实验内容和结果
main.c:
#include "hardware.h"
#include "dvr.h"
#define C_flashSize 0xf000
#define sector 0xa000 //定义FLASH写的起始地址
#define Stop 0
#define Record 1
#define Play 2
#define Full 1
#define Empty 2
#define DAC1 1
#define DAC2 2
#define RceMonitorOff 0
#define RceMonitorOn 1
#define Manual 0
#define Auto 1
unsigned int Status;
unsigned int Ret;
unsigned int Key;
unsigned int Addr, Save_Addr;
//*********************************************************//
//函数:main()
//描述:主函数
//*********************************************************//
int main()
{
System_Initial();
SACM_DVR_Initial(Manual); //手动方式控制
Status = Stop;
while(1)
{
Key = SP_GetCh(); //获取键值
switch(Key)
{
case 0x0001: //KEY1
//**********************录音(record)***********************//
//*********************************************************//
for(Addr=sector;Addr<0xf000;Addr+=256)
{
Clear_WatchDog();
F_FlashErase(Addr);
}
Status = Record;
Addr=sector;
// DVR初始化
SACM_DVR_InitQueue();
SACM_DVR_InitEncoder(RceMonitorOn);
break;
case 0x0002: // KEY2
//**********************停止(stop)*************************//
//*********************************************************//
switch(Status)
{
case Record: // 仍在录音
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != Empty )
{
Ret = SACM_DVR_FetchQueue();// 从队列中取数
F_FlashWrite1Word(Addr,Ret);
Addr += 1;
}
break;
case Play:
SACM_DVR_Stop();
break;
default:
break;
}
Status = Stop;
break;
case 0x0004: //KEY3
//************************回放(playback)*******************//
//*********************************************************//
SACM_DVR_Stop();
if(Status == Record)
{
while(SACM_DVR_TestQueue() != Empty)
{
Ret = SACM_DVR_FetchQueue();// Put remain data to Queue
F_FlashWrite1Word(Addr,Ret);// save to User Storage
Addr+= 1;
}
}
// Save_Addr=Addr;
Status = Play;
Addr = sector; //播放的首地址
SACM_DVR_InitQueue();
while(SACM_DVR_TestQueue() != Full) //如果队列不满则继续填
{
Ret=F_FlashRead(Addr); //从flash中读出数据
SACM_DVR_FillQueue(Ret); //填队列
Addr+= 1;
}
SACM_DVR_InitDecoder(DAC1+DAC2);
break;
default:
break;
}
//************************状态判断处理*********************//
//*********************************************************//
switch(Status)
{
case Record:
//**********************停止(stop)*************************//
//*********************************************************//
if(Addr< C_flashSize)
{
SACM_DVR_Encode(); // 取数据并编码
if(SACM_DVR_TestQueue() != Empty) //如果队列没空则将数据保存
{
Ret = SACM_DVR_FetchQueue();//从队列中取数
F_FlashWrite1Word(Addr,Ret);//将数据写入flash
Addr+= 1;
}
}
else
{
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != Empty )
{
Ret = SACM_DVR_FetchQueue();
F_FlashWrite1Word(Addr,Ret);
Addr+= 1;
}
Status = Stop;
}
break;
case Play:
//************************回放(playback)*******************//
//*********************************************************//
if(SACM_DVR_Status()&0x01) //是否正在播放
{
if(SACM_DVR_TestQueue() != Full)
{
Ret=F_FlashRead(Addr); //读出flash中的数据
SACM_DVR_FillQueue(Ret); // 填队列
Addr += 1;
}
}
else
{
SACM_DVR_Stop();
Status = Stop;
// SP_RampDnDAC1();
// SP_RampDnDAC2();
}
SACM_DVR_Decode(); //解码/播放
break;
case Stop:
break;
default:
break;
}
System_ServiceLoop(); //键盘扫描
}
}
6、实验结果:
用61板上的key1、 key2 、key3键来控制功能。具体如下:
key1键,从麦克风录音;
key2键,录音结束或停止播放;
key3键,播放录音。
实验小结
经过本次的课程设计,我学会了运用u'nSPTM IDE软件进行汇编以及c语言的编程,对凌阳单片机的构造、实现功能有了一定的了解。作为一名通信专业的大四学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。在这次课程设计中,遇到的问题很多,但在老师同学的帮助下也都一一解决。这次实习让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会相互讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。
在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。
设计成绩评定