用51单片机设计数字钟,六位数码管显示时分秒,四个发光二极管做为秒点一秒钟闪烁一次。用protues软件仿真

最好是汇编语言

 

那几个发光二极管自己加就行了 

s_set bit p1.0

m_set bit p1.1

h_set bit p1.2

second equ 30h

minute equ 31h

hour equ 32h

tcnt equ 34h

org 0000h

sjmp start

org 000bh

ljmp int_t0

start:mov dptr,#table

mov hour,#0

mov minute,#0

mov second,#0

mov tcnt,#0

mov tmod,#01h

mov th0,#3ch

mov tl0,#0b0h

mov ie,#82h

setb tr0

a1:lcall display

jnb s_set,s1

jnb m_set,s2

jnb h_set,s3

ljmp a1

s1:lcall delay

jb s_set,a1

inc second

mov a,second

cjne a,#60,j0

mov second,#0

ljmp k1

s2:lcall delay

jb m_set,a1

k1:inc minute

mov a,minute

cjne a,#60,j1

mov minute,#0

ljmp k2

s3:lcall delay

jb h_set,a1

k2:inc hour

mov a,hour

cjne a,#24,j2

mov hour,#0

mov minute,#0

mov second,#0

ljmp a1

j0:jb s_set,a1

lcall display

sjmp j0

j1:jb m_set,a1

lcall display

sjmp j1

j2:jb h_set,a1

lcall display

sjmp j2

int_t0:mov th0,#3ch

mov tl0,#0b0h

inc tcnt

mov a,tcnt

cjne a,#20,retune

inc second

mov tcnt,#0

mov a,second

cjne a,#60,retune

inc minute

mov second,#0

mov a,minute

cjne a,#60,retune

inc hour

mov minute,#0

mov a,hour

cjne a,#24,retune

mov hour,#0

mov minute,#0

mov second,#0

mov tcnt,#0

retune:reti

display:mov a,second

mov b,#10

div ab

clr p3.4

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.4

mov a,b

clr p3.5

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.5

MOV A,MINUTE

MOV B,#10

div ab

clr p3.2

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.2

mov a,b

clr p3.3

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.3

mov a,hour

mov b,#10

div ab

clr p3.0

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.0

mov a,b

clr p3.1

movc a,@a+dptr

mov p0,a

lcall delay

setb p3.1

ret

table:db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

delay:mov r6,#10

d1:mov r7,#250

djnz r7,$

djnz r6,d1

ret

end

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-27
汇编是我心中永远的痛啊!
可以给一个C的,不过这只是大概的框架,细节问题在没有在实际中用是很难发现的!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p10=P1^0; //定义端口,p10控制四个LED闪烁
uchar secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;
uint num=0,sec=0,min=0,hour=0;
uint time=5000;
unsigned char code LEDBUF[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//定义数码管显示的0-9的代码
void delay(unsigned int z)
{ //延时程序
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);//如果是12MHz晶振,就是110us对应z=1
}
void display();
void main()
{TMOD=0x02;//T0定时器,模式2定时,8位定时
TH0=55; //定时1S的数据设置,定时200个机器周期后中断一次,0.2ms
TL0=55;
EA=1;ET0=1;TR0=1;//开启总中断,允许T0中断,开启T0中断
while(1)
{display();//显示时间 }
}

void time0() interrupt 1
{num++;//T0中断服务程序,定时中断一次后num加一
time --;
If(time <=2500)
{ P10=0;}
else
{ p10=1;}
If(!time)
{time=5000;
sec++;
if(sec==60)
{sec=0;
min++;//到60s,min加一,sec清零
if(min==60)
{min=0;
hour++;//到60分,hour加一,分清零
if(hour==24)
{hour=0;
min=0;//到24小时则所有时间清零,新的一天从零时开始计时
sec=0;
}
}
}
}
}
void display()
secge=sec%10;//秒的个位,秒除以10的余数
secshi=sec/10;//十位,秒整除10的商
minge=min%10;
minshi=min/10;
hourge=hour%10;
hourshi=hour/10;
P2=0xfe;//1111 1110,0选通一位数码管,
P0= LEDBUF [secge];//送秒的各位显示
delay(5);//延时一会儿
P2=0xfd;//选通下一位数码管,1111 1101
P0= LEDBUF [secshi];//送秒的十位显示
delay(5);
P2=0xfb;//1111 1011,选通再下一位
P0=0x40;//显示分与秒之间的那个点
delay(5);
P2=0xf7;//1111 0111,再下一位
P0= LEDBUF [minge];//分的个位
delay(5);
P2=0xef;//1110 1111
P0= LEDBUF [minshi];//分的十位
delay(5);
P2=0xdf;//1101 1111
P0=0x40;//分与时间的点
delay(5);
P2=0xbf;//1011 1111
P0= LEDBUF [hourge];//小时的个位
delay(5);
P2=0x7f;//0111 1111
P0= LEDBUF [hourshi];//小时的十位
delay(5);
}本回答被网友采纳
相似回答