凌阳单片机课程设计报告

时间:2024.5.2

通信与信息工程学院

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&#8482;十六位单片机实验板及扩展板;

3)麦克风、扬声器已经集成到实验扩展板上;

4)凌阳语音压缩工具软件。

实验原理:通过WINDOWS的录音机录制的PCM音频8K16WAV文件经SACM_A2000算法压缩后变为SUB_BAND的音频格式,压缩前为:“.wav,8k/16bit;”压缩后为:“.16k/*.20k/*.24k下载

后用相应的解压缩算法进行播放。

实验步骤:

1)连接PC机,仿真实验板;

2)录制语音文件;

3)进行语音压缩转换;

4)将¨’nSP&#8482;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语言的编程,对凌阳单片机的构造、实现功能有了一定的了解。作为一名通信专业的大四学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。在这次课程设计中,遇到的问题很多,但在老师同学的帮助下也都一一解决。这次实习让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会相互讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。

在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。


设计成绩评定

更多相关推荐:
《单片机课程设计》报告

机械与车辆学院单片机课程设计报告20xx20xx学年第一学期课程设计题目水塔水位控制系统姓名学号班级指导老师职称时间成绩单片机课程设计考查评分表2目录一课程设计性质和目的4二课程设计的内容及要求41硬件设计42...

单片机课程设计报告

物理与机电学院课程设计报告课程名称:单片机课程设计系部:物理与机电工程学院专业班级:07级电子信息工程(1)班完成时间:20XX年5月24日~28日报告成绩:【摘要】单片机自1976年由Intel公司推出MCS…

51单片机课程设计报告。

成绩单片机原理及应用课程设计课程名ltlt单片机原理及应用gtgt学部专业学号姓名指导教师日期20xx年06月一设计任务与要求1任务制作并调试51单片机学习板2要求1了解并能识别学习板上的各种元器件会读元器件标...

流水灯单片机课程设计报告

井冈山大学机电工程学院单片机课程设计报告课程名称单片机设计题目流水灯姓名覃家应陈东阳专业生物医学工程班级10级医工本一班学号100615062指导教师王佑湖20xx年11月10日目录1引言211设计任务212设...

单片机课程设计报告范例

单片机课程设计示例交通灯控制系统设计一总体设计1设计要求交通灯的任务要求为模拟十字路口的交通灯的亮灭及闪烁基本工作原理根据交通灯的亮灭情况可以分为四种状态利用定时计数器每20秒产生一次中断每产生一次中断后由是否...

51单片机电子时钟课程设计报告

JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20xx级电工2班学号20xx401020xx2姓名王贞指导教师邹云峰提交日期20xx...

基于51单片机课程设计报告

课题:基于51单片机的数字温度计设计专业:电气工程及其自动化班级:4学号:姓名:指导教师:设计日期:20##/6/3成绩:重庆大学城市科技学院电气学院基于51单片机数字温度计设计报告一、设计目的作用本设计是一款…

单片机电子时钟课程设计报告

基于单片机电子时钟的设计绪论单片机自20世纪70年代问世以来以其极高的性能价格比受到人们的重视和关注应用很广发展很快单片机体积小重量轻抗干扰能力强环境要求不高价格低廉可靠性高灵活性好开发较为容易由于具有上述优点...

单片机课程设计报告

文华学院单片机原理及应用课程设计报告设计题目姓名学号班级指导教师20xx年月日目录一标题二设计内容设计要求三设计思路四工作原理五硬件设计六软件设计含流程图七调试遇到的问题和解决方法八改进意见九收获及体会十源程序...

单片机课程设计数字钟报告

单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时间就是生命时间对人们来说总是那么宝贵工作的忙碌性和繁杂性容易使人忘记当前的时间忘...

单片机课程设计数字钟实验报告

单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示…

基于单片机的电子密码锁设计_单片机课程设计报告

单片机密码锁课程设计报告湖南师大本科生课程设计目录1引言12设计要求23硬件电路设计331设计方案的选择332主要元器件简介433硬件系统结构84程序设计135总结15参考文献16附件一电路原理图及作品实物图1...

单片机课程设计报告(45篇)