加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于51单片机的分、秒、毫秒计时设计(数码管显示)

08/23 10:31
1155
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

功能:当按下K1时,能实现分、秒、毫秒计时用数码管进行显示;按下K2时实现手动清零。

功能实现板子:51开发板

具体程序如下:

#include "reg52.h"

//#include "intrins.h"

typedef unsigned int u16;       //对系统默认数据类型进行重定义

typedef unsigned char u8;

#define SMG_A_DP_PORT     P0    //使用宏定义数码管段码口

//共阴极数码管显示0~F的段码数据

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//定义独立按键控制脚

sbit KEY1=P3^1;

sbit KEY2=P3^0;

sbit KEY3=P3^2;

sbit KEY4=P3^3;

//使用宏定义独立按键按下的键值

#define KEY1_PRESS       1

#define KEY2_PRESS       2

#define KEY3_PRESS       3

#define KEY4_PRESS       4

#define KEY_UNPRESS   0

//定义数码管位选信号控制脚

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 gmsec=0;//ms级定义

u8 gsec=0;//秒定义

u8 gmin=0;//分定义

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/*******************************************************************************

* 函 数 名       : key_scan

* 函数功能             : 检测独立按键是否按下,按下则返回对应键值

* 输    入       : mode=0:单次扫描按键

mode=1:连续扫描按键

* 输    出         : KEY1_PRESS:K1按下

KEY2_PRESS:K2按下

KEY3_PRESS:K3按下

KEY4_PRESS:K4按下

KEY_UNPRESS:未有按键按下

*******************************************************************************/

u8 key_scan(u8 mode)

{

static u8 key=1;

if(mode)key=1;//连续扫描按键

if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下

{

delay_10us(1000);//消抖

key=0;

if(KEY1==0)

return KEY1_PRESS;

else if(KEY2==0)

return KEY2_PRESS;

else if(KEY3==0)

return KEY3_PRESS;

else if(KEY4==0)

return KEY4_PRESS;

}

else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)  //无按键按下

{

key=1;

}

return KEY_UNPRESS;

}

void smg_display(u8 dat[],u8 pos)

{

u8 i=0;

u8 pos_temp=pos-1;

for(i=pos_temp;i<8;i++)

{

switch(i)//位选

{

case 0: LSC=1;LSB=1;LSA=1;break;

case 1: LSC=1;LSB=1;LSA=0;break;

case 2: LSC=1;LSB=0;LSA=1;break;

case 3: LSC=1;LSB=0;LSA=0;break;

case 4: LSC=0;LSB=1;LSA=1;break;

case 5: LSC=0;LSB=1;LSA=0;break;

case 6: LSC=0;LSB=0;LSA=1;break;

case 7: LSC=0;LSB=0;LSA=0;break;

}

SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据

delay_10us(100);//延时一段时间,等待显示稳定

SMG_A_DP_PORT=0x00;//消音

}

}

/*******************************************************************************

* 函 数 名       : time0_init

* 函数功能             : 定时器0中断配置函数,通过设置TH和TL即可确定定时时间

* 输    入       : 无

* 输    出         : 无

*******************************************************************************/

void time0_init(void)

{

TMOD|=0X01;//选择为定时器0模式,工作方式1

TH0=0XDC;      //给定时器赋初值,定时10ms

TL0=0X00;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=0;//关闭定时器

}

/*******************************************************************************

* 函 数 名       : time0_start

* 函数功能             : 定时器0打开

* 输    入       : 无

* 输    出         : 无

*******************************************************************************/

void time0_start(void)

{

TR0=1;//打开定时器

}

/*******************************************************************************

* 函 数 名       : time0_stop

* 函数功能             : 定时器0关闭

* 输    入       : 无

* 输    出         : 无

*******************************************************************************/

void time0_stop(void)

{

TR0=0;//关闭定时器

TH0=0X00;

TL0=0X00;

}

void time0() interrupt 1 //定时器0中断函数

{

TH0=0XDC;      //给定时器赋初值,定时10ms

TL0=0X00;

gmsec++;//10ms加1次

if(gmsec==100)//定时1秒

{

gmsec=0;

gsec++;//对秒计数

if(gsec==60)//到达60秒,即1分钟

{

gsec=0;

gmin++;//对分计数

if(gmin==60)gmin=0;

}

}

}

void main()

{

u8 key=0;

u8 time_buf[8];

u8 time_flag=0;

time0_init();

while(1)

{key=key_scan(0);

if(key==KEY1_PRESS)//开始和停止计时

{

time_flag=!time_flag;

//beep_alarm(1000,10);//短暂提示音

}

else if(key==KEY2_PRESS)//清除计时

{

time0_stop();

time_flag=0;

gmin=0;

gsec=0;

gmsec=0;

//beep_alarm(1000,10);//短暂提示音

}

if(time_flag)

time0_start();//开始计时

else

time0_stop();//停止计时

time_buf[0]=gsmg_code[gmin/10];

time_buf[1]=gsmg_code[gmin%10];//分

time_buf[2]=0x40;//-

time_buf[3]=gsmg_code[gsec/10];

time_buf[4]=gsmg_code[gsec%10];//秒

time_buf[5]=0x40;//-

time_buf[6]=gsmg_code[gmsec/10];

time_buf[7]=gsmg_code[gmsec%10];//毫秒

smg_display(time_buf,1);//显示

}

}

功能实现图:

  • 有需要资料的可了解一下.docx

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
KSZ9893RNXC 1 Microchip Technology Inc Ethernet Transceiver

ECAD模型

下载ECAD模型
$7.84 查看
74HC14PW,118 1 NXP Semiconductors 74HC(T)14 - Hex inverting Schmitt trigger TSSOP 14-Pin
$0.36 查看
ZTT-4.00MG 1 ECS International Inc Ceramic Resonator,

ECAD模型

下载ECAD模型
$0.54 查看

相关推荐

电子产业图谱