问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

51单片机6位数码管显示时间

发布网友 发布时间:2022-05-01 23:39

我来回答

1个回答

热心网友 时间:2022-06-25 04:21

C51单片机六位数码管时钟
用数码管dot分隔时分秒
用三个按键设置时间:
SET键:小时设定->分钟设定->结束设定,小时设定状态时表示小时的两位数码管闪烁,分钟设定时表示分钟的两位数码管闪烁
CHANGE键:在小时设定状态和分钟设定状态改变数值
SET S键:秒置零

C语言代码:
//main.c

#include <REGX52.H>
typedef unsigned int UINT ;
typedef unsigned char UCHAR;
#define KEY P2
#define KEYMASK 0x07
sbit LE1 = P2^6; //定义位控口
sbit LE2 = P2^7; //定义段控口
UCHAR KeyPressDown = 0x00;
UCHAR KeyRelease = 0x00;
UCHAR LastKey = 0x00;
UCHAR MODE ;
extern UCHAR HH;
extern UCHAR MM;
extern UCHAR SS;
extern bit T_CYCLE ;
extern void T0_Init(void);//初始化定时器,函数定义在Timer.c
UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay(UINT t) //延时t时钟周期
{
while (t--);
}

void H_Increase(void)//小时增1
{
if(HH<23) HH++;
else
{
HH = 0;
}
}

void M_Increase(void) //分钟增1
{
if(MM<59) MM++;
else
{
MM = 0;
H_Increase();
}
}

void S_Increase(void) //秒增1
{
if(SS<59) SS++;
else
{
SS = 0;
M_Increase();
}
}

void display(UCHAR SEG,UCHAR Digi) //显示一位数码管,SEG = 0-9数字,Digi = 第0-6位
{
LE2 = 1;
P0 = (0x01<<Digi) ;
LE2 = 0;
P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
if (Digi==1||Digi==3) P0 &= 0x7f; //显示分隔符
delay(50);
P0 = 0xff;
LE1 = 0;
}

void main(void)
{
P0 = 0xff;
LE1 = 0;
LE2 = 0;
T0_Init();
while(1)
{
if(MODE != 1 || T_CYCLE)
{
display(HH/10,0); //显示小时十位数
display(HH%10,1); //显示小时个位数
}
if(MODE != 2 || T_CYCLE)
{
display(MM/10,2); //显示分钟十位数
display(MM%10,3); //显示分钟个位数
}
display(SS/10,4); //显示秒十位数
display(SS%10,5); //显示秒个位数
}
}

void key_Process(void) //按键处理程序
{
UCHAR CurrKey;
KEY |= KEYMASK; //将按键对应的IO设置为输入状态
CurrKey = (~KEY) & KEYMASK;

KeyPressDown = (~LastKey) & CurrKey;
KeyRelease = LastKey & (~CurrKey);

LastKey = CurrKey;
switch(KeyRelease)
{
case 1:
if(MODE == 2) MODE = 0;
else MODE ++;
break;
case 2:
if(MODE == 1) H_Increase() ;
if(MODE == 2) M_Increase() ;
break;
case 4:
SS = 0;
break;
default: break;
}
}

//Timer.c

#include <reg52.h>
typedef unsigned int UINT ;
typedef unsigned char UCHAR;
UCHAR HH = 14; //小时初始值
UCHAR MM = 2; //分钟初始值
UCHAR SS = 55; //秒初始值
UINT u_10ms = 0; //10ms计数
bit T_CYCLE = 0;
extern void key_Process(void);
extern void S_Increase(void);

void T0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01;
//定时器赋初始值,定时时间为10ms。
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
IE = 0x82;

}

void T0_INTSrv(void) interrupt 1
{
//定时器重新开始计时。
TH0 = 0xd8;
TL0 = 0xf0;
u_10ms ++;
if (u_10ms%20==0)// 200 ms
{
T_CYCLE = !T_CYCLE; //闪烁循环
}
if (u_10ms>99)// 1000 ms = 1 second
{
u_10ms = 0;
S_Increase();
}
key_Process();//SET按键处理
}

Proreus仿真电路:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何挑选紧致眼霜?有哪些品牌推荐? 怎样挑选抗皱眼霜?有哪些值得安利? 什么品牌的眼霜平价好用? 什么牌子眼霜最好用眼霜十大排名 市面上的大牌抗老眼霜该怎么选? ps4十大最耐玩经营类游戏 推荐点好玩的模拟经营类游戏吧 模拟经营类游戏(模拟经营类游戏简称) 谁有模拟经营版的单机游戏 一个小岛的模拟经营的单机游戏 三系油箱容量 服务器主机与PC个人主机有何具体区别? 51单片机6位数码管显示时间 怎样将PLC中定时器时间用数码管显示 怎样将PLC中定时器时间用数码管显示 STC单片机四位数码管怎么显示时间 even if/though 请问even if even though though although这4个词有什么区别? even if / even though / despite 这3个词的区别 青苔要怎么才能长出来 一般要多久 even though,although,though和even if的详细用法和区别 even if , even though 有什么区别? 青苔什么时候容易生长 even if 和even though有区别没 请问大家even if ,even though的区别 青苔是怎么形成的 青苔的生长 even if even though的区别 even if和even though的区别是什么? even if ,even though 用法区别在哪里呢? 中了ARP病毒怎么办? even if与even though,even的区别 arduino如何获取时间,并显示在数码管 arduino如何获取时间,并显示在数码管 淘宝购物商家不发货怎么办 八位数码管显示时间加上CL 八位数码管显示时间加上CL word文档怎么设置罗马页眉 淘宝上买的东西一直不发货怎么办怎么投诉 单片机 数码管显示时间 单片机 数码管显示时间 让4位数码管先显示日期再显示时间的代码怎么写?(芯片型号是STC89c52)各位大神帮帮忙呀 让4位数码管先显示日期再显示时间的代码怎么写?(芯片型号是STC89c52)各位大神帮帮忙呀 怎么把 plc中计时器的时间用数码管动态显示出来 微软1645出现竖条纹,按开机键屏幕会亮,但是一直是竖条纹不变,这个 怎么把 plc中计时器的时间用数码管动态显示出来 采用定时器,设计制作一个时钟,用六位数码管显示时间,用三个按键可以调整时间的“秒”“分”“时”? 谁知道微软电脑这是那个型号 iPad和微软平板哪个好 微软Surface 2与VOYO WinPad A1哪个好 “重口”用英语怎么说? 怎样写好POP字