3071|0

6366

帖子

4918

TA的资源

版主

楼主
 

基于Proteus的MSP430单片机仿真实例8-2位一体数码管倒计时 [复制链接]




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





一、任务要求
使用2位一体数码管实现30s的倒计时显示,当按下启动按键时,数码管显示数据从30开始减一,一直减到0.倒计时开始后,按键处于无效状态,此时按键不会有任何反应。
二、分析说明
本例使用数码管动态扫描方式,由P4端口驱动共阳极数码管,P5端口控制数码管的两位。键盘输入由P2.0口接入。
三、硬件电路
本例中数码管和单片机I/O口之间的限流电阻没有采用单个的限流电阻,而是使用了一种称为排阻RN的元件,这种元件是将4个或8个电阻封装在一起,使用起来十分方便,减少了元件体积和焊接时间,是一种常用的硬件电路设计方式。数码管采用2位一体的共阳极数码管。
四、程序设计
//main.c
#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);
/************************************************
函数名称:主函数
函数功能:2位一体数码管倒计时显示
入口参数:无
出口参数:无
描述:
作者:老马识途单片机
日期:2018年1月5日
************************************************/
main()
{
unsigned char i=0;//
unsigned char disp_buf[2]={0};//显示缓冲区
unsigned int counter=30;
_EINT();//打开中断,响应按键
WDTCTL = WDTPW + WDTHOLD;//关看门狗
System_Init();
while(1)
{
if(key==0x01)
{
key=0;
_DINT(); //关中断,开始计时后,按键不起作用
for(counter=30;counter>0;counter--)
{
disp_buf[1]=counter/10;//取计数值的十位数
disp_buf[0]=counter%10;//取计数值的个位数
for(i=0;i<25;i++) //循环25次,总计1秒
{
P5OUT=BIT1;
P4OUT=0;
P4OUT=Led_Tab2[disp_buf[1]]; //显示十位数
delay_ms1M(20);//延时20MS,可看到两个数码管同时显示,无闪烁
P5OUT=BIT0;
P4OUT=0;
P4OUT=Led_Tab2[disp_buf[0]]; // 显示个位数
delay_ms1M(20);//延时20MS,可看到两个数码管同时显示,无闪烁
}
}
P4OUT=Led_Tab2[0];//30S倒计时结束,显示0
P5OUT=BIT0;
_EINT();//打开中断,响应按键
}
}
}
void System_Init(void)
{
P4DIR=0xff;//设置为输出端口
P4OUT=0x00;//初始电平为低电平
P5DIR=0x03; // 设置为输出端口
P5OUT=0x00;
P2DIR=0x00;//按键端口设置为输入
P2IE |= BIT0;//中断使能
P2IES |= BIT0;//下降沿中断
P2IFG &= ~BIT0;//清除中断标志
}
//端口中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void port_2(void)
{
P2IFG &= ~BIT0;//清除中断标志
key=0x01;//设置按键按下标志
}
五、程序说明
2位一体数码管使用了动态扫描显示的方式,数码管的两个数据位分别由接到P5.0,P5.1的两个端口控制,在主程序for循环中,显示十位数时,要使P5.1输出高,同时P5.0要输出低;同样,显示个位数时,要使P5.0输出高,同时P5.1要输出低。显示完十位数或个位数后,延时20ms,程序中是先显示十位数,再显示个位数,而从仿真效果看,两个数码管时同时显示的。这就是人眼的视觉残留效应。
按键采用中断方式,当按下按键时,产生一个下降沿的跳变,在程序中P2IE |= BIT0;
P2IES |= BIT0; 两条语句分别让端口中断使能和配置端口中断的触发电平。
中断服务程序的代码如下
//端口中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void port_2(void)
{
P2IFG &= ~BIT0;//清除中断标志
key=0x01;//设置按键按下标志
}
其中,#pragma vector=PORT2_VECTOR为定义中断矢量地址,由于外部中断不能自动清除,在软件中利用P2IFG &= ~BIT0;清除中断标志。
六、仿真结果与分析
在proteus中画好电路图后,双击单片机,将可执行文件装载到单片机内,点击运行,观察数码管的显示情况。如下图所示。
可以观察到按键按下后数码管显示的数字由30开始减1,直到减到0;在倒计时开始后,按键无效,直到显示0后,才能重新相应按键。
有兴趣的话,可以修改数码管显示的延时时间,观察随着延时时间长短的变化,数码管的显示会发生什么变化。

 
点赞 关注

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表