关于用51单片机做一个电子时钟的问题
如果有问题欢迎到我空间相关文章下留言 乐于回答~~
程序如下:
; 定义管脚
S_SET BIT P1.0 ;数字钟秒控制位
M_SET BIT P1.1 ;分钟控制位
H_SET BIT P1.2 ;小时控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
ORG 00H
SJMP MAIN
ORG 0BH
LJMP INT_T0
MAIN: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
MOV TMOD,#01H
MOV TH0,#3CH ; 设置初值(定时50毫秒)
MOV TL0,#0B0H
SETB TR0 ;启动定时
SETB ET0
SETB EA
;*******************************************************************************
;判断是否有控制键按下
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 ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判断是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分钟值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判断是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小时值加1
MOV A,HOUR
CJNE A,#24,J2 ;判断是否加到24小时
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 R0
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV R0,#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 R0,#0
RETUNE: RETI
;******************************************
;显示控制子程序
DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.5
MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.2
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,#5
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
这里的程序没用38译码器,若要用则显示子程序要改
如 要显示秒,程序如下
DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
MOV R7,#60H
ORG A,R7
MOV P0,A
LCALL DELAY
MOV A,B
MOV R7,#70H
ORL A,R7
MOV P0,A
LCALL DELAY
其他的一样这样改
我这里有个刚刚写好的,不过是用c写的你看看行不?还有闹钟.
/*2009年3月1号数字时钟*/
#include
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_7=P2^7;
unsigned char p=9,q=5,m=9,n=5,h=3,w=2,s2=0,s3=0,s4=0;//时钟初值
unsigned char m1=0,n1=0,h1=0,w1=0,q1=0,p1=0; //闹钟初值
unsigned char j=0,j1=0,j2=0,s=0,s1=0,k=10;
unsigned char temp=0,temp1=0,temp2=1;
unsigned char show[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};//数码显示0~9
void display();
void display1();
void display2();
void key();
unsigned char i=0;
void delay(unsigned int k)//延时子程序
{
unsigned int i,j;
for(j=0;j<k;j++)
for(i=0;i<10;i++);
}
void main() //main主函数
{
TMOD=0X01;
TH0=0Xff;
TL0=0Xff;
EA=1;ET0=1;
ET1=0;TR1=1;
TR0=1;P0_7=0;
while(1)
{
while(temp==0)
{
display2();key();
}
while(temp==1)
{
display1();key();
}
while(temp2==0)
{
display();key();
}
}
}
void time()interrupt 1 using 1//中断子程序
{
j++;
if(j==10)
{
j=0;j1++;
if(j1==5)
{k=11;j2++;j1=0;
if(j2==2)
{
j2=0,k=10;
p++;
if(p==10)
{
p=0;
q++;
if(q==6)
{
q=0;
m++;
if(m==10)
{
m=0;
n++;
if(n==6)
{
n=0;
h++;
if((w<=2)&&(h==10))
{
h=0;
w++;
}
}
}
}
}
}
}}
if((w==2)&&(h==4))
{
h=0,w=0;
}
if((w==w1)&&(h==h1)&&(m==m1)&&(n==n1)&&(p==p1)&&(q==q1))
{
P0_7=1;
}
}
void time1()interrupt 3 using 3//秒表
{
s1++;
if(s1==10)
{
s1=0;s2++;
if(s2==10)
{
s2=0;s3++;
if(s3==10)
{
s4++;s3=0;
}
}
if(s4==10)
{
s1=0;s2=0;s3=0;s4=0;
}
}
}
void display1() //闹钟显示程序
{
P3=0x01;
P2=show[p1];
delay(1);
P3=0x02;
P2=show[q1];
delay(1);
P3=0x04;
P2=show[k];
delay(1);
P3=0x08;
P2=show[m1];
delay(1);
P3=0x10;
P2=show[n1];
delay(1);
P3=0x20;
P2=show[k];
delay(1);
P3=0x40;
P2=show[h1];
delay(1);
P3=0x80;
P2=show[w1];
delay(1);
}
void display2() //时钟显示程序
{
P3=0x01;
P2=show[p];
delay(1);
P3=0x02;
P2=show[q];
delay(1);
P3=0x04;
P2=show[k];
delay(1);
P3=0x08;
P2=show[m];
delay(1);
P3=0x10;
P2=show[n];
delay(1);
P3=0x20;
P2=show[k];
delay(1);
P3=0x40;
P2=show[h];
delay(1);
P3=0x80;
P2=show[w];
delay(1);
}
void display() //秒表显示程序
{
P3=0x01;
P2=show[s1];
delay(1);
P3=0x02;
P2=show[s2];
delay(1);
P3=0x04;
P2=show[s3];
delay(1);
P3=0x08;
P2=show[s4];
delay(1);
}
void key() //按键
{
if(P1_0==0)
{
delay(5000);temp=1;
}
if((P1_0==0)&&(temp=1))
{
delay(5000);temp=0;
}
if((P1_1==0)&&(temp==0))
{
delay(10000);
m++;
if(m==10)
{
m=0;n++;
if(n==6)
{
n=0;
h++;
if((w<=2)&&(h==10))
{
h=0;
w++;
}
}
}
}
if((w==2)&&(h==4))
{
h=0,w=0;
}
if((P1_2==0)&&(temp==0))
{
delay(10000);
h++;
if((w<=2)&&(h==10))
{
h=0;
w++;
if((w==2)&&(h==4))
{
h=0,w=0;
}
}
}
if((P1_1==0)&&(temp==1))
{
delay(10000);
m1++;
if(m1==10)
{
m1=0;n1++;
if(n1==6)
{
n1=0;
h1++;
if((w1<=2)&&(h1==10))
{
h1=0;
w1++;
}
}
}
}
if((w1==2)&&(h1==4))
{
h1=0,w1=0;
}
if((P1_2==0)&&(temp==1))
{
delay(10000);
h1++;
if((w1<=2)&&(h1==10))
{
h1=0;
w1++;
if((w1==2)&&(h1==4))
{
h1=0,w1=0;
}
}
}
if((P1_3==0)&&(temp1==1))
{
delay(10000);
s1=0;s2=0;s3=0;s4=0;temp1=0;
}
if((P1_3==0)&&(temp1==0))
{
delay(10000);
ET1=1;temp1=1;
}
if(P1_4==0)
{
ET1=0;
temp1=1;
}
if((P1_5==0)&&(temp==0))
{
delay(200);
p=0;q=0;m=0;n=0;h=0;w=0;
}
if((P1_5==0)&&(temp==1))
{
delay(200);
m1=0;n1=0;h1=0;w1=0;
}
if(P1_6==0)
{
delay(200);
P0_7=0;
}
if((P1_7==0)&&(temp2==1))
{
delay(200);
temp2=0;temp=2;
}
if((P1_7==0)&&(temp2==0))
{
delay(200);
temp2=1;
temp=0;
}
}
这个就是在你的数码管显示语句中,任意加入一个即可
像你说的在小时和分钟之间加一个小数点,那么就加一个小时个位数显示的语句
只是这个增加的语句不是显示数字,是单独显示那个小点而已
循环中,不断的依次点亮四个数字和一个小数点,人眼是分不出来的,就可以达到效果了
另外,你需要一个LED闪烁,代表秒的显示,可以利用定时器来完成
观察你的程序,实在是不敢恭维,尤其是数码管的显示部分太乱了
程序中好像还没有自动加时的部分,并且按键处理还没有消抖措施
不多说了,上程序,俺刚刚为你编写的,测试的时候使用的端口和你的不一样
在我的开发板上测试成功后,按照你的板子端口做了修改
如果你直接复制到你的程序中不能使用,检查及更改一下端口即可
如果满意记得采纳哦,若有疑问可以随时向我提问
/***************************************************************************/
//#include<stdio.h>
#include<reg51.h>
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //显示子函数
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;
P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒个位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小数点
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//时个位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//时十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/
做数码管扫描时把需要点亮的那个数码从新编码,比如:正常的0-9是一组编码,需要“点”亮的是另一组编码。
关于用51单片机做一个电子时钟的问题
这个就是在你的数码管显示语句中,任意加入一个即可 像你说的在小时和分钟之间加一个小数点,那么就加一个小时个位数显示的语句 只是这个增加的语句不是显示数字,是单独显示那个小点而已 循环中,不断的依次点亮四个数字和一个小数点,人眼是分不出来的,就可以达到效果了 另外,你需要一个LED闪烁,...
51单片机做数字电子钟
数字电子钟是以1s为最小定时单位的,51单片机自身具有两个16位定时\/计数器,当晶振频率为6MHz时,最大定时时间为0.13s。而具有时、分和秒的数字电子钟只能以1s定时,所以要实现实现1s定时,必须采用软件计数和定时器定时相结合的方法。每1s定时到,修改显示值,送6位LED显示。本课题需用6个LED数码管显示时间值,并且需...
51单片机制作一个具有闹钟功能的24小时的电子钟,利用按键可以调整时间...
有一个4*4矩阵键盘的时钟:
用51单片机做一个LED显示的电子钟
用89C51设计LED电子钟6个数码管显示时分秒,要求通过键盘输入初值,打上开关K1时允许设定时间,按下开关K1时开始运行显示时间,K2用做选择是24小时制还是12小时制答得正确又快的可以获... 用89C51设计LED电子钟 6个数码管显示时分秒,要求通过键盘输入初值,打上开关K1时允许设定时间,按下开关K1时开始运行显示时间,K2用...
我用51单片机设计了一个电子钟,但是不精确,误差很大,请问有那些可能的原...
用时钟芯片:ds1302
基于51单片机的数码管设计电子时钟,可以调时间的,怎么弄唉,大家帮帮...
1、数码管驱动电路设计。一般用三极管如9013或者锁存器如74HC573来驱动,使其能够正常亮灭。2、使用动态扫描的方式让数码管能够显示你想要的数字,这个可以用中断来扫描也可以不用。3、使用实时时钟芯片如DS1302来获得你想要的时间数据。这种网上有很多源程序,你可以搜索看。你要学会几点:(1)对芯片...
求教一个51单片机程序。。(LCD电子时钟)
做一个LCD时钟需要些什么东西啊,具体步骤是怎么做的呢?现在手上有一块单片机开发板,还有一个1602显示屏,设计要求如下:以单片机控制的时钟,在LCD显示器上显示当前的时间。设计的基本要求:1.使用文字型LCD显示器显示当前时间。2.显示格式为“时时:分分:妙秒”。3.用4个功能键操作来设置当前时间。功能键K1-K4...
能给做一个用单片机at89c51的简易电子时钟吗?要有程序,流程图proteus...
创建人:XIAORUILAI 日期:2010-12-3 修改人:功能描述:设计基于51单片机的实时时钟;具备调整日期\\时间\\星期功能;LCD(LM016L)显示 其它说明:版 本:V1。0 \/ include<reg51.h> include<absacc.h> include<reg51.h> define HOME 0 \/\/屏幕左上角 define YEAR 1 \/\/定义年在显...
...的定时器和实验仪的数码管电路设计一个电子时钟,显示格式XX XX XX...
给你个电路和程序,\/\/前几天帮一个网友写,单片机定时时钟在调节功能,可以参考一下我程序 \/ 6位数码管显示电子钟 功能: 按键加,按键减, 按键,启动和停止。\/ include "REG52.H"sbit SHUG_01 = P2^0; \/\/数码管1 sbit SHUG_02 = P2^1; \/\/数码管2 sbit SHUG_03 = P2^2; ...
51单片机驱动八位数码管电子钟
sbit clock=P3^0; \/\/时钟开始 sbit t1=P3^1; \/\/调时 sbit t2=P3^2; \/\/调分 sbit t3=P3^3; \/\/调秒 sbit P3_4 = P3^4;sbit P3_5 = P3^5;void delay(uint z);void display1();void display2();void init();void keyscan1();void keyscan2();void qiehuan();voi...