6位7段LED数码管显示Word文档格式.docx
《6位7段LED数码管显示Word文档格式.docx》由会员分享,可在线阅读,更多相关《6位7段LED数码管显示Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
①表中序号为0和61的状态持续1s;
其他状态刷新时间为0.5s。
②表中需要类似“1~10”表示有十个状态。
2.设计的方案与基本原理
2.16位8段数码管工作原理
实验箱的6位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。
实验箱上的数码管共有两种,如图1。
图1两种数码管图
首先介绍两个基本概念:
段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图4-1中a~g、dp组成的数据(a为最低位,dp为最高位)就是段码。
比如1的段码“0x06”(b=1,c=1,其他都为0,即段码为00000110b),8的段码为“0x7f”;
位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作,比如仅使能DIG4,那么6个LED只有LED4工作,而其它的五个都不工作。
当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。
比如当在第一个数码管上显示一个“6”时,如图2,先选中第一位数码管的位信号(实验箱上标号是“1”),即先给和“1”相连接的I/O口送1;
再把段码设置为0x007d,即在a、c、d、e、f、g各段引出的端口检测到高电平,就可以显示一个“6”出来。
图2数码管显示“6”
2.2实验箱上SPCE061A控制6位8段数码管的显示
实验箱在6位8段数码管的上面有16对排针,其中有7个“a\b\c\d\e\f\g\”是控制此6位8段数码管的段码选择的,另有6个“1\2\3\4\5\6”是控制6位8段数码管位选择的,“DD”控制“点”或“分隔符号”,“DP”控制小数点。
把实验箱上JP4和JP5的引针用跳线全部短接。
框图如图3。
图3实验箱上SPCE061A和6位LED显示电路模块的连接
按照上面数码管的显示原理,当要在第四个数码管上显示一个“E”时,先要通过IOB12端口给“4”端口送一个1,选中第四个数码管;
由图4-1可以看出,显示“E”时,需要a、d、e、f、g段被点亮,所以给IOA0、IOA3、IOA4、IOA5、IOA6端口各送一个1,则在a、d、e、f、g端口各能检测到一个高电平,就可以点亮a、d、e、f、g段,显示一个“E”。
2.3动态显示原理
动态显示是数码管显示比较常用的方式,可以很好的解决端口资源紧张问题。
下面以四位数码管为例说明动态显示的原理,如图4所示
图44位*7段数码管动态显示原理图
动态显示的过程:
以显示“1234”为例说明,首先发送“1”的段码“0x06”至数码管,然后仅使能位信号DIG4,LED4就会显示“1”,其余的数码管都是不工作的;
延时一定时间之后再发送“2”的段码“0x5b”至数码管,同时仅使能位信号DIG3,这时“2”就会在LED3上显示出来;
延时之后再发送“3”的段码并使能位信号DIG2,LED2就会显示“3”;
延时一定时间之后再发送“4”的段码并使能位信号DIG1,LED1就会显示“4”;
延时之后再回过头来重新发送“1”的代码,并选中位信号DIG4,重复循环点亮数码管。
由于相邻两次(第一次点亮LED4和第二次点亮LED4)的时间间隔很短(t<
10ms),看起来仿佛LED4一直在显示“1”,4各数码管整体看起来就在显示“1234”。
动态显示的延时很重要,延时太短,数码管发光时间过短,数码管的亮度不够;
延时太长,回扫间隔过大(超过11ms),肉眼就会感觉到闪烁。
该例程采用4KHz中断作为时间基准执行动态扫描,每来一次中断,显示自动移位,回扫时间t=0.25ms*6=1.5ms。
通过对I/O口的控制,定时1s的时间和0.5s的时间都使用2Hz的时基信号(IRQ5)。
按照基础实验中IRQ5中断的工作原理,响应一次IRQ5_2Hz中断需要0.5s的时间,而响应两次中断的时间刚好是1s。
按照实验要求,当开IRQ5_2Hz中断时,6位数码管全部显示“0”后,响应两次IRQ5_2Hz中断,再从第一个数码管开始显示;
而刷新时间刚好是响应一次IRQ5_2Hz中断的时间。
2.4unSPIDE2.0.0简介
1.为什么推出unSPIDE2.0.0D(R)
为了提高μ’nSPIDE工具的兼容性,让μ’nSPIDE工具能支持更多的芯片,并且由于实验箱实验指导书的全面改版,IDE下的例程全面修改、更新,凌阳科技推出了μ’nSPIDE工具的最新版本——unSPIDE2.0.0(以下简称:
IDE2.0.0)。
IDE2.0.0作为μ’nSPIDE工具截止现在(2005-11-11)最新的一个版本,它不但继承以前版本IDE的特点,同时增加了一些新的功能,集纳了众多用户在使用μ’nSPIDE过程中提出的一些意见,并包含了一些新的例程。
除增加了一些新的功能外,IDE2.0.0在编译优化、代码查错定位等方面都有了一定的进步,用户在使用本版IDE时,应该可以体会到,其对代码的严谨性有了更高的要求。
而在新版IDE的各个方面,都有所加强,用户在使用过程当用会有所体会。
新添加功能、加强原有功能等,都没有改变unSPIDE一惯的使用方法,所以用户可以参考unSPIDE184(R)的用户手册,以学习μ’nSPIDE的基本操作及相关知识,这在IDE2.0.0的使用当中是保持不变的。
2.从IDE184到IDE2.0.0D的变化
IDE1.8.4是用户用的最多的一版μ’nSPIDE工具,实际上在推出IDE1.8.4之后,μ’nSPIDE也在不断的升级,其间也出现了非常多的版本,比如已发布的就有IDE1.16.1和IDE1.18.1;
但相比之下,IDE2.0.0的版本有更多细节的完善,更多新功能的添加,为用户的代码编辑、工程调试等提供了更人性化的辅助功能和更便利的工具。
从较大的区别来看,IDE2.0.0工具由IDE1.8.4支持两颗芯片变为支持四颗芯片,增加了许多新的功能,并对一些旧的功能进行了改善,同时对IDE1.8.4下包含的例程进行了修改、更新和规范化,走过了很长的路程,是对前面μ’nSPIDE工具版本的升级。
而IDE在安装后的文件结构发生了一些变化,为后期加入更多的新芯片提供了统一的平台,也更符合IDE版本维护的要求。
从细节上看,IDE2.0.0在代码编译、优化以及错误、警告定位方面都作了改进,在调试时的增加变量提示、在Memery观察窗中数据变化以红色提示等等;
为用户的软件编辑、调试提供了更加友好的界面。
在网上提供的《IDEUserguide》(unSPIDE184用户手册)中详细地介绍了μ’nSPIDE工具的使用方法.
2.5系统硬件连接
硬件连接图如图3,IOA0~IOA7分别接数码管的7个段信号a~g和小数点信号dp,IOB15~IOB12连接数码管的位信号1~4,IOB2~IOB1连接数码管的位信号5~6,IOB0连接数码管的分隔符号信号DD,即把JP4和JP5的引针用跳线全部短接。
硬件电路连接图
3.程序设计
本程序由主程序和中断服务程序组成。
3.1主程序
主程序流程图如图5。
先进行系统初始化;
开2Hz中断;
进入数码管循环显示程序:
判断位信号寄存器是否为0(位信号寄存器由读者自己定义,这个寄存器的内容在中断里会改变),如果为0,6位数码管显示“000000”;
如果不为零,按照位信号和段码显示数据进行显示。
图4-5主程序流程图
主程序:
#include"
SPCE061A.h"
Dig.h"
#defineC_IRQ5_2Hz0x0004
unsignedintg_uiFirst=0x0000;
//用于控制1s延时
unsignedintg_uiFlag;
//用于控制数码管
unsignedintg_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};
//0,1,2,3,4,5,6,7,8,9
unsignedintg_uiSeg;
//段码指针
3.2中断服务程序
由于显示数据的刷新时间为1s和0.5s,因此考虑采用2Hz(0.5s)时基中断。
并且在中断内部完成段码数据更新。
具体的流程如图6示:
在中断服务程序中会用到三个重要的寄存器:
中断计数寄存器、显示数据寄存器、位信号寄存器。
其中中断计数寄存器用于记录第几次进入中断(前3次有效),显示数据寄存器的内容为当前被刷新显示数据的数值(0~9),位信号寄存器用于标识被刷新数据所在位。
结合主程序分析中断程序:
首先显示“000000”时需要延时1s,使用2Hz中断产生1s延时,需要连续响应两次中断,第二次响应中断延时满1s,设置显示数据寄存器和位信号寄存器,让第一位数码管显示1,其余各位仍为“0”,即显示“100000”;
判断显示数据寄存器显示数据是否大于9,如果小于,显示数据寄存器数据加1;
如果大于,判断位信号寄存器是否已经指向第六位数码管,否则位信号寄存器设置为指向下一位数码管,显示数据寄存器显示数据设置为0;
如果已经指向第六位数码且显示数据寄存器为9,寄存器清零,清中断标志,中断返回。
中断服务程序流程图:
图6中断服务程序流程图
中断服务程序:
intmain(void)
{
unsignedintDis1[6]={0x003f,0x003f,0x003f,0x003f};
unsignedintuiIntStatus;
uiIntStatus=*P_INT_Ctrl_New;
//开2Hz中断
uiIntStatus|=C_IRQ5_2Hz;
*P_INT_Ctrl=uiIntStatus;
g_uiFlag=0x0000;
//该变量在2Hz中断当中会被修改
g_uiSeg=0;
//该变量在2Hz中断当中会被修改,以便及时刷新显示
DIG_Init();
//显示初始化,同时会打开IRQ4的4KHz中断
while
(1)
{
if(g_uiFlag==0x0000)
{
DIG_SetAll(Dis1);
//设置数码管全部显示0
}
if(g_uiFlag!
=0x0000)
DIG_Set(g_uiFlag,g_Data[g_uiSeg]);
//刷新6位数码管显示值
*P_Watchdog_Clear=0x0001;
}
}
4.调试
4.1实验步骤
1.新建一个工程ex1_Led_Show,新建一个C语言文件main.c,新建一个汇编语言文件isr.asm。
(根据读者需要可以自己新建文件)
2.拷贝头文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,这两个文件在IDE的安装路径\SPCE061A\include路径下可以找到。
3.添加SPCE061A.h、SPCE061A.inc到工程的“HeadFiles”;
添加后可以直接用这两个头文件中申明的变量或者地址单元。
4.按照程序流程图编写程序。
5.RebuildAll。
6.按照硬件连接图连接电路,注意断开JP3和JP7的所有引针,以免影响输出显示数据。
4.2调试结果
调试结果如下图:
运行开始时
图7运行开始时
运行到第1位9、第2位1时
图8运行到第1位9、第2位1时
运行到前两位都为9时
图9运行到前两位都为9时
运行到6位都为9时
图10运行到6位都为9时
5.总结
在这为期两周的课程设计中,通过对6位7段LED数码管显示的设计与分析,我清楚地认识到了自己以前仅仅学到的书本上的知识的欠缺与经验的不足,所谓实践出真知,智能仪器本就是一种实践操作环节十分重要的课程,而这次的课设正好弥补了我操作方面的不足,进而更加巩固了这方面的知识。
课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
尤其是硬件方面的知识,我们更为的稀少,以前的课程中学到的基本都是软件方面LabVIEW的使用等等,而硬件却是很少接触到,因此对于硬件我们是知之甚少。
然而我们通过不断地查阅6位7段LED数码管和IDE的相关资料,对其有了进一步的认识,还有硬件设备与软件的连接,我们也都出现过问题,但最总都能认真的一一排除予以解决。
最终,我们达到了任务书上的要求,完成了本次的智能仪器课程设计。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
最后感谢本次课程设计中老师与同学们的帮助与指导,使我获益匪浅!
6.参考资料
【1】朱麟章蒙建波主编.检测理论及应用.重庆大学出版社2007.8
(2)
【2】张国雄编著.测控电路天津大学出版社2005.1
【3】费业泰编著.误差理论与数据处理.合肥工业出版社2005.1
【4】王志刚编著.单片机应用技术及实训.北京:
清华大学出版社2004.5
附录设计程序汇总
Main.c
unsignedintg_uiFirst=0x0000;
//0,1,2,3,4,5,6,7,8,9
unsignedintg_uiSeg;
//========================================================
//语法格式:
intmain(void)
//实现功能:
数码管显示
//参数:
无
//返回值:
无
Isr.asm
.INCLUDESPCE061A.inc
.INCLUDEDig.inc
.EXTERNAL_g_uiFirst
.EXTERNAL_g_uiFlag
.EXTERNAL_g_uiSeg
.TEXT
//汇编格式:
_IRQ4
1KHz中断调用F_DIG_Drive函数
.PUBLIC_IRQ4
_IRQ4:
pushr1,r5to[sp]
r1=C_IRQ4_1KHz
testr1,[P_INT_Ctrl]
jnz?
L_IRQ4_1KHz
r1=C_IRQ4_2KHz
L_IRQ4_2KHz
?
L_IRQ4_4KHz:
callF_DIG_Drive//F_DIG_Drive函数是数码管显示函数,定义在Dig.asm文件中
r1=C_IRQ4_4KHz
[P_INT_Clear]=r1
popr1,r5from[sp]
reti
L_IRQ4_2KHz:
L_IRQ4_1KHz:
callF_DIG_Drive
_IRQ5
2Hz中断进行显示处理
.PUBLIC_IRQ5
_IRQ5:
r1=C_IRQ5_2Hz
L_IRQ5_2Hz
L_IRQ5_4Hz:
r1=C_IRQ5_4Hz
L_IRQ5_2Hz:
r1=[_g_uiFirst]
cmpr1,0x0001//第2次进入中断
ja?
Start//时间〉=1s
r1=[_g_uiFirst]//时间小于1s
r1+=1
[_g_uiFirst]=r1
goto?
Exit
Start:
r1=[_g_uiFirst]
cmpr1,2//1s
jne?
Next
r1+=1//初始化g_uiFlag、g_uiSeg显示"
1000"
r1=1
[_g_uiFlag]=r1
r1=2
[_g_uiSeg]=r1
Next:
r1=[_g_uiSeg]
cmpr1,9//更改段码指针,显示数值加1
Next1
Next1:
r1=[_g_uiFlag]//更改被刷新数码管位
cmpr1,4
je?
Last
r1+=1
Last:
r1=0x0000//置标志,重新显示“000000”
[_g_uiFlag]=r1
Exit:
Reti
Dig.asm
.DEFINESEG_IO_Port0//若LED段选使用IOA口则采用该行定义
//.DEFINESEG_IO_Port1//若LED段选使用IOB口则采用该行定义
.DEFINESEG_IO_HighByte0//若LED段选使用IO口低8位则采用该行定义
//.DEFINESEG_IO_HighByte1//若LED段选使用IO口高8位则采用该行定义
//==