欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    基于SPCE061A单片机的六位七段LED数码管显示设计.doc

    • 资源ID:847840       资源大小:2.20MB        全文页数:29页
    • 资源格式: DOC        下载积分:20积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要20积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于SPCE061A单片机的六位七段LED数码管显示设计.doc

    1、 摘 要随着计算机的越来越普及,人们对与信息的了解也越来越方便。而对于人机交流这块现在也是大家在重点研究的方面,像键盘等外部设备能提供给我们交流的平台。而除了PC机系统外想单片机、PLC等小型系统需要更适合的人机界面。多位LED设备就可以很好的完成这一任务,而且相比PC机等成本更加合理。本次课程设计是基于SPCE061A单片机的六位七段LED数码管显示设计,其是凌阳科技的一款16位微控制器,内嵌32KB闪存和2KB字SRAM。CPU最高可工作在49MHz的主频下,较高的处理速度使SPCE061A能够非常容易、快速地处理复杂的数字信号。其中的六段七位LED数码管可以很迅速的实现从“000000”

    2、到“999999”的显示变化。关键词:SPCE061A单片机,六段七位LED数码管目 录1. 实验箱简介22.设计总体思路42.1设计思路43.硬件部分63.1各部分元件介绍63.1.1 SPCE061A63.1.2 6位7段数码管工作原理73.2硬件设计方案83.3基本原理104.软件部分104.1中断服务程序流程图104.2设计步骤124.3主程序135. 调试结果及分析246.总结与心得277.参考文献28 1. 实验箱简介1.1整体介绍 凌阳十六位单片机(SPCE061A)实验箱是集单片机应用技术、在线调试、在线仿真等功能于一体的强大开发系统,SPCE061A及其系列产品将带领MCU的

    3、应用迈入片上系统(SOC)时代,使在体验凌阳音频的欢快愉悦中轻松步入单片机及其嵌入式系统的流行领域。图1-1 实验箱实物图 1.2功能特点凌阳科技大学计划实验箱的主要硬件配置: (1)主控芯片SPCE061A,凌阳16位单片机。 (2)44矩阵键盘和6位8段数码管,采用动态扫描方式驱动44矩阵键盘。 (3)18高低电平发生按键和8个发光二极管。 (4)I/O可选5V3.3V输出电路以及可选外部电压输入电路。 (5)两路0-3V可调A/D输入电压,为A/D数据采集等提供便利。(6)双色88 LED点阵,可以完成图形、字模显示。 (7)RS232接口可实现直接与PC机进行通讯。 (8)利用串行设备

    4、输入输出接口(SIO接口)扩展外部存储芯片SPR4096A,为实验箱系统增加4M Bits Flash 或32K Bits SRAM的存储空间。 (9)USB1.1 接口,提供完整的单片机固体程序、上位机驱动程序源代码及其完整的软件包和应用范例,可直接进行USB通讯。 (10)带背光的12864点阵液晶模组,内藏凌阳的一款LCD驱动芯片SPLC501,采用最新的COG(Chip on Glass)技术使驱动和液晶合二为一。 (11)两路音频输出电路,采用凌阳音频功放芯片SPY0030A,可以充分体验SPCE061A带来的听觉效果。 (12)MIC 输入电路,配合SPCE061A内部的AGC和O

    5、PI电路,可获得理想的语音效果。 (13)SPCE061A内置ICE电路,配合凌阳在线调试器PROBE和软件开发环境IDE可方便的实现在线编程、仿真、下载、调试等功能。2.设计总体思路2.1设计思路 本次设计要求完成基于单片机六位七段LED数码管的显示系统的设计。运行开始点亮所有的数码管,6位LED数码管均显示0并持续1s。1s后,第一位数码管从0显示到9,刷新时间为0.5s,其他数码管全部显示0。当第一位数码管显示到9后,第一位数码管保持显示9,第二位数码管从0显示到9,刷新时间为0.5s,其他数码管显示0。依次直到第6位数码管显示9,即6位数码管全部显示9,6位数码管全部显示0,持续1s,

    6、如此循环。(1s的时间、0.5s的时间都使用2Hz的时基信号(IRQ5)提供)。6位数码管的显示状态见。 2.2 主程序流程图主程序流程图如图2-1。先进行系统初始化;开2Hz中断;进入数码管循环显示程序:判断位信号寄存器是否为0(位信号寄存器由读者自己定义,这个寄存器的内容在中断里会改变),如果为0,6位数码管显示“000000”;如果不为零,按照位信号和段码显示数据进行显示。图 2-1 系统流程图3.硬件部分3.1各部分元件介绍3.1.1 SPCE061ASPCE061A提供了位控制结构的I/O端口,每一位都可以被单独定义用于输入或输出数据。通常,对某一位的设定包括以下3个基本项:数据向量

    7、Data、属性向量Attribution和方向控制向量Direction。3个端口内每个对应的位组合在一起,形成一个控制字,用来定义相应I/O口位的输入输出状态和方式。SPCE061A有32个可编程I/O端口,分为两组:IOA015口和IOB015口,其中每一个端口都可以被单独设置为输入或者输出口。图 3-1 SPCE061A结构图3.1.2 6位7段数码管工作原理首先介绍两个基本概念:段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图4-2中ag、dp 组成的数据(a 为最低位,dp 为最高位)就是段码。比如1的段码“0x06”(b=1,c=1,其他都为0,即段码为00000110

    8、b),8 的段码为“0x7f”;位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作,比如仅使能DIG4,那么4 个LED 只有LED4 工作,而其它的三个都不工作。当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。比如当在第一个数码管上显示一个“6”时,如图3-4,先选中第一位数码管的位信号(实验仪上标号是“DIG1”),即先给和“DIG1”相连接的I/O 口送1;再把段码设置为0x007d,即在a、c、d、e、f、g 各段引出的端口为高电平,就可以显示一个“6”出来。图3-2 数图码管示意图 3-3 数码管电路图图 3-4 数码管显示“6”3.2硬件

    9、设计方案硬件连接图如图3-3,IOA0IOA7分别接数码管的7个段信号ag和小数点信号dp,IOB15IOB12连接数码管的位信号14,IOB2IOB1连接数码管的位信号56,IOB0连接数码管的分隔符号信号DD,即把JP4和JP5的引针用跳线全部短接。实验箱在6位8段数码管的上面有16对排针,其中有7个“abcdefg”是控制此6位8段数码管的段码选择的,另有6个“123456”是控制6位8段数码管位选择的,“DD”控制“点”或“分隔符号”,“DP”控制小数点。把实验箱上JP4和JP5的引针用跳线全部短接。框图如图3-4。图 3-3 试验箱上SPCE061A和6位LED显示电路模块的连接图

    10、3-4实物连接图3.3基本原理本实验用到的实验箱硬件模块为:SPCE061A核心及周边电路模块(包含32个I/O口),6位8段数码管电路模块。图 3-5 硬件原理图4.软件部分4.1中断服务程序流程图 由于显示数据的刷新时间为1s和0.5s,因此考虑采用2Hz(0.5s)时基中断。并且在中断内部完成段码数据更新。具体的流程如图 4-6示:在中断服务程序中会用到三个重要的寄存器:中断计数寄存器、显示数据寄存器、位信号寄存器。其中中断计数寄存器用于记录第几次进入中断(前3次有效),显示数据寄存器的内容为当前被刷新显示数据的数值(09),位信号寄存器用于标识被刷新数据所在位。结合主程序分析中断程序:

    11、首先显示“000000”时需要延时1s,使用2Hz中断产生1s延时,需要连续响应两次中断,第二次响应中断延时满1s,设置显示数据寄存器和位信号寄存器,让第一位数码管显示1,其余各位仍为“0”,即显示“100000”;判断显示数据寄存器显示数据是否大于9,如果小于,显示数据寄存器数据加1;如果大于,判断位信号寄存器是否已经指向第六位数码管,否则位信号寄存器设置为指向下一位数码管,显示数据寄存器显示数据设置为0;如果已经指向第六位数码且显示数据寄存器为9,寄存器清零,清中断标志,中断返回。 图 4-1 中断服务程序流程图4.2设计步骤1. 新建一个工程ex1_Led_Show,新建一个C语言文件m

    12、ain.c,新建一个汇编语言文件isr.asm。(根据读者需要可以自己新建文件) 2. 拷贝头文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,这两个文件在IDE的安装路径SPCE061Ainclude路径下可以找到。3. 添加SPCE061A.h、SPCE061A.inc到工程的“Head Files”;添加后可以直接用这两个头文件中申明的变量或者地址单元。4. 按照程序流程图编写程序。5. Rebuild All。6. 按照硬件连接图连接电路,注意断开JP3和JP7的所有引针,以免影响输出显示数据。 7. 下载程序到实验箱,根据数码管显示的现象,判断是否

    13、和实验要求相统一。 8. 观察LED显示数据和实验箱播报的数据,分析是不是和实验要求相统一。4.3主程序#include SPCE061A.h#include Dig.h#define C_IRQ5_2Hz0x004unsigned int g_uiFirst = 0x0000;/用于控制1s延时unsigned int g_uiFlag;/用于控制数码管unsignedintg_Data11=0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f; /0,1, 2, 3, 4, 5, 6, 7,

    14、8,9unsigned int g_uiSeg;/段码指针int main(void) unsigned int Dis16 = 0x003f,0x003f,0x003f,0x003f,0x003f,0x003f;unsigned int uiIntStatus;uiIntStatus = *P_INT_Ctrl_New; /开2Hz中断uiIntStatus |= C_IRQ5_2Hz;*P_INT_Ctrl = uiIntStatus;g_uiFlag = 0x0000;/该变量在2Hz中断当中会被修改g_uiSeg = 0;/该变量在2Hz中断当中会被修改,以便及时刷新显示 DIG_In

    15、it(); /显示初始化,同时会打开IRQ4的4KHz中断while(1)if(g_uiFlag = 0x0000) DIG_SetAll(Dis1); /设置数码管全部显示0if(g_uiFlag != 0x0000)DIG_Set(g_uiFlag,g_Datag_uiSeg);/刷新6位数码管显示值*P_Watchdog_Clear = 0x0001;.INCLUDE SPCE061A.inc.INCLUDE Dig.inc.EXTERNAL _g_uiFirst.EXTERNAL _g_uiFlag.EXTERNAL _g_uiSeg.TEXT.PUBLIC _IRQ4_IRQ4:pu

    16、sh r1,r5 to spr1 = C_IRQ4_1KHztest r1,P_INT_Ctrljnz ?L_IRQ4_1KHzr1 = C_IRQ4_2KHztest r1,P_INT_Ctrljnz ?L_IRQ4_2KHz?L_IRQ4_4KHz:call F_DIG_Drive /F_DIG_Drive函数是数码管显示函数,定义在Dig.asm文件r1 = C_IRQ4_4KHzP_INT_Clear = r1pop r1,r5 from spreti?L_IRQ4_2KHz:P_INT_Clear = r1pop r1,r5 from spreti?L_IRQ4_1KHz:call

    17、F_DIG_DriveP_INT_Clear = r1pop r1,r5 from spreti.PUBLIC _IRQ5_IRQ5:push r1,r5 to spr1 = C_IRQ5_2Hztest r1,P_INT_Ctrljnz ?L_IRQ5_2Hz?L_IRQ5_4Hz:r1 = C_IRQ5_4HzP_INT_Clear = r1pop r1,r5 from spreti?L_IRQ5_2Hz:r1 = _g_uiFirstcmp r1,0x0001/第2次进入中断ja ?Start/时间=1sr1 = _g_uiFirst/时间小于1sr1 += 1_g_uiFirst =

    18、r1goto ?Exit?Start:r1 = _g_uiFirstcmp r1,2/1sjne ?Nextr1 += 1/初始化g_uiFlag、g_uiSeg显示1000000_g_uiFirst = r1r1 = 1_g_uiFlag = r1r1 = 2_g_uiSeg = r1goto ?Exit?Next:r1 = _g_uiSegcmp r1,9 /更改段码指针,显示数值加1ja ?Next1r1 += 1_g_uiSeg = r1goto ?Exit?Next1:r1 = _g_uiFlag/更改被刷新数码管位cmp r1,6je ?Lastr1 += 1_g_uiFlag =

    19、 r1r1 = 2_g_uiSeg = r1goto ?Exit?Last:r1 = 0x0000/置标志,重新显示“000000”_g_uiFirst = r1_g_uiFlag =r1goto ?Exit?Exit:r1 = C_IRQ5_2HzP_INT_Clear = r1pop r1,r5 from spreti.DEFINE SEG_IO_Port0/ 若LED段选使用IOA口则采用该行定义.DEFINE SEG_IO_Port 1 / 若LED段选使用IOB口则采用该行定义.DEFINE SEG_IO_HighByte0/ 若LED段选使用IO口低8位则采用该行定义.DEFINE

    20、 SEG_IO_HighByte 1 / 若LED段选使用IO口高8位则采用该行定LED位控制端口设定.DEFINE DIG_IO_Port 0/ 若LED位选使用IOA口则采用该行定义.DEFINE DIG_IO_Port1/ 若LED位选使用IOB口则采用该行定义数码管的位数 .DEFINE DIG_Count6 数码管每一位的控制脚设定 .DATAPIN_DIG:.DW 0x8000,0x4000,0x2000,0x1000,0x0004,0x0002,0x0001;数码管所有位的控制脚设定,应等于PIN_DIG所有数之和.DEFINE PIN_DIG_ALL0xf007.IFSEG_I

    21、O_Port=0.DEFINE P_SEG_Data0x7000.DEFINE P_SEG_Buf0x7001.DEFINE P_SEG_Dir0x7002.DEFINE P_SEG_Attrib0x7003.ELSE.DEFINE P_SEG_Data0x7005.DEFINE P_SEG_Buf0x7006.DEFINE P_SEG_Dir0x7007.DEFINE P_SEG_Attrib0x7008.ENDIF.IF SEG_IO_HighByte=0.DEFINE PIN_SEG_ALL0x00ff.ELSE.DEFINE PIN_SEG_ALL0xff00.ENDIF.IFDIG_

    22、IO_Port=0.DEFINE P_DIG_Data0x7000.DEFINE P_DIG_Buf0x7001.DEFINE P_DIG_Dir0x7002.DEFINE P_DIG_Attrib0x7003.ELSE.DEFINE P_DIG_Data0x7005.DEFINE P_DIG_Buf0x7006.DEFINE P_DIG_Dir0x7007.DEFINE P_DIG_Attrib0x7008.ENDIF中断常量定义.DEFINE P_INT_Mask0x702d.DEFINE C_IRQ4_4KHz0x0040变量定义.RAMR_DIG_Buf:.DW DIG_Count D

    23、UP (?)/ 数码管显示缓冲区.IRAMR_CurDIG:.DW 0xffff/ 当前显示的数码管位,0xffff表示不显示公有函数声明.PUBLIC F_DIG_Init.PUBLIC _DIG_Init.PUBLIC F_DIG_Set.PUBLIC _DIG_Set.PUBLIC F_DIG_SetAll.PUBLIC _DIG_SetAll.PUBLIC F_DIG_Get.PUBLIC _DIG_Get.PUBLIC F_DIG_GetAll.PUBLIC _DIG_GetAll.PUBLIC F_DIG_Drive.PUBLIC _DIG_Drive.PUBLIC F_DIG_O

    24、ff.PUBLIC _DIG_Off.PUBLIC F_DIG_On.PUBLIC _DIG_On.code数码管显示初始化,该函数将开启IRQ4_4KHz中断_DIG_Init:F_DIG_Init:push r1,bp to spINT Off r1 = DIG_Countr2 = 0x0000bp = R_DIG_Buf?DIG_InitBuf:/ 清除显示缓冲区bp+ = r2r1 -= 1jnz ?DIG_InitBufR_CurDIG = r2/ 当前显示的位设置为0r1 = P_SEG_Attrib/ 初始化段选IOr1 |= PIN_SEG_ALLP_SEG_Attrib =

    25、r1r1 = P_SEG_Bufr1 &= PIN_SEG_ALLP_SEG_Data = r1r1 = P_SEG_Dirr1 |= PIN_SEG_ALLP_SEG_Dir = r1r1 = P_DIG_Attrib/ 初始化位选IOr1 |= PIN_DIG_ALLP_DIG_Attrib = r1r1 = P_DIG_Bufr1 &= PIN_DIG_ALLP_DIG_Buf = r1r1 = P_DIG_Dirr1 |= PIN_DIG_ALLP_DIG_Dir = r1r1 = P_INT_Mask/ 开启IRQ4_4KHz中断r1 |= C_IRQ4_4KHzP_INT_Mask

    26、 = r1INT FIQ,IRQ pop r1,bp from spretf 设置数码管某一位的显示内容_DIG_Set:push r1,r2 to spr1 = sp + 5r1 = r1r2 = sp+6r2 = r2call F_DIG_Setpop r1,r2 from spretfF_DIG_Set:push bp to sp.IF SEG_IO_HighByte=1r2 = r2 lsl 4r2 = r2 lsl 4.ENDIFr1 -= 1cmp r1,DIG_Count/ 如果位值超出范围则退出ja ?Exitbp = R_DIG_Buf/ 将R_DIG_Buf的相应元素修改为

    27、设定值bp += r1bp = r2?Exit:pop bp from spretf设置所有数码管的显示内容_DIG_SetAll:push bp to spbp = spr1 = bp+4call F_DIG_SetAllpop bp from spretfF_DIG_SetAll:push r2,bp to spbp = r1r2 = DIG_Countr3 = R_DIG_Buf?DIG_Set_Loop:r1 = bp+/ 将R_DIG_Buf修改为设定值.IF SEG_IO_HighByte=1r1 = r1 lsl 4r1 = r1 lsl 4.ENDIFr3+ = r1r2 -=

    28、 1jnz ?DIG_Set_Looppop r2,bp from spretf获取所有数码管的显示内容_DIG_Get:push bp to spbp = spr1 = bp+4call F_DIG_Getpop bp from spretfF_DIG_Get:push r2 to spr2 = R_DIG_Bufr2 += r1r1 = r2pop r2 from spretf获取所有数码管的显示内容_DIG_GetAll:push bp to spbp = spr1 = bp+4call F_DIG_GetAllpop bp from spretfF_DIG_GetAll:push r2

    29、,bp to spbp = r1r2 = DIG_Countr3 = R_DIG_Buf?DIG_Get_Loop:r4 = r3+bp+ = r4r2 -= 1jnz ?DIG_Get_Looppop r2,bp from spretf数码管显示函数,由IRQ4_4KHz中断服务程序调用_DIG_Drive:F_DIG_Drive:push r1,r4 to spr1 = R_CurDIG/ 如果不显示则直接退出cmp r1,0xffffje?DIG_Exitr2 = r1 + R_DIG_Bufr2 = r2r2 &= PIN_SEG_ALL r3 = P_DIG_Buf/ 清除当前位显示

    30、r3 &= PIN_DIG_ALLP_DIG_Data = r3r4 = P_SEG_Buf/ 段数据设置r4 &= PIN_SEG_ALLr4 |= r2P_SEG_Data = r4r3 = P_DIG_Buf/ 位数据设置r4 = r1 + PIN_DIGr3 |= r4P_DIG_Data = r3r1 += 1cmp r1,DIG_Countjb ?DIG_Next/ R_CurDIG指向下一位?DIG_Reverse:r1 = 0/ 若已显示到最后一位则R_CurDIG指向第一位?DIG_Next:R_CurDIG = r1?DIG_Exit:pop r1,r4 from spre

    31、tf停止数码管显示_DIG_Off:F_DIG_Off:push r1 to spr1 = P_DIG_Bufr1 &= PIN_DIG_ALLP_DIG_Buf = r1r1 = 0xffffR_CurDIG = r1pop r1 from spRetf恢复数码管显示_DIG_On:F_DIG_On:push r1 to spr1 = 0R_CurDIG = r1pop r1 from spRetf5.调试结果及分析要实现一个六位七段的LED数码管显示过程,首先必须调节好硬件的测试,确保其通畅,其次要调节好软件程序,调试无误后下载装机并运行程序,图5-1显示的事程序装机界面,用的是IDE软件

    32、进行的调试;图5-2是开始运行时的初始状态-即六位LED数码管均显示零的状态“000000”;图5-4显示的是LED状态一个循环的最后记数“999999”。实验过程全程无误,最后达到实验要求的目的。图 5-1 图 5-2 图 5-3图 5-46.总结与心得 两周的课程设计已经结束了,我们也如期完成了自己的课设题目,尽管过程有些许短暂与困难,我们或许做的不是很好,但是这其中的体验让我们受益匪浅,收获颇多。在这次课程设计的过程中我了解并掌握了SPCE061A的使用方法,同时熟悉了凌阳单片机试验箱中六位七段LED数码管模块的使用方法.通过对资料的查阅和应用,更进一步增加了对单片机知识的理解和运用能力。本文列出了系统具体的硬件原理图,硬件连接方案,软件流程图和具体汇编语言程序设计与调试等方面。在这次课程设计的过程中学会了凌阳十六位单片机的基本使用,感受到了熟练掌握它对于自动化专业的同学的重要性。总体来说这次的科研实践很成功,达到了预想的目的,学到了知识,提高了能力,完成了任务。 最后,要感谢宋丽君和陈静老师的悉心指导,改正了我实验中很多没有发现的问题,衷心的感谢你们!第 28 页 共 28页


    注意事项

    本文(基于SPCE061A单片机的六位七段LED数码管显示设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922