51单片机电子钟程序数码管显示

作者&投稿:良诚 (若有异议请与网页底部的电邮联系)
用51单片机编写程序实现数码管的时钟数字显示~

KEYVALEQU 30HKEYTMEQU 31HKEYSCANEQU 32HDATEQU 33HSCANLEDEQU 39HCLKEQU 77HSECEQU 78HMINEQU 79HHOUREQU 7AHPAUSEBIT 00HDOTBIT 01HORG 0000HLJMP MAINORG 000BHLJMP T0ISR;50ms定时ORG 001BHLJMP T1ISR;扫描显示ORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#11HMOV TH0,#03CHMOV TL0,#0B0HMOV TH1,#0ECHMOV TL1,#078HMOV KEYVAL,#0MOV SCANLED,#0MOV 33H,#10HMOV 34H,#10HMOV 35H,#10HMOV 36H,#10HMOV 37H,#10HMOV 38H,#10HMOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV CLK,#0CLR PAUSESETB EASETB ET1SETB TR1LOOP:LCALL KEYSELMOV A,KEYVALCJNE A,#0FFH,LOOP1SJMP LOOPLOOP1:CJNE A,#10,LOOP2;“ON”启动SETB TR0SETB ET0SETB PAUSESJMP LOOPLOOP2:CJNE A,#11,LOOP3;“=”清零MOV SEC,#0MOV MIN,#0MOV HOUR,#0LCALL DISCHGSJMP LOOPLOOP3:CJNE A,#15,LOOP4;“+”暂停CLR TR0CLR ET0CLR PAUSESJMP LOOPLOOP4:CJNE A,#14,LOOP5;“-”清显示暂停MOV 33H,#10HMOV 34H,#10HMOV 35H,#10HMOV 36H,#10HMOV 37H,#10HMOV 38H,#10HCLR TR0CLR ET0CLR PAUSESJMP LOOPLOOP5:CJNE A,#10,LOOP6;数字键LOOP6:JC LOOP7LJMP LOOPLOOP7:JNB PAUSE,LOOP8;暂停状态可以输入数字键LJMP LOOPLOOP8:MOV 33H,34HMOV 34H,35HMOV 35H,36HMOV 36H,37HMOV 37H,38HMOV 38H,KEYVALMOV A,33HSWAP AORL A,34HLCALL BCDHMOV HOUR,AMOV A,35HSWAP AORL A,36HLCALL BCDHMOV MIN,AMOV A,37HSWAP AORL A,38HLCALL BCDHMOV SEC,ALJMP LOOP;------------------;BCD转换为十六进制BCDH:MOV B,#10HDIV AB MOV R7,BMOV B,#10MUL AB ADD A,R7RET ;------------------;十六进制转换为BCDHBCD:MOV B,#10DIV AB SWAP A ORL A,BRET ;------------------KEYSEL:MOVKEYVAL,#0MOVKEYSCAN,#0EFHLCALLGETKEYMOVA,KEYTMJZKEYS1MOVKEYVAL,ASJMPKEYRTNKEYS1:MOVKEYSCAN,#0DFHLCALLGETKEYMOVA,KEYTMJZKEYS2CLRCADDA,#4MOVKEYVAL,ASJMPKEYRTNKEYS2:MOVKEYSCAN,#0BFHLCALLGETKEYMOVA,KEYTMJZKEYS3CLRCADDA,#8MOVKEYVAL,ASJMPKEYRTNKEYS3:MOVKEYSCAN,#7FHLCALLGETKEYMOVA,KEYTMJZKEYRTNCLRCADDA,#12MOVKEYVAL,AKEYRTN:LCALL CHGKEYRET;--------------------GETKEY:MOV KEYTM,#0MOVA,KEYSCANMOVP3,ANOPMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEYMOV R2,#10LCALL DELAYMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEYMOVA,P3ANLA,#0FHMOVR7,ASF:MOVA,P3ANLA,#0FHXRLA,#0FHJNZSFMOVA,R7CJNEA,#0EH,NK1MOVKEYTM,#1SJMPNOKEYNK1:CJNEA,#0DH,NK2MOVKEYTM,#2SJMPNOKEYNK2:CJNEA,#0BH,NK3MOVKEYTM,#3SJMPNOKEYNK3:CJNEA,#07H,NOKEYMOVKEYTM,#4NOKEY:RET;--------------------DELAY:MOV R3,#50DELAY1:MOV R4,#100DJNZ R4,$DJNZ R3,DELAY1DJNZ R2,DELAYRET;--------------------T0ISR:PUSH ACCCLR TR0MOV TH0,#3CHMOV TL0,#0B0HSETB TR0INC CLKMOV A,CLKCJNE A,#20,T0ISREMOV CLK,#0INC SECMOV A,SECCJNE A,#60,T0ISREMOV SEC,#0INC MINMOV A,MINCJNE A,#60,T0ISREMOV MIN,#0INC HOURMOV A,HOURCJNE A,#24,T0ISREMOV SEC,#0MOV MIN,#0MOV HOUR,#0T0ISRE:LCALL DISCHGPOP ACCRETI;--------------------DISCHG:MOV A,HOURLCALL HBCDPUSH ACCANL A,#0FHMOV 34H,APOP ACCANL A,#0F0HSWAP AMOV 33H,AMOV A,MINLCALL HBCDPUSH ACCANL A,#0FHMOV 36H,APOP ACCANL A,#0F0HSWAP AMOV 35H,AMOV A,SECLCALL HBCDPUSH ACCANL A,#0FHMOV 38H,APOP ACCANL A,#0F0HSWAP AMOV 37H,ARET;--------------------T1ISR:PUSH ACCCLR TR1MOV TH1,#0ECHMOV TL1,#78HSETB TR1MOV DPTR,#LEDTABT100:MOV R0,#DATMOV A,SCANLEDADD A,R0MOV R0,AMOV A,SCANLEDJNZ T101MOV P2,#01HCLR DOTSJMP T1DIST101:DEC AJNZ T102MOV P2,#02HSETB DOTSJMP T1DIST102:DEC AJNZ T103MOV P2,#04HCLR DOTSJMP T1DIST103:DEC AJNZ T104MOV P2,#08HSETB DOTSJMP T1DIST104:DEC AJNZ T105MOV P2,#10HCLR DOTSJMP T1DIST105:MOV P2,#20HCLR DOTT1DIS:MOV A,@R0MOVC A,@A+DPTRJNB DOT,T1DIS1ORL A,#01HT1DIS1:CPL AMOV P0,AINC SCANLEDMOV A,SCANLEDCJNE A,#6,T1ENDMOV SCANLED,#0T1END:POP ACCRETI;--------------------CHGKEY:MOV A,KEYVALJZ KV16DEC AJNZ KV01MOV KEYVAL,#7RETKV01:DEC AJNZ KV02MOV KEYVAL,#4RETKV02:DEC AJNZ KV03MOV KEYVAL,#1RETKV03:DEC AJNZ KV04MOV KEYVAL,#10RETKV04:DEC AJNZ KV05MOV KEYVAL,#8RETKV05:DEC AJNZ KV06MOV KEYVAL,#5RETKV06:DEC AJNZ KV07MOV KEYVAL,#2RETKV07:DEC AJNZ KV08MOV KEYVAL,#0RETKV08:DEC AJNZ KV09MOV KEYVAL,#9RETKV09:DEC AJNZ KV10MOV KEYVAL,#6RETKV10:DEC AJNZ KV11MOV KEYVAL,#3RETKV11:DEC AJNZ KV12MOV KEYVAL,#11RETKV12:DEC AJNZ KV13MOV KEYVAL,#12RETKV13:DEC AJNZ KV14MOV KEYVAL,#13RETKV14:DEC AJNZ KV15MOV KEYVAL,#14RETKV15:DEC AJNZ KV16MOV KEYVAL,#15RETKV16:MOV KEYVAL,#0FFHRET;--------------------LEDTAB:DB 0FCH;"0"00HDB 60H;"1"01HDB 0DAH;"2"02HDB 0F2H;"3"03HDB 66H;"4"04HDB 0B6H;"5"05HDB 0BEH;"6"06HDB 0E0H;"7"07HDB 0FEH;"8"08HDB 0F6H;"9"09HDB 0EEH;"A"0AHDB 3EH;"B"0BHDB 9CH;"C"0CHDB 7AH;"D"0DHDB 9EH;"E"0EHDB 8EH;"F"0FHDB 00H;" "10H;--------------------END

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

#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,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
dula=0;
P0=table[shi2];
dula=1;
dula=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[shi1]|0x80;
dula=1;
dula=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[fen2];
dula=1;
dula=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[fen1]|0x80;
dula=1;
dula=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[miao2];
dula=1;
dula=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[miao1];
dula=1;
dula=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan0()
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xbb:
ok=0;
break;

case 0x7b:
ok=1;
break;
}
}
}
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void main()
{
TMOD=0x01;

TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;

while(1)
{ keyscan0();

if(ok==1)
{ TR0=1;
wei=0;

if(pp==20)
{ pp=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24) //为24h一个循环,若要12h,只需在此改为12即可。
{
s=0;
}
}
}
}

a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else
{ TR0=0;
keyscan();
if(key!=10)
{

switch(wei)
{
case 1: if(key<3) //小时最高位为2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //当小时最高位为2时,低位最高为4
break;
case 3: if(key<7) //分钟最高位为6
b1=key;
else
wei--;
break;
case 4: b0=key; break;
case 5: if(key<7) //秒最高位为6
c1=key;
else
wei--;
break;
case 6: c0=key; break;
}
key=10;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,b1,b0,c1,c0);
}
}
}

void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}


单片机控制多位数码管的电子时钟程序
\/\/延时程序 void Display(uint sd,uint mm,uint hy);\/\/显示程序 void add();\/\/加一 void alarmclock();\/\/闹钟 void init();\/\/初始化 int clock();\/\/计算时间 void Calender();\/\/计算日期 void main() { P2=0xff; init(); while(1){ add(); if(rili==1)\/\/分日历和时间显示 Dis...

单片机设计数字电子钟的程序
ajmp start org 03h ajmp jia org 0bh ajmp saomiao org 13h ajmp jian org 1bh ajmp jishu org 2bh start:mov ie,#10001111b mov ip,#00000010b mov tmod,#00100010b mov th1,#6 mov tl1,#6 mov th0,#88h mov tl0,#88h setb it1 setb it0 mov r4,#11111110b mov sp,#30h mo...

一个51单片机电子钟程序,求详细的解释啊急急急!!!
if(second==60) \/\/秒加到60?{ second=0; \/\/秒清零 } dispbuf[0]=second%10; \/\/取秒的个位放在显示缓冲 dispbuf[1]=second\/10; \/\/取秒的十位放在显示缓冲 while(P0_0==0); \/\/等待,知道按键松开 } } if(P0_1==0) \/\/p01的按键按下,设置分钟,请参考秒的程序,一样的 { for...

求单片机电子时钟程序设计
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。

求c51单片机电子钟程序(c语言)
void send_out(unsigned char out)\/\/传送一个字节8位 { uchar i;D_SCL = 0;for (i=8;i>=1;i--){ D_SDA = out&0x80; \/\/送数据到数据口 D_SCL = 1; \/\/时钟线置1 D_SCL = 0; \/\/送一时钟 out<<=1; \/\/左移 } } \/\/=== 写命令函数 === void lcd_wcmd(uch...

用单片机写一个C语言程序关于电子时钟,用键盘调制时分秒的加减 第一个...
我给你一个保证好用的,KEY_COM调模式,按一下进入调时 ,在按一下调分,再按一下退出调时模式,这时加减按键都无效,在调时模式时会产生闪烁方式,这段程序是我自己想的办法实现的,可能有点笨拙,但效果很好,我建议你用DS1302做时钟,用单片机计数器由于晶振等原因会有很大的误差,实际中没有用...

51单片机电子钟程序数码管显示
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1){ dula=0;P0=table[shi2];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(5);P0=table[shi1]|0x80;dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(5);P0=table[fen2];dula=1;dula=0...

单片机电子钟的程序
下面的程序是比较简单的一个 这里并没有采用AT24C02设计实现断电自动保护显示数据的功能 实现的功能:使用TX-1c实验板(郭天祥的板子,网上有电路图可下载)(1)时间显示在1602液晶上,并且按秒实时更新 (2)能够使用板上的案件随时调节始终的时、分、秒;按键设计了三个:功能选择键(按一次修改秒,...

用51单片机设计一个电子钟
巧了,国亲无聊做了一个玩玩,给你看看把,其实电子钟挺简单的,下面是程序:include<reg52.h> define uchar unsigned char define uint unsigned int sbit ch=P3^2;sbit key=P3^5;sbit key1=P3^4;uchar t0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq...

利用单片机实验板制作一个电子钟,LED显示区上的DS1、DS2用于显示小时,DS...
while(1){ if(s==0x10){ TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;IE=0x82;TR0=1;s=0x80;break;} if(k1==0){ while(k1==0);s=_crol_(s,1);} if(k2 == 0){ while(k2 == 0);switch(s){ case 0x01:Digits_of_4DSY[0]++;if(Digits_of_4DSY[0]==...

蓬安县18093207555: 单片机电子钟程序
胥悦盐酸: 51单片机在数码管上显示的数字钟程序: #include "at89x51.h" unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0...

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

蓬安县18093207555: 用51单片机编写程序实现数码管的时钟数字显示 -
胥悦盐酸: KEYVAL EQU 30H KEYTM EQU 31H KEYSCAN EQU 32H DAT EQU 33H SCANLED EQU 39H CLK EQU 77H SEC EQU 78H MIN EQU 79H HOUR EQU 7AH PAUSE BIT 00H DOT BIT 01H ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ;...

蓬安县18093207555: 求程序用AT89C51单片机......用六位数码管实现数字时钟,显示时分秒,用两个按键可分别调整时、分. -
胥悦盐酸: #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar temp,aa,miao,fen,shi; sbit m=P3^0; sbit n=P3^1; uchar code table[]={ //数码管编码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; void display(uchar miao,...

蓬安县18093207555: 51单片机驱动八位数码管电子钟 -
胥悦盐酸: #include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#define DP 0x80 uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位选码表 //0 1 2 3 4 5 6 7 uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0...

蓬安县18093207555: 单片机时钟 《AT89S51》 1、四位数码管显示时分、分秒,以24小时计时运行 -
胥悦盐酸: 调时程序: MAIN:JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时JNB P3.2,NLTZ1;按下2键进行闹铃设置JNB P3.3,DSTZ;按下3键进行定时设置ACALL DISP;调用显...

蓬安县18093207555: 51单片机设计数码管数字时钟,怎么实现显示年月日可切换显示时分秒,? -
胥悦盐酸: 设计一个按键,或者定时自动切换. 显示的话就是将数据传送给显示模块(调用显示程序).

蓬安县18093207555: 想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一个按键 -
胥悦盐酸: 你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗…… 全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位. 然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种...

蓬安县18093207555: 51单片机串口通信控制八位数码管显示时钟程序,用C语言怎么写??求告诉. -
胥悦盐酸: 不是取反,是关闭对应数码管.思路:判断按键->调整时间->显示时间;你要实现闪烁,需要在显示数字部分下功夫

蓬安县18093207555: 求一个基于AT89C51单片机的数字时钟程序,显示时、分、秒不要求闹钟!就在开发板上的数码管显示 -
胥悦盐酸: 时钟的话 你把数码管的显示的变量值放在定时器里 通过你的定时器 来实现时分秒的定时

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网