用51单片机编程:电子时钟(设计电子时钟,用51单片机编程)

作者&投稿:樊维 (若有异议请与网页底部的电邮联系)
51单片机电子钟 通过按键调整时间 这块程序怎么写(方法)~

ORG 0000H ;主程序入口
LJMP MAIN ;跳转到标号MAIN执行
ORG 000BH ;定时器T0中断入口
AJMP PTF0 ;跳转到标号PTF0执行
HOUR EQU 4AH ;赋值伪指令
MIN EQU 4BH
SEC EQU 4CH
BUFF EQU 4DH
;*************************************************************************************
;主程序
MAIN: MOV HOUR,#00H ;时,分,秒,标记清零
MOV MIN,#00H
MOV SEC,#00H
MOV BUFF,#00H
MOV SP,#60H ;设堆栈指针
MOV TH0,#3CH ;定时器赋初值
MOV TL0,#0B0H
MOV 40H,#14H ;设循环次数20次
MOV TMOD,#1 ;写TMOD
MOV IP,#2 ;写IP
MOV IE,#82H ;开中断
SETB TR0 ;启动定时器
LOOP: ACALL DISPLAY ;调用显示程序
JNB P3.0,FEN ;校时键按否?否,跳转到FEN
ZX: ACALL DISPLAY
JB P3.0,ZX
MOV A,HOUR ;时加1
ADD A,#1
DA A
CJNE A,#24H,BI ;时加到24时否?是,清零
CLR A
BI: MOV HOUR,A
MOV SEC,#00H ;秒清零
FEN: JNB P3.1,YY ;校分键按下否?否,跳转到YY
ZC: ACALL DISPLAY
JB P3.1,ZC
MOV A,MIN ;分加1
ADD A,#1
DA A
CJNE A,#60H,CI ;分加到60否?是,清零
CLR A
CI: MOV MIN,A
MOV SEC,#00H ;秒清零
YY: AJMP LOOP
;***************************************************************************************
;中断服务程序
PTF0: MOV TH0,#3CH ;初值重装
MOV TL0,#0B0H
CLR TR0 ;关定时器
CLR A ;清A
DJNZ 40H,XX ;1秒到否?否,跳转到XX
MOV 40H,#14H ;重写循环次数
MOV A,SEC ;秒单元加1
ADD A,#1
DA A
MOV SEC,A
CJNE A,#60H,PTF0R ;60秒到否?否,跳转到PTF0R
JMIN: MOV SEC,#00H ;秒清零
MOV A,MIN ;分单元加1
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H, PTF0R ;60分到否?否,跳转到PTF0R
MOV MIN,#00H ;分清零
JHOUR: MOV SEC,#00H ;秒清零
MOV A,HOUR ;时单元加1
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H, PTF0R ;24时到否?否,跳转到PTF0R
MOV HOUR,#00H ;时清零
AJMP PTF0R ;跳转到PTF0R
XX: MOV R7,40H ;给小数点做标记,1和0
CJNE R7,#0AH,NEQ
EQ: NOP
AJMP PTF0R
NEQ: JC YEQ
MOV BUFF,#00H
AJMP PTF0R
YEQ: MOV BUFF,#0FFH
AJMP PTF0R
PTF0R: SETB TR0
RETI
;***************************************************************************************
;显示子程序
DISPLAY: MOV R5,BUFF ;根据标记输出带点和不带点的数字
CJNE R5,#00H,CVB ;根据标记查不同的表
MOV DPTR,#TAB1
LJMP TYU
CVB: MOV DPTR,#TAB
TYU: MOV A,MIN ;显示分钟的个位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0h
CLR P2.4
ACALL DELAY
MOV A,MIN ;显示分钟的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.5
ACALL DELAY
MOV A,HOUR ;显示时钟的个位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.6
ACALL DELAY
MOV A,HOUR ;显示时钟的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.7
ACALL DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不带小数点的字型码
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;带小数点的字型码
;****************************************************************************************
;延时子程序
DELAY: MOV R4,#20
YAN: MOV R5,#10
SHI: DJNZ R5,SHI
DJNZ R4,YAN
RET
END

以前我的单片机课程设计,提供给你参考参考,不过只有调分和调时的。。。

我的博客上有一个比较好的,你可以去参考一下,但要做一些修改,才能完全符合你的设计要求。

如果有问题欢迎到我空间相关文章下留言 乐于回答~~
程序如下:
; 定义管脚
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
其他的一样这样改

楼上的你再加个i2c2402 eprom才贵那么点钱会死啊!
好歹也要保持下下数据啊!!!ds1302的eprom很小的!!!如果嵌入节庆日提醒就肯定不够了啊!!!
回答问题一堆要慎密啊!!!

帮啥呀!电子钟我这儿有

补充:我这个软件和硬件都有,编和程序也有,仿真图都有

用51汇编编写的
http://hi.baidu.com/shuangsushuangfei

  #include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
sbit d=P2^3;
unsigned char code string[]={"Test Result"};
unsigned char code digit[]={"0123456789"};
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}

  void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}

  unsigned char busy(void)//判忙函数
{
bit result;
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
void writeinstruction(uchar dictate)//写指令
{
while(busy()==1);
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P0=dictate;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void writeaddress(uchar x)//写地址
{
writeinstruction(x|0x80);
}
void wretedata(uchar y)//写数据
{
while(busy()==1);
RS=1;
RW=0;
E=0;
P0=y;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void init(void)//初始化
{
d=0;
delay(15);
writeinstruction(0x38);//工作方式:8位总线,2行,5*7点阵
delay(5);
writeinstruction(0x38);//工作方式:8位总线,2行,5*7点阵
delay(5);
writeinstruction(0x38);//工作方式:8位总线,2行,5*7点阵
delay(5);
writeinstruction(0x0f);//显示状态:显示开,有光标,光标闪烁
delay(5);
writeinstruction(0x06);//光标移动:光标右移,字符不移
delay(5);
writeinstruction(0x01);
delay(5);
}
void main(void)
{
unsigned char D1,D2,D3,D4,D5; //定义变量i指向字符串数组元素
unsigned int x; //定义变量,储存检测结果
unsigned char i;
init();
delay(10);
writeaddress(0x02);
i=0;
while(string[i]!=0)
{
wretedata(string[i]);
i++;
}
while(1)
{
x=rand();
D1=x%10;
D2=x%10000%1000%100/10;
D3=x%10000%1000/100;
D4=x%10000/1000;
D5=x/10000;
writeaddress(0x45);
wretedata(digit[D5]);
wretedata(digit[D4]);
wretedata(digit[D3]);
wretedata(digit[D2]);
wretedata('.');
wretedata(digit[D1]);
for(i=0;i<4;i++)
delay(250);
}
}


51单片机汇编语言进入空闲掉电模式
PCON寄存器的IDL位(bit 0)用于控制单片机进入空闲模式。当产生中断或发生复位时自动恢复运行。SETB PCON.0 PCON寄存器的PD位(bit 1)用于控制单片机进入掉电模式。当发生复位时自动恢复运行。SETB PCON.1

用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0...
这是共阳极的数码管,至于你要显示0~F这个在编程实现

用51单片机的输出的模拟信号,即0,1怎么控制电动机的开关,电动机的电
首先,51单片机的输出的0,1,不叫模拟信号,叫数字信号,或脉冲信号。这很简单的。用单片机一个引脚控制一个三极管,三极管控制一个继电器,再由继电器控制电机。如下图

AT89S51单片机c语言程序在某引脚输出高电平的编程方法
在主函数内部,执行关键的编程步骤。将P1_3引脚赋值为1。这一步操作意味着将P1.3引脚设置为输出高电平状态。在AT89S51单片机中,引脚输出高电平通常代表逻辑值1,对应于电源电压VCC。在完成设置后,程序将进入一个死循环`While( 1 );`。这个循环类似于汇编语言中的`LOOP: goto LOOP;`指令,使得程...

51单片机编程
51编程得看外部电路的连接情况。没有电路图,木有办法写。。。数码管和单片机之间的电路有很多种,你这种就用译码器,74138就行。假设单片机p1口用作数码管输出。滑槽电路也不清楚,假设一个电机,用的是P2^0,P2^1(顺时针一个口,逆时针一个口)检测非金属物料的电路用的是P2^3 4. 按键电路用的...

这是我的51单片机电路原理图,希望能够帮忙编写一个能够测输入端高电
while(P3^5==0);\/\/等待高电平来到 TR0=1; \/\/启动定时器 while(P3^5==1);\/\/等待高电平结束 TR0=0; \/\/关闭定时器 t=TH0*256+TL0;\/\/读取转换结果 如果高电平持续时间较长,定时器可能会溢出,这时可以设置允许中断 中断程序中让全局变量 n 加1 最终t=65536*n+TH0*256+TL0;当然...

51单片机的复位方法有哪些?
51单片机有五种常用的复位方法:1.上电制动复位,注意:只要电源的的上升时间不超过1ms,就可以实现自动上电复位。2.软件复位,注意:复位信号保持时间是编程人员预定的时间。3.按键电平复位,注意:复位信号保持时间大于2个时钟周期。4.外部脉冲复位,注意:复位信号保持时间大于2个时钟周期。5.看门狗溢出...

51单片机C编程,4个开关控制4个灯。要求上电清零,开关灯一一对应。当1个...
楼上的代码也是为了你前途着想啊,,自己改吧..没必要那么长的 include <reg51.h>void delay(unsigned char n);void main(){P2=0x30;while(1){delay(200);if(P2!=0x30){P2=P2;P2&=0xcf;}}}void delay(unsigned char n){unsigned char i;while(n--){for(i=0;i<100;i++);}} ...

单片机中断程序怎么写?
编程代码如下:ORG 0000H MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值 MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值 MOV RO,#00H LOOP: MOVX A, @DPTR .MOVX @RO, A .INC DPTR INC RO CJNE RO,#64H, LOOP SJMP

用51单片机和EEPROM如何写掉电存储汇编程序
(1)51单片机只能往外部的eeprom写,要用movc指令;(2)51单片机访问外部存储器的地址线为16位,最多64kB的地址空间。假如你选了一个2kB的EEPROM,那么只需要11跟地址线,你把51的低11位地址与EEPROM相连,将第12位地址线连到EEPROM的选通线。在这个例子里,2048~4096的地址空间即对应你的EEPROM,随便...

福田区14794298441: 用51单片机编程:电子时钟(设计电子时钟,用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 ...

福田区14794298441: 单片机电子钟程序 -
繁饱因特: 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...

福田区14794298441: 基于51单片机设计一个多功能电子时钟,以及相关功能的扩展.系统由按键、发光二极管、数码管或LCD显示屏幕 -
繁饱因特: 用一个51和一片DS12887就可以了,这个时钟是并口的,而且自带电池,比较方便,其他的串口时钟相对麻烦一点.资料上网找找有很多,汇编和C都有,硬件连接也有的是.至于按键功能,自己动手写写看,对于这个单一功能很简单.想学好单片机的话就得多动手啊,每次完成一个东西的时候都会有所收获的.希望对你有帮助.

福田区14794298441: 51单片机电子时钟设计
繁饱因特: 可以只用一个按键:长按3s选择调整时、分,短按进行加调整、再长按5s清零

福田区14794298441: 51单片机制作简易电子钟,求电路图和程序,要求6位显示,24小时制 -
繁饱因特:#include "reg51.h" #define uint unsigned int #define uchar unsigned char unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar sec,min,hour; bit secup=00; uchar n=0; void delay(unsigned int ms) { unsigned int i=...

福田区14794298441: 51单片机编程制作电子钟时间问题.后两位数码管显示到59后,直接跳到变为只有第一位数码管显示0.感觉整个人都不好了,下面是代码::#include "reg52.... -
繁饱因特:[答案] uchar sec=0,min=0,tnum;把它放到主函数里面看看,并且tnum=0

福田区14794298441: 如何利用51单片机实现一个计时器? -
繁饱因特: 方法一:用定时器中断计时模式循环计时.方法二:用CPU消耗时钟周期指令计时(浪费资源).思路:用定时器中断计时,溢出时形成中断信号,标识为一个基本周期t,所定时间T/t=n为周期循环数,到时形成定时触发信号.

福田区14794298441: 用51单片机实现时钟功能程序??? -
繁饱因特: #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一个52标准内核的头文件uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code ...

福田区14794298441: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. -
繁饱因特: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.

福田区14794298441: 以51单片机为核心器件,组成一个电子时钟系统. -
繁饱因特: 调用定时器中断,发出一个频率1s的脉冲,用这个来计数.加上几个按键,按键接收到一个电平信号这个数也+1.满60清零,分钟那个数+1,分钟满60清零,小时加1.在循环中不停的和你设定的定时时间做对比,一旦相同就启动蜂鸣器提醒.

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