4426|0

6366

帖子

4912

TA的资源

版主

楼主
 

基于Proteus的MSP430单片机仿真实例9-四位数码管静态显示 [复制链接]




此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处



一、任务要求
用静态显示方式,利用单片机控制4位独立数码管中每一位独立显示,从0开始,每次加1,一直增加到9999后归零重新开始。
二、分析说明
4位数码管如果用静态显示方式,需要的I/O端口为32个,导致占用大量的端口,且由于数码管的功耗较高,单片机同时驱动32个I/O端口会超过其极限输出电流,因此利用锁存器,将单片机的数据轮流输出送给4个锁存器,数据被保持在锁存器中实现静态显示。本例选择74HC573作为锁存器。
74HC573的D0~D7为输入端口,Q0~Q7为输出端口,OE为输出使能引脚,LE为锁存引脚。
其功能如下:当OE使能引脚为高电平时,不管LE和D0~D7的信号如何变化,Q0~Q7一直处于高阻状态,即相当于与之连接的电路断开,只有在OE为低电平时,输出才有效;LE锁存引脚为高电平,Q0~Q7跟随输入的变化,当LE引脚出现从高到底的跳变时,输出Q0~Q7与输入D0~D7相同,当D0~D7变化时,输出保持不变,这样为驱动4个数码管,可以使用4片74HC573,将它们的输入端都接到单片机的P4端口,而锁存端LE分别接到单片机的P5端口,输出端Q0~Q7接数码管的输入端,利用锁存器的下降沿把需要显示的数据锁存,当单片机将4片74HC573的数据锁存完成,就可以实现4个数码管的静态显示。
三、硬件电路
硬件电路如下图所示。
四、程序设计
#include "msp430f247.h"
#include "stdlib.h"
#include "string.h"
/*****************************************软件延时,主频1M*******************/
#define CPU_F1 ((double)1000000)
#define delay_us1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000000.0))
#define delay_ms1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000.0))
/****************************************************************************/
//共阳极数码管段码表
unsigned char const Led_Tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阴极数码管段码表
unsigned char const Led_Tab2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char key=0;//按键值
void System_Init(void);
/************************************************
函数名称:主函数
函数功能:4个独立数码管静态显示
入口参数:无
出口参数:无
描述:
作者:老马识途单片机
日期:2018年1月5日
************************************************/
main()
{
unsigned char disp_buf[4]={0};//显示缓冲区
unsigned int counter;//计数值
_EINT();//打开中断,响应按键
WDTCTL = WDTPW + WDTHOLD;//关看门狗
System_Init();
while(1)
{
disp_buf[3]=(counter/1000)%10;//取计数值的千位数
disp_buf[2]=(counter/100)%10;//取计数值的百位数
disp_buf[1]=(counter/10)%10;//取计数值的十位数
disp_buf[0]=counter%10;//取计数值的个位数
counter++;
P5OUT &= ~BIT0;//锁存个位数
P4OUT=Led_Tab2[disp_buf[0]]; //显示个位数
delay_ms1M(200);//
P5OUT |= BIT0;
P5OUT &= ~BIT0;
P5OUT &= ~BIT1;//锁存十位数
P4OUT=Led_Tab2[disp_buf[1]]; //显示十位数
delay_ms1M(200);//
P5OUT |= BIT1;
P5OUT &= ~BIT1;
P5OUT &= ~BIT2;//锁存百位数
P4OUT=Led_Tab2[disp_buf[2]]; //显示百位数
delay_ms1M(200);//
P5OUT |= BIT2;
P5OUT &= ~BIT2;
P5OUT &= ~BIT3;//锁存千位数
P4OUT=Led_Tab2[disp_buf[3]]; //显示千位数
delay_ms1M(200);//
P5OUT |= BIT3;
P5OUT &= ~BIT3;
delay_ms1M(200);
}
}
void System_Init(void)
{
P4DIR=0xff;//设置为输出端口
P4OUT=0x00;//初始电平为低电平
P5DIR=0xff;//控制端口
P5OUT=0x00;
}
五、程序说明
本例程序较为简单,在主循环中对4片74HC573分别进行数据锁存处理,锁存的时序是先将LE信号置低,这样74HC573输出不变,再将显示的数据通过P4端口送到74HC573的D0~D7,通过将LE置高再置低产生一个下降沿,数据就会锁存到74HC573中
六、仿真结果与分析
在proteus中画好电路图后,双击单片机,将可执行文件装载到单片机内,点击运行,观察数码管的显示情况。如下图所示。


 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表