单片机实验报告

单片机实验报告

第一次实验:编程与环境学习

[实验目的]

1) 熟悉µ’nSP? IDE环境及在该环境下用汇编语言或C语言编写应用程序;

2) 熟悉简单的µ’nSP?汇编语言指令。

[实验设备]

装有WINDOWS系统和µ’nSP? IDE仿真环境的PC机一台。

[实验内容[

1)用汇编实现1到200中的偶数的累加计算;

2)用汇编语言编写一个排序程序。

        .IRAM

        Array   .DW 5,89,40,12,55,32,18,46,77,21

[实验步骤]

1)将µ’nSP? IDE打开后,建立一个新工程;

2)在该项目的源文件夹(SOURCE FILES)下建立一个新的汇编语言文件;

3)编写汇编代码;

4)编译程序软件调试观察并跟踪其结果。

[实验准备]

实验中的两个程序:

(1)                    .RAM

.CODE

.VAR Sum

.PUBLIC _main

_main:

     R1=0x0002

     R2=0x0000

Loop:

     R2+=R1

     R1+=2

     CMP R1,200

     JNA Loop

     [Sum]=R2

Loop1:  nop

     JMP Loop1

.END

(2)

.IRAM

ARRAY: .DW  5,89,40,12,55,32,18,46,77,21

.VAR flag

.CODE

.PUBLIC _main

_main:

     BP=array

     R1=0x0009

     R4=0x0000

     [flag]=R4

Loop:R3=[BP]

     CMP R3,[BP+1]

     JB  NEXT

     R2=[BP+1]

     [BP]=R2

     [BP+1]=R3

     R3=0x0001

     [flag]=R3

NEXT:BP=BP+1

     R1-=1

     JNZ Loop    

     R4=[flag]

     JNZ _main

Loop1:NOP

      JMP  Loop1

[实验中遇到的问题与解决措施]

编写程序中出现了一些逻辑错误,错将R1置为0x000A,改正后得到了正确结果。

次实验:并行I/O

实验三:使用汇编语言实现A口的输出实验

实验四:使用C语言实现A口的输出实验

实验五:使用汇编语言实现A口为输入B口为输出实验

实验六:使用C语言实现A口为输入B口为输出实验

[实验目的]

1)通过实验掌握A口、B口作为输入和输出口时的使用方法;

2)使用汇编语言或C语言来实现A口或B口作为输入和输出口的实验。

[实验设备]

1)装有WINDOWS系统和µ’nSP? IDE仿真环境的PC机一台;

2)µ’nSP?十六位单片机实验箱一个。

[实验原理]

实验三、四:通过点亮不同发光二极管来显示A口输出的数值不同。

实验五、六:根据按键的不同,A口的数据就不同,则传送到B口的数据就不同,相应的发光二极管被点亮。

    该实验中用到实验箱中的逻辑电平指示灯和1*8的键盘。

1)逻辑电平指示灯:具有8 路,阳极接电阻排至V5( Vcc),I/O 端口低电平“点亮”。逻辑电平指示灯电路8 路图见下图:

逻辑电平指示灯电路原理图

2)1*8键盘电路

可分别“H” 或 “L”, 由SW 选择,配合内部的上拉/下拉电阻合理使用。

1*8 键盘电路原理图

[实验硬件连接]

实验内容二:B口输入,A口输出

[实验内容]

1、根据所提供的程序学习实验三、四、五、六。

2、建立一个项目,编写程序,实现:
按键连接B口作为输入,A口为输出连接发光二极管。通过按键控制相应的发光二极管亮或灭。

[实验准备]

(要求写出实验内容2的程序,加入适当的指令说明)

(1)    在试验5,6基础上改编程序实现B口输入A口输出:

Main函数里:

L_User_Init_IO:                改为:L_User_Init_IO: 

R1 = 0x0000;                                  R1 = 0x0000;

       [P_IOA_Dir] = R1;                       [P_IOB_Dir] = R1;

       [P_IOA_Attrib] = R1;                 [P_IOB_Attrib] = R1;

       [P_IOA_Data] = R1;                   [P_IOB_Data] = R1

       R1 = 0xffff;                                 R1 = 0xffff;

       [P_IOB_Dir] = R1;                      [P_IOA_Dir] = R1;    

       [P_IOB_Attrib] = R1;                [P_IOA_Attrib] = R1;

       R1 = 0x0000;                               R1 = 0x0000;

       [P_IOB_Data] = R1;                   [P_IOA_Data] = R1;

                        RETF;                                     RETF;

KEY函数里:

(1)  F_Key_Scan_ServiceLoop:

                        r1 = [P_IOA_Data];                            //从IOA口获取按键数据

改为:     F_Key_Scan_ServiceLoop:

                        r1 = [P_IOB_Data] ;                           //从IOB口获取按键数据

(2)  F_Key_Scan_ServiceLoop_2:

                        r1 = [P_IOA_Buffer];                         //IOA7位置为0

                        r1 &= 0xFF7F;                       

[P_IOA_Buffer] = r1;

                        r1 = [P_IOA_Data];                            //从IOA口获取按键数据

            r1 &= 0x000F;              

r2 = r1;                                                                                 

            r3 = r2 xor 0xffff;

nop;

            nop;    

                r1 = [P_IOA_Buffer];                                 // IOA7位置为1

                        r1 |= 0x0080;                                                  

[P_IOA_Buffer] = r1;                      

                        r1 = [P_IOA_Data];                                                   

改为

     r1 = [P_IOA_Buffer];                         // IOA7位置为0

                                    r1 &= 0xFF7F;                       

[P_IOA_Buffer] = r1;

                                    r1 = [P_IOB_Data];    //从IOB口获取按键数据  

                        r1 &= 0x000F;              

r2 = r1;                                                  

                        r3 = r2 xor 0xffff;

nop;

                        nop;

r1 = [P_IOA_Buffer];                            // IOA7位置为1

                                    r1 |= 0x0080;                                                  

[P_IOA_Buffer] = r1;               

                                    r1 = [P_IOB_Data];                                                   

[实验中遇到的问题与解决措施]

开始时未改动按键函数,始终无变化,改动后,实验现象和预期的一样。

次实验:系统时钟与定时器

参看实验七:定时器Timer A/B实验

实验八:系统时钟实验

[实验目的]

1)  通过实验了解定时器Timer A/B的结构及使用方法;掌握预置数单元P_TimerA/B_Data和定时控制单元P_ TimerA/B_Ctrl的设置方法;熟悉定时器Timer A/B的编程方法。

2)  了解SPCE061 PLL 振荡器的功能及其应用;掌握系统时钟单元P_SystemClock的设置方法;熟悉系统时钟和CPU时钟频率的编程方法。

[实验设备]

同前。

[实验原理]

实验七:TimerA和TimerB定时器启动后在预置数单元P_TimerA_Data或P_TimerB_Data内置入一个计数初值N后,定时器/计数器会在选择的时钟源频率下开始向计数增加的方向计数,N+1,N+2,……FFFEH,当计数到FFFFH后定时器/计数器溢出。

一方面,产生一个中断请求信号TA_TimeOut_Int或TB_TimeOut_IntCPU,响应后执行相应的中断服务程序,与此同时计数初值N会被自动重新置入定时器/计数器内并重复上述加计数的过程。

另一方面,该溢出信号会作为脉宽调制输出计数器的时钟源输入,使其输出一个具有四位可调的脉宽调制占空比输出信号APWMO或BPWMO,其中IOB8,IOB9分别为APWM,BPWM的输出端。

IOB8接一个发光二极管,可以通过观察二极管亮灭的快慢来对比频率的变化。

实验八:在SPCE061A内,P_SystemClock(写)($7013H)单元控制着系统时钟和CPU时钟,通过设置该单元的b5-b7位可以改变系统时钟的频率(Fosc=20/24/32/40/49MHz);将第0-2位置为111可以使CPU时钟停止工作,系统切换至低功耗的备用状态。本实验通过选择不同Fosc信号频率或改变CPUClk频率来观察发光二极管亮灭的快慢。

[实验硬件连接]

实验七:IOB8接一个发光二极管

实验八:

[实验内容]

1)学习实验七、八;

2)建立新的项目,在定时器B下完成下列任务:

⑴当输入时钟分别为CLKA=FOSC/2、CLKA=FOSC/256、CLKA=32768HZ、CLKA=8192HZ、CLKA=4096HZ时观察输出频率;

     ⑵固定时钟,如CLK为4096HZ,设置不同的计数初值,观察溢出时IOB9输出;

⑶选择同一时钟源,改变占空比,观察灯的闪烁变化。

             3)对实验八

1)选择不同FOSC信号频率,观察发光二极管亮灭快慢;

2)改变CPUCLK频率,观察发光二极管亮灭快慢。

 [实验准备]

      

一, 写出实验内容二的程序,并说明如何完成或设置内容二中各个任务,预计实验结果。

在定时器B下工作

实验七程序更改:第一初始化改变:

.DEFINE          P_TimerA_Data 0x700A;改为.DEFINE  P_TimerB_Data             0x700C;

.DEFINE          P_TimerA_Ctrl            0x700B;改为 .DEFINE        P_TimerB_Ctrl               0x700D;

第二IOB8输出改为IOB9 :

_main:                        改为: _main:

R1=0x0100;                           R1=0x0200;

      [P_IOA_DIR]=R1;                [P_IOA_DIR]=R1;

[P_IOA_DIR]=R1;                [P_IOA_DIR]=R1;

第三定时器A改为定时器B:

            R1=0xff9f;                              改为:R1=0xff9f;

            [P_TimerA_Data]=R1;            [P_TimerB_Data]=R1;

            R1=C_Time_Clk_4096;            R1=C_Time_Clk_4096;

            [P_TimerA_Ctrl]=R1;             [P_TimerB_Ctrl]=R1;

然后在保存运行即可实验现象和原例七timerA的结果类似。

      [实验总结]

通过此次实验掌握了设置计数初值,频率和占空比的方法。而且观察到了不同的频率,计数初值,占空比对应的会有不同的实验现象。

次实验:定时器中断和时基中断

参看实验九:FIQ中断实验

实验十:IRQ0/IRQ1/IRQ2中断实验

实验十一:IRQ4中断实验

实验十二:IRQ5中断实验

实验十三:IRQ6中断实验

[实验目的]

1)了解FIQ的中断向量和中断源; 掌握中断控制单元P_INT_Ctrl、P_INT_Clear的设置方法;熟悉定时器中断的编程方法。

2)了解IRQ0、IRQ1、IRQ2的中断向量和中断源; 掌握中断控制单元P_INT_Ctrl、P_INT_Clear的设置方法; 熟悉定时器中断的编程方法。

3)  了解IRQ4的中断向量和中断源; 掌握中断控制单元P_INT_Ctrl、P_INT_Clear的设置方法; 熟悉时基中断的编程方法

4)  了解IRQ5的中断向量和中断源; 掌握中断控制单元P_INT_Ctrl、P_INT_Clear的设置方法; 熟悉时基中断的编程方法

5)  了解IRQ6的中断向量和中断源; 掌握中断控制单元P_INT_Ctrl、P_INT_Clear的设置方法; 熟悉时基中断的编程方法

[实验设备]

同前。

[实验原理]

实验九:FIQ中断对应PWM、TMA、TMB中断源;通过写P_INT_Ctrl来设置中断允许,FIQ_TMA,FIQ_TMB中断源分别是通过定时器A、定时器B产生的。当计满溢出时产生中断请求信号TA_TIMEOUT_Int或TB_TIMEOUT_Int,CPU响应后进入中断执行相应的子程序,中断程序里可以通过读取P_INT_Ctrl单元,判断是哪个中断源并进入相应的子程序控制发光二极管点亮。

实验十:IRQ0_PWM、IRQ1_TMA、IRQ2_TMB中断源,通过写P_INT_Ctrl来设置中断允许,IRQ1_TMA和IRQ2_TMB 中断源分别是通过定时器A、定时器B产生的。当计数满溢出时产生中断请求信号TA_TIMEOUT_Int或TB_TIMEOUT_Int,CPU响应后进入对应的中断,并在相应的中断程序里执行控制发光二极管亮灭的程序。

实验十一:IRQ4中断对应 4096Hz、2048Hz、1024Hz中断源,通过写P_INT_Ctrl来设置中断允许CPU响应后进入中断。我们编写一个用中断方式控制发光二极管亮灭程序,中断程序里读取P_INT_Ctrl单元,判断是哪个中断源转到相应中断程序控制对应发光二极管亮或灭,从而了解IRQ4 中断的组成及编程。

实验十二:IRQ5中断对应4Hz、2Hz中断源,通过写P_INT_Ctrl来设置中断允许程序运行后就会产生相应的中断。我们编写一个用中断方式控制发光二极管亮灭程序,中断程序里读取P_INT_Ctrl单元,判断是哪个中断源转到相应中断程序控制对应发光二极管亮或灭,从而了解IRQ5 中断的组成及编程。

实验十三:IRQ6 中断对应TMB1、TMB2中断源,先设置P_TimeBase_Setup通过改变TMB1_clk可以选择时基频率TMB1:8/16/32/64Hz;同样改变tmb2_clk可以选择时基频TMB2: 128/256/5122/1024Hz。写P_INT_Ctrl设置中断允许,CPU响应中断后可以通过读取P_INT_Ctrl 单元,判断是哪个中断源并进入相应的子程序控制发光二极管亮灭。

[实验硬件连接]

实验九、十、十二十三:A口的低四位接LED灯,

B口的低四位接LED灯。

实验十一:A口的低八位接LED灯。

[实验内容]

1学习实验九、十、十一、十二、十三;

2  建立新的项目,选用FIQ方式或IRQ方式实现定时器中断,使A口输出控制的发光二极管以1S的周期闪烁;使B口输出控制的发光二极管以2S的周期闪烁。

3建立新项目,选用IRQ4、IRQ5或IRQ5实现时基中断,使A口输出控制的发光二极管以2S的周期闪烁;使B口输出控制的发光二极管以4S的周期闪烁。

      [实验准备]

       要求:

1、写出实验内容2的程序,并说明如何完成或设置内容二中各个任务,预计实验结果。

实验程序:

选用FIQ中断方式中的定时器中断源,定时器A或B计满溢出产生中断请求信号。

.INCLUDE hardware.inc;

.DEFINE          C_Timea_Clk       0x0005;

.DEFINE          C_Timeb_Clk       0x0004; 

.CODE

.PUBLIC _main

_main:

     INT OFF

     R1 = 0xffff                         //IOA口设为同相高电平输出口;

     [P_IOA_ATTRI] = R1

     [P_IOA_DIR] = R1

     [P_IOA_DATA] = R1

     R1 = 0xffff                         //B口的低8位设置为同相高电平输出 ;

    [P_IOB_DIR] = R1

     [P_IOB_ATTRI] = R1

     [P_IOB_DATA] = R1

     R1 = 0xdfff;

     [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

     INT FIQ

L_Loop:

     NOP

     JMP L_Loop

.TEXT     

.PUBLIC _FIQ          

_FIQ:

    PUSH R1,r5 TO [sp]            //压栈保护

    R1 = 0x0800     

    test R1,[P_INT_CTRL]          //比较是否为FIQ_TMB     

    JNZ  L_FIQ_TMB                     //是,则转至对应程序段

    R1 = 0x2000     

    TEST R1,[P_INT_CTRL]          //否,则比较是否为FIQ_TMA

    JNZ  L_FIQ_TMA                      //是,则转至对应程序段

L_FIQ_PWM:                          //否,则进入FIQ_PWM中断   

R1 = 0x8000        

     [P_INT_CLEAR] = R1

     POP R1,r5 FROM [sp]  

     RETI

L_FIQ_TMA:  

     R1 = 0xfff0

     [P_IOA_DATA] = R1

     R5 = 0xffff;                        //延时

L_Delay1: 

     R2 -= 1;

     JNZ L_Delay1;

     R1 = 0xffff;                        //熄灭LED

     [P_IOA_DATA] = R1;

     R1 = 0x2000;           

     [P_INT_CLEAR] = R1;

     POP R1,R5 FROM [sp];

     RETI;

L_FIQ_TMB:

     R1 = 0xfff0;

     [P_IOB_DATA] = R1;

     R2 = 0xffff;                   //延时

L_Delay2: 

     R2 -= 1;

     JNZ L_Delay2;

     R1 = 0xffff;                //熄灭LED

     [P_IOB_DATA] = R1;

     R1 = 0x0800;           

     [P_INT_CLEAR] = R1;

     POP R2,R5 FROM [sp];

      RETI;

实验现象:

运行程序,与A口相连接的发光二极管闪烁两次,此时与B口相连接的发光二极管闪烁一次;A口的灯闪烁较快,B口的灯闪烁较慢,而且可以判断出A口灯的闪烁的周期是1S,B口灯的闪烁周期是2S。

2、写出实验内容3的程序,并说明如何完成或设置内容3中各任务,预计实验结果。

选用IRQ6实现时基中断。

.INCLUDE hardware.inc;

.DEFINE           C_Tmb1clk_8Hz         0x0000

.DEFINE           C_Tmb1clk_16Hz        0x0001

.DEFINE           C_Tmb1clk_32Hz        0x0002

.DEFINE           C_Tmb1clk_64Hz        0x0003

.DEFINE           C_Tmb2clk_128Hz   0x0000

.DEFINE           C_Tmb2clk_256Hz   0x0004

.DEFINE           C_Tmb2clk_512Hz   0x0008

.DEFINE           C_Tmb2clk_1024Hz 0x000c

.DEFINE           C_Tmb1_clk              C_Tmb1clk_64Hz

.DEFINE           C_Tmb2_clk              C_Tmb2clk_128Hz

.RAM

.VAR G_Time1

.VAR G_Time2

.CODE

.PUBLIC _main

_main:

      INT OFF

      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 = C_Tmb1_clk

      R1 |= C_Tmb2_clk

      [P_Timebase_setup] = R1

      R1 = 0x0003                         //开中断IRQ6_C_Tmb1和IRQ6_C_Tmb2

      [P_INT_CTRL] = R1

      R1 = 0

      [G_Time1] = R1

      [G_Time2] = R1

      INT   IRQ;

L_Loop:

      NOP

      NOP

      NOP

      NOP

      JMP L_Loop

.TEXT

.PUBLIC _IRQ6

_IRQ6:     

      PUSH R1,R5 TO [sp]            //压栈保护    

    R1 = 0x0001       

TEST R1,[P_INT_CTRL]  //比较是否为IRQ6_C_Tmb2的中断源

    JNZ L_IRQ6_C_Tmb2         //是,则转至对应程序段

L_IRQ6_C_Tmb1:                      //否,则进入IRQ6_C_Tmb1程序段;

      R2 = [G_Time1]

      R2 += 0x0001

      [G_Time1] = R2  

    CMP R2,128                //比较是否为2秒;

    JBE L_LED1_OFF                  //小于等于则LED灭;

    R1 = 0xfff0               //大于则LED亮;                         

      [P_IOA_DATA] = R1

    CMP R2,256                      //比较是否为4秒;

    JBE L_LED1_RET            //小于等于则LED继续亮;   

    R2 = 0x000    //否则,G_Time1单元清零,返回中断;

[G_Time1] = R2

    JMP L_LED1_RET

L_LED1_OFF:

    R1 = 0xffff                

      [P_IOA_DATA] = R1

L_LED1_RET:

    R1 = 0x0002     

      [P_INT_CLEAR] = R1

    POP R1,R5 FROM [sp]

    RETI   

L_IRQ6_C_Tmb2:

      R2 = [G_Time2]

      R2+ = 0x0001

      [G_Time2] = R2  

    CMP R2,128                      //比较是否为1秒;

    JBE L_LED2_OFF                  //小于等于则LED灭;   

    R1 = 0xfff0               //大于则LED亮;                               

      [P_IOB_DATA] = R1

    CMP R2,256                      //比较是否为2秒;

    JBE L_LED2_RET            //小于等于则LED继续亮;   

    R2 = 0x0000   //否则,G_Time2单元清零,返回中断;

      [G_Time2] = R2

    JMP L_LED2_RET

L_LED2_OFF:

    R1 = 0xffff                

      [P_IOB_DATA] = R1

L_LED2_RET:

    R1 = 0x0001    

      [P_INT_CLEAR] = R1

    POP R1,R5 FROM [sp]

    RETI

实验现象:

利用时基中断实现上述功能,现象同上。A口灯的闪烁的周期是2S,B口灯的闪烁周期是4S。

[实验总结]

通过此次实验更加直观的理解了定时器中断和时基中断的内容和区别。

第五次实验:A/D转换,双通道D/A

实验十七:A/D转换

实验十八:双通道D/A

实验十九:一路输入的录音

[实验目的]

1)了解ADC输入接口的结构与转换原理;熟悉模拟量输入口LINE_IN1—LINE_IN7的使用;掌握P_ADC P_ADC_Ctrl单元的设置方法;

2)了解音频输出接口的结构与转换原理;掌握P_DAC2、P_DAC1、P_DAC_Ctrl单元的设置方法;

3)了解ADC输入接口的结构转换原理及实时录音并实时播放的功能;熟悉麦克风输入口MIC_IN的使用;进一步掌握P_ADC、P_ADC_Ctrl、P_DAC1、P_DAC2、P_DAC_Ctrl各单元的设置方法。

[实验设备]

1)装有WINDOWS系统和µ’nSP? IDE仿真环境的PC机一台;

2)µ’nSP?十六位单片机实验箱一个。

[实验硬件连接]

实验十七:

[实验内容]

学习实验十七、十八、十九,观察结果。

[实验准备]

1.在十八实验中是如何实现三角波?

R1=0x0040

LOOP1:                  LOOP2:

R1+=0x0040         R1-=0x0040

CMP R1,0xff80      CMP R1,0x0040

                JB  LOOP2          JB  LOOP1

[P_DAC1]=R1        [P_DAC1]=R1

               [P_IOB_DATA]=R1    [P_IOB_DATA]=R1

               JMP LOOP1          JMP LOOP2

实验现象:由于无法用示波器观察到波形,运行程序后,可以听到扬声器发出持续间断的声音。

2.如何实现录音并实时播放?

采用自动方式即定时器A溢出执行ADC转换,通过A/D将MIC_IN输入的语音信号转换为数字信号,再通过D/A 的两个通道AUD1和AUD2播放。

第二部分 语音实验

实验一: SACM-A2000

实验二: SACM-480

实验三 :SACM-240

实验四:SACM_MS01实验

[实验目的]

了解凌阳单片机以SACM_A20##、SACM-480、SACM-240、SACM_MS01等语音格式播放

程序的编写方法。

[实验设备]

1)装有WINDOWS系统和µ’nSP? IDE仿真环境的PC机一台;

2)µ’nSP?十六位单片机实验箱一个。

[实验硬件连接]

实验四:

[实验内容]

1)学习实验一、二、三、四;

2)建新项目,使用A480格式,编写三首曲子的循环播放。

程序如下

main ()

{

while(1)

{for(Speech_1=0;Speech_1<=2;Speech_1++)

{ SACM_S480_Initial(1);

SACM_S480_Play(Speech_1, DAC1+DAC2, Ramp_UpDn_On);    //放音

while(SACM_S480_Status()&0x01)

      {

      SACM_S480_ServiceLoop();

      }

}

}

}

  实验现象:运行程序后,听到扬声器一次播放三首曲子,并且播放完后自动进入循环继续播放。

[实验总结]

在本次实验中程序运行后遇到无法打开scamv25文件,打开project的下拉菜单setting中的link选项进行修改后,程序顺利运行。

第三部分 综合实验

实验一 :6位7段LED数码管显示实验

实验二 :4*4键盘输入在LED数码管上的显示

[实验目的]

1)熟悉并进一步掌握定时器中断的使用和时基信号的使用;进一步巩固I/O口的使用方法;

2)了解6位7段LED数码管的使用;

3)了解4*4键盘的使用方法。

[实验设备]

1)装有WINDOWS系统和µ’nSP? IDE仿真环境的PC机一台;

2)µ’nSP?十六位单片机实验箱一个。

[实验原理]

实验一:

通过对I/O口的控制,初始化时点亮所有的数码管,即6位LED数码管均显示8,1s后从第一位数码管开始从0显示到9,刷新时间为0.5s,直到最后一个数码管。1s的时间使用定时器A(FIQ),0.5s的时间使用2HZ的时基信号IRQ5 。改a\b\c\d\e\f\g\为七段数位,DD为点或分隔符号,DP为小数点。 电路采用共阴动态连接,阴极公共端com由晶体管推动。

8 段LED 显示数码管电路原理图

实验二:

通过对键盘的操作,在LED数码管上给予显示及相应操作。

4*4 键盘矩阵电路为动态键盘扫描,C1-C4 为列扫描,R1-R4 为行扫描。

[实验硬件连接]

实验一、二:

A0—A6 接 A---G

A8—A13 接 CS1—CS6

B0—B7 接 KEY

[实验内容]

1)学习综合实验一、二;

2)针对实验准备内容完成实验。注意新建项目,或重新复制后修改;

3)改相应程序使实验一中数码管递减显示。

将数码管递减显示时

uchar show_value;改为:char show_value;

for(show_value=0;show_value<Show_Value;show_value++)改为:

for(show_value=9;show_value>=0;show_value--)

若不改为无符形式,则在0>=0循环后会出现0xffff>=0,于是出现乱码形式。

4)键盘原来以  123  显示,改为按  147   来显示。

             456                258

789                369

需要改system.asm程序。其中

C_Address: .DW 0x003f,0x0086,0x00db,0x00cf,0x00e6,0x00ed,0x00fc,0x0087,0x00ff,0x00ef;//'0''1''2''3''4''5''6''7''8''9'的代码

将其改为

C_Address: .DW

0x003f,0x0086,0x00e6,0x0087,0x00db,0x00ed,0x00ff0x00cf,0x00fc,0x00ef;//'0''1''4''7''2''5''8''3''6''9'的代码

将代码位置变换即可。

[实验总结]

通过本次实验,充分了解了本实验的程序,学会如何控制数码管的显示。

相关推荐