51单片机设计数码管显示时钟的程序怎么写

如题所述

#include<reg51.h>

#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,flashbit,mode,time; 
unsigned char disdat[8];
sbit led=P1^0;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=10;

disdat[3]=min%10;
disdat[4]=min/10;
disdat[5]=10;

disdat[6]=hour%10;
disdat[7]=hour/10;
}
void flash()
{
switch(flashbit)
{
case 0:break;
case 1:
disdat[6]=0x10;
disdat[7]=0x10;
delay(50);
dischg();
delay(80);
break;
case 2:
disdat[3]=0x10;
disdat[4]=0x10;
delay(50);
dischg();
delay(80);
break;
case 3:
disdat[0]=0x10;
disdat[1]=0x10;
delay(50);
dischg();
delay(80);
break;
default:break;
}
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x01;
P0=~ledtab[disdat[7]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[6]];
break;
case 2:
P2=0x04;
P0=~ledtab[disdat[5]];
break;
case 3:
P2=0x08;
P0=~ledtab[disdat[4]];
break;
case 4:
P2=0x10;
P0=~ledtab[disdat[3]];
break;
case 5:
P2=0x20;
P0=~ledtab[disdat[2]];
break;
case 6:
P2=0x40;
P0=~ledtab[disdat[1]];
break;
case 7:
P2=0x80;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=8;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
sec=55;
min=59;
hour=23;
flashbit=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
flash();//闪烁
if((P3&0x0f)!=0x0f){
key=P3&0x0f;
while((P3&0x0f)!=0x0f);
led=0;
delay(10);
key|=0xf0;
switch(~key)
{
case 0x01: //p3.1选择调时、分、秒
TR0=0;
flashbit+=1;
if(flashbit>3){flashbit=0;TR0=1;}
break;
case 0x02: //p3.2调数
if(flashbit==0)break;
if(flashbit==1)
{
hour++;
if(hour>99)hour=0;
}
if(flashbit==2)
{
min++;
if(min>59)min=0;
}
if(flashbit==3)
{
sec++;
if(sec>59)sec=0;
}
break;
case 0x04:  //选择正/倒
TR0=0;
mode++;
mode&=0x01;
if(mode==0){sec=0;min=0;hour=0;}
dischg();
break;
case 0x08: //启动/暂停
TR0=~TR0;
break;
default:break;
}
}
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机设计数码管显示时钟的程序怎么写
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};\/\/0-9unsigned char sec=0,min=0,hour=12,scanled;unsigned char key,flashbit,mode,time; unsigned char disdat[8];sbit led=P1^0;void delay(unsigned int x){unsigned int i,...

基于51单片机简易时钟闹钟八位数码管显示Proteus仿真
按下设置键进入设置模式,时钟、分钟、秒钟分别闪烁以表示当前正在设置相应参数。设置完毕后,按下设置键退出设置模式,数码管恢复正常显示。用户可以通过功能切换按键显示闹钟时间,并通过类似步骤设置闹钟时间。闹钟时间到时,蜂鸣器将鸣响,每隔1秒响一次,持续6秒,可通过按键停止闹钟。程序代码 使用KEIL4或K...

51单片机电子钟程序数码管显示
include<reg51.h> define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;unsigned int pp;unsigned char code table[]={0x3f,0x06...

51单片机6位数码管显示时间
SET键:小时设定->分钟设定->结束设定,小时设定状态时表示小时的两位数码管闪烁,分钟设定时表示分钟的两位数码管闪烁 CHANGE键:在小时设定状态和分钟设定状态改变数值 SET S键:秒置零 C语言代码:\/\/main.c include <REGX52.H> typedef unsigned int UINT ;typedef unsigned char UCHAR;define KEY...

急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言...
void lcd_pos(char pos);\/\/LCD数据指针位置程序void lcd_init();\/\/LCD初始化设定程序void pro_timedate();\/\/时间日期处理程序void pro_display();\/\/显示处理程序void pro_key();\/\/按键处理程序void time_alarm();\/\/定时报警功能(闹钟)unsigned char scan_key();\/\/按键扫描程序unsigned char week_proc()...

数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点...
我这写了一个!使用数码管显示的!可以用键盘校对时间!你参考下。还写了一个液晶显示的!你要的话也可以发给你!include<reg52.h> define uchar unsigned char define uint unsigned int sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;uchar table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x...

用c语言循环语句怎么写一个51单片机的时钟啊,用8个数码管显示时间。
disdat[3]=min%10;disdat[4]=min\/10;disdat[5]=10;disdat[6]=hour%10;disdat[7]=hour\/10; }void flash(){switch(flashbit){case 0:break;case 1:disdat[6]=0x10;disdat[7]=0x10;delay(50);dischg();delay(80);break;case 2:disdat[3]=0x10;disdat[4]=0x10;delay(50);...

51单片机控制数码管显示时钟,独立按键怎么弄
独立按键处理起来是非常简单的,一般都是IO口单独控制,所以只需要消抖和判断按键按下抬起状态就好。比如:sbit key=P1^0;if(key==0){ delay(10); if(key==0) { keyval=1; while(key==0); }}

谁能告诉我51单片机简单的led数码管时钟程序 24小时制的(c语言版的)
uchar shi,fen,miao;uchar time;void delay(uint x){ uint y;for(;x>0;x--){ for(y=0;y<124;y++);} } void display(uchar shi,uchar fen,uchar miao){ P2=0; \/\/位码 P0=(tab[shi\/10]); \/\/段码 delay(2);P2=1;P0=(tab[shi%10]);delay(2);P2=2; \/\/位码 P0=...

51单片机电子钟六位数码管显示整点提醒仿真设计( proteus仿真+程序+...
1. 开机控制显示按键,时\/分切换按键,加1按键。2. 每到整点,蜂鸣器会发出提示音。3. 通过六位一体数码管显示时、分、秒,开机时显示为12:00:00。设计使用12MHz频率的51单片机。硬件电路图由图纸绘制,程序在keil 4\/keil 5中编写,并在proteus上进行仿真。设计遵循S0047编号。51单片机型号(如...

相似回答