求基于ds1302芯片和51单片机的电子时钟的汇编程序

作者&投稿:夹妮 (若有异议请与网页底部的电邮联系)
求51单片机基于DS1302电子钟设计。能帮我的请先联系我的QQ。比有重谢。我的QQ:8074~

空间加Q给你。

赶紧学C语言吧,比汇编好学好用多了。这年头还用汇编,太OUT了

时钟芯片DS1302汇编程序
#INCLUDE
CBLOCK 20H
SEC ;秒
MIN ;分
HOU ;小时
DATE ;日期
MON ;月
DAY ;日
YERR ;年
DDD ;写使能位
TIME_TX ;1302发送寄存器
TIME_RX ;1302接收寄存器
COUNT1 ;
COUNT2 ;
DELAY1
DELAY2
ENDC
*******************************
; ; 1302子程序说明
; ;******************************
; DS1302INI ;1302初始化,先禁止RST,设定充电方式
; SET_TIME ;一次发送7个数据设定时间,包含写使能寄存器,8个数据
; GET_TIME ;一次接收7个数据显示时间
; TIME_WRITE_1;一次写入1302一个字节
; TIME_READ_1 ;一次接收一个字节数据
; ;******* 1302定义**************
; ;******************************
#DEFINE I_O PORTC,7 ;1302I_O
#DEFINE SCLK PORTC,6 ;1302时钟
#DEFINE RST PORTA,0 ;1302使能位
#DEFINE RX_ADD 40H ;保存接受的7个数据
#DEFINE TX_ADD 20H ;开始保存7个要写入的时间数据
BANK1 MACRO
BSF STATUS,RP0
ENDM
BANK0 MACRO
BCF STATUS,RP0
ENDM
ORG 000H
NOP
GOTO MAIN
MAIN

CALL CLR_RAM 清除RAN
CALL PORT_INI 端口定义
CALL DS1302_INI
CALL SET_TIME 一次写入7个时间数据
CALL GET_TIME ; 一次读回7个时间数据
GOTO $

;; 写入秒,可以写任意的7个时间数据,单字节
MOVLW B'10000000'
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
MOVLW B'00100101'
MOVWF TIME_TX
CALL TIME_WRITE_1
BCF RST

读秒,可以读任意7个时间,单字节

MOVLW B'10000001'
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
CALL TIME_READ_1
BCF RST

GOTO $

:子程序

**************************************************
; DS1302_INI
; 作用:初始化1302,先禁止RST,允许写使能
;**************************************************
DS1302_INI
BCF SCLK
BCF RST ;先禁止
MOVLW B'10001110' ;写使能寄存器
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
MOVLW B'0' ;允许写使能
MOVWF TIME_TX
CALL TIME_WRITE_1;发送一个字节的数据
BCF RST

;设定充电方式

没有设定
RETURN

;**************************************************
; SET_TIME
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器
; 突发模式写入,必须写入8个数据,不是7个
; INPUT:要设定的8个数据已经写入到TIME_TX_ADD开始的8个字节里面
;**************************************************
SET_TIME
MOVLW B'10111110' ;标志位
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
;TIME_WRITE_8 ;发送8个数据
MOVLW TIME_TX_ADD ;发送数据的起始地址
MOVWF FSR
MOVLW D'8'
MOVWF COUNT2
TW1
MOVF INDF,W
MOVWF TIME_TX
CALL TIME_WRITE_1
INCF FSR,F
DECFSZ COUNT2,F
GOTO TW1
BCF RST
RETURN
;***********************************************
; GET_TIME
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面
;***********************************************
GET_TIME
MOVLW B'10111111'
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
;TIME_READ_7 ;接收7个数据
MOVLW TIME_RX_ADD ;保存数据的起始地址
MOVWF FSR
MOVLW D'7'
MOVWF COUNT2
TR2
CALL TIME_READ_1
MOVF TIME_RX,W
MOVWF INDF
INCF FSR,F
DECFSZ COUNT2,F
GOTO TR2
BCF RST
RETURN
;************************************************
; TIME_WRITE_1
; 作用:一次发送一个字节的数据,用于发送1302的
; 控制字或者发送一个数据
; INPUT: TIME_TX
;************************************************
TIME_WRITE_1
MOVLW D'8'
MOVWF COUNT1
TLOP
BCF I_O ;初始值是低电平
BCF SCLK
BTFSC TIME_TX,0
BSF I_O
RRF TIME_TX,F
BSF SCLK ;高电平发送数据
DECFSZ COUNT1,F
GOTO TLOP
BCF SCLK ;恢复
RETURN
;************************************************
; TIME_READ_1
; 作用:读取1302一个字节的数据
; INPUT: NONE
; OUTPUT:接收数据保存在TIME_RX里面
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的
; 的电平的高低,采取带进位和不带进位右移.
;***********************************************
TIME_READ_1
BANK1
BSF TRISC,7 ;I_O IS INPUT
BANK0
MOVLW D'8'
MOVWF COUNT1 ;读取8个字节
TR1
BCF SCLK ;下降沿读取
BCF STATUS,C
BTFSC I_O
BSF STATUS,C
RRF TIME_RX,F
BSF SCLK ;恢复高电平
DECFSZ COUNT1,F
GOTO TR1
BANK1
BCF TRISC,7 ;OUTPUT
BANK0
BCF SCLK ;恢复
RETURN
NOP

PORT_INI
BANK1
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'0'
MOVWF TRISB
MOVLW B'00000111'
MOVWF ADCON1
MOVLW B'00000000'
MOVWF TRISA
BANK0
MOVLW 18H
MOVWF 20H
MOVLW 19H
MOVWF 21H
MOVLW 05H
MOVWF 22H
MOVLW 13H
MOVWF 23H
MOVLW 14H
MOVWF 24H
MOVLW 15H
MOVWF 25H
MOVLW 16H
MOVWF 26H
RETURN
CLR_RAM
MOVLW 20H
MOVWF FSR
LOOP
CLRF INDF
INCF FSR,F
BTFSS FSR,7
GOTO LOOP ;清除32个
RETURN
END

;51单片机的,但没用ds1302 **************************************************************** *
; * 简易电子时钟 *
; * p32---时调整 *
; * p33---分调整

CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA

AN1 BIT P3.2
AN2 BIT P3.3

RSEG DATA_SEG
KEY_S: DS 1
KEY_V: DS 1
DIS_DIGIT: DS 1
SEC: DS 1
DIS_INDEX: DS 1
HOUR: DS 1
MIN: DS 1
SEC100: DS 1
DIS_BUF: DS 8

BUF_HOUR_H EQU DIS_BUF ; 小时十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小时个位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分个位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒个位

RSEG STACK_SEG
STACK: DS 20

;===============================================================================

CSEG AT 0000H
JMP MAIN

CSEG AT 0000BH
LJMP TIMER0

CSEG AT 0001BH
LJMP TIMER1

;===============================================================================

RSEG CODE_SEG
MAIN:
USING 0

MOV SP, #(STACK-1) ;

MOV P1,#0FFH
MOV P2,#0FFH
MOV TMOD,#011H ; 定时器0, 1工作模式1, 16位定时方式
MOV TH0,#0FCH
MOV TL0,#017H
MOV TH1,#0DCH
CLR A
MOV TL1,A

MOV HOUR,#12 ;
CLR A ;
MOV MIN,A
MOV SEC,A
MOV SEC100,A

MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_H,A ; 时十位
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A ; 时个位
MOV A,MIN
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 分个位
MOV A,SEC
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_SEC_H,A ; 秒十位
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_SEC_L,A ; 秒个位

MOV BUF_HOUR_H+02H,#0BFH
MOV BUF_HOUR_H+05H,#0BFH

MOV DIS_DIGIT,#0FEH
CLR A
MOV DIS_INDEX,A

MOV IE,#08AH ; 使能timer0,1 中断

SETB TR0
SETB TR1

MOV KEY_V,#03H

MAIN_LP:
LCALL SCAN_KEY ; 键扫描
JZ MAIN_LP ; 无键返回

MOV R7,#10 ; 延时10ms
LCALL DELAYMS ; 延时去抖动
LCALL SCAN_KEY ; 再次扫描
JZ MAIN_LP ; 无键返回

MOV KEY_V,KEY_S ; 保存键值
LCALL PROC_KEY ; 键处理
SJMP MAIN_LP ; 调回主循环

;===============================================================================
SCAN_KEY:
; 扫键扫描子程序
; 保存按键状态到key_s
; 返回: A --- 按键是否按下(BOOL)

CLR A

MOV C,AN1 ; 读按键AN1
MOV ACC.0,C
MOV C,AN2 ; 读按键AN2
MOV ACC.1,C

MOV KEY_S,A ; 保存按键状态到key_s
XRL A,KEY_V
RET

;===============================================================================
PROC_KEY:
; 键处理子程序
; 传入参数: KEY_V --- 按键值
; 返回值: 无

CLR EA

MOV A,KEY_V
JNB ACC.0,PROC_AN1
JNB ACC.1,PROC_AN2
SJMP END_PROC_KEY

PROC_AN1: ; 按键AN1处理
LCALL INC_HOUR ; 小时加1
SJMP END_PROC_KEY

PROC_AN2: ; 按键AN2处理
INC MIN ; 分钟加1

MOV A,MIN ;
SETB C
SUBB A,#59
JC AN2_UPDATE_MIN ; 如果分钟等于60,则分清0,小时加1

CLR A ;
MOV MIN,A

AN2_UPDATE_MIN: ; 更新分显示缓冲区
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位

MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分个位

END_PROC_KEY:
SETB EA
RET

;===============================================================================

USING 0
TIMER0:
; 定时器0中断服程序, 用于数码管的动态扫描
; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
; 选通P2.0口数码管
; DIS_BUF --- 显于缓冲区基地址

PUSH ACC
PUSH PSW
PUSH AR0

MOV TH0,#0FCH
MOV TL0,#017H

MOV P2,#0FFH ; 先关闭所有数码管

MOV A,#DIS_BUF ; 获得显示缓冲区基地址
ADD A,DIS_INDEX ; 获得偏移量
MOV R0,A ; R0 = 基地址 + 偏移量
MOV A,@R0 ; 获得显示代码
MOV P1,A ; 显示代码传送到P0口

MOV P2,DIS_DIGIT

MOV A,DIS_DIGIT ; 位选通值左移, 下次中断时选通下一位数码管
RL A
MOV DIS_DIGIT,A

INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位
ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000)时, 清0

POP AR0
POP PSW
POP ACC

RETI

;===============================================================================
USING 0
TIMER1:
; 定时器1中断服务程序, 产生时基信号10ms
;
;
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL

MOV TH1,#0DCH

INC SEC100

MOV A,SEC100
CLR C
SUBB A,#100 ; 是否中断100次(达到1s)
JC END_TIMER1 ; < 1S

MOV SEC100,#00H ; 达到1s
LCALL INC_SEC ; 秒加1

END_TIMER1:
POP DPL
POP DPH
POP B
POP ACC
POP PSW

RETI ;

;===============================================================================
INC_SEC:
INC SEC

MOV A,SEC
SETB C
SUBB A,#59 ;
JC UPDATE_SEC

CLR A
MOV SEC,A
LCALL INC_MIN

UPDATE_SEC:
MOV A,SEC
MOV B,#10
DIV AB ; A = SEC / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_SEC_H,A ;

MOV A,SEC
MOV B,#10
DIV AB
MOV A,B ; A = SEC % 10
MOVC A,@A+DPTR
MOV BUF_SEC_L,A
RET

;===============================================================================

INC_MIN:
INC MIN ; 分钟加1

MOV A,MIN ;
SETB C
SUBB A,#59
JC UPDATE_MIN ; 如果分钟等于60,则分清0,小时加1

CLR A ;
MOV MIN,A
LCALL INC_HOUR ; 小时加1

UPDATE_MIN: ; 更新分显示缓冲区
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位

MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分个位

RET

;===============================================================================

INC_HOUR:
INC HOUR ; 小时加1
MOV A,HOUR
SETB C
SUBB A,#24
JC UPDATE_HOUR ; 如果小时等于24,则小时清0

CLR A
MOV HOUR,A ; 小时清0

UPDATE_HOUR:
MOV A,HOUR
SETB C
SUBB A,#10
JC UPDATE_HOUR1 ; 如果小时小于10,则十位0不显示

MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_HOUR_H,A
SJMP UPDATE_HOUR2

UPDATE_HOUR1:
MOV BUF_HOUR_H,#0FFH

UPDATE_HOUR2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A
RET

;===============================================================================

DELAYMS:
; 延时子程序
; 传入参数:R7 --- 延时值(MS)
; 返回值:无

MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1

END_DLYMS:
RET

; END OF DELAYMS

;===============================================================================

DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH

END

不是51单片机的汇编而已,自己写吗!很容易的


我用c语言写的基于51单片机和ds1302芯片1602液晶显示的时钟程序不行...
确定LCD程序没问题的话可以考虑下这个,读不出来,看看初始化对了没,1302到单片机IO口直接加上拉电阻没有,读写时序对了没有,这些搞定了一般就没问题了。

ds1302时钟芯片怎么连单片机
ds1302时钟芯片采用I2C总线和单片机连接,如果 单 片机没有I2C总线接口,可以用普通IO口模拟

有关DS1302时钟芯片怎么让1302中的寄存器与单片机联系起来?怎么让130...
自己调试一下 include <msp430x20x3.h> define DS1302_DIR P1DIR define DS1302_IN P1IN define DS1302_OUT P1OUT define DS1302_RST BIT1 define DS1302_SCLK BIT3 define DS1302_SDI BIT2 \/\/定义MSP320的端口 define DS1302_RST_LO DS1302_OUT &= ~DS1302_RST define DS...

ds1302时钟芯片。。。谁给我看下这个程序?液晶可以显示,但是时钟不会...
1、存储和读取的时间的内容应为BCD码。write_1302(0x8c,0x11);maioh=(miao&0x7f)>>4;……2、建议上电后,ce=0;clk=0;延时一会儿再操作1302。或者多写两次撤销写保护命令。write_1302(0x8e,0x10);笔误,应该是 write_1302(0x8e,0x80);3、建议读写1302的clk速率降低,如datasheet,2MHz...

我用DS1302时钟芯片用51单片机怎么时间越走越快应该怎样调整谢谢各位大 ...
DS1302时钟的快慢与外接的晶振频率有关,如果越走越快的话,可能是输入的频率发生了变化。

...为什么还需要采用DS1302来定时呢,DS1302的优点是什么呢?
单片机的定时器用的是它自己的晶振,不是专门用来做电子钟的,因其精度不高,而且操作麻烦!而且更正一点,DS1302不是用来定时的,它是一种时钟芯片,内部有专用的寄存器用于存年月日时分秒,用的晶振也是另接的,高精度。当秒改变到一定量是,分会自动加一,写程序比较简单,而单片机要写程序让它加一...

为什么有内部时钟的情况下,还要加外加时钟芯片DS1302?
1.因为内部时钟是掉电停止工作的,外加DS1302+电解电容或充电纽扣电池,可以长期保持其工作,因为它功耗很低,在系统掉电时可以保证系统在一定时间内(几天用胆电容,电池几个月)正常计时。2.另外,它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。可以方便的实现系统...

DS1302时钟芯片能实现毫秒级吗
不能,DS1302最小单位是秒,没有毫秒寄存器,要毫秒的话,得用带RTC功能的MCU,内部可以分频得到毫秒,时间也很准确

ds1302怎么接单片机
DS1302芯片与51单片机的连接 DS1302电路图 X1、X2:32.768KHz晶振接入引脚。(15分频1HZ——1S定时,时钟通用晶振)GND:接地。RET :复位引脚,低电平有效,操作时高电平。I\/O:数据输入\/输出引脚,具有三态功能。SCLK:串行时钟输入引脚。Vcc1:工作电源引脚。Vcc2:备用电源引脚。

有关ds1302时钟芯片
可加可不加,如果晶振准的话可以不加;但如果晶振不准的话,就加上,通常是几p到几十p,电容是用来调时间精度的。通常,在仿真电路的时候可以不用加补偿电容。

集宁区13657534361: 51单片机和ds1302时钟芯片的问题 -
采乖补中: 这个简单啊,DS1302不是有31字节的RAM吗?你选择任意一个或几个空闲的字节单元,在初始设置时间的程序里加个判断,如果RAM中的内容与你预设的特定标识内容相同,就直接退出不要设置时间,否则才进入设置时间程序.在设置时间程...

集宁区13657534361: 基于单片机51系列及DS1302时钟芯片数字电子钟的制作.求电路总原理图、PCB图、程序以及元件清单. -
采乖补中: 这是1602电路,和时钟电路.元件基本差不多.电路如图 #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit ds1302_RST =P2^0; sbit ds1302_IO =P2^1; sbit ds1302_SCLK=P2^2; sbit ACC0=ACC^0; sbit ACC7=...

集宁区13657534361: 求一用51(盛群单片机更好)和ds1302设计的时钟程序并用LED显示出来,还要有闹钟功能 -
采乖补中: 这是我以前写的一段程序,希望对你能有帮助我的程序,首先有一点,肯定是调试通过的,不像我以前找的一些网络程序,貌似可以,就是不能执行结果./*DS1302时钟芯片显示设置 功能:显示 时间 日期 星期 引脚说明:DS1302三引脚 ...

集宁区13657534361: 关于DS1302和51单片机的详细问题 -
采乖补中: 1:都接5V就行了.与单片机的IO口接上拉10K就行.2:IO不够用锁存器或138译码器或串转并芯片或用8255扩展.

集宁区13657534361: 求DS1302+AT89S51单片机时钟C程序(六位共阳数码管显示)
采乖补中://DS1302时钟芯片程序 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit CLK=P2^3; //定义口 sbit IO=P2^4; sbit RST=P2^5; sbit ACC7=ACC^7; sbit ACC0=ACC^0; uchar a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82...

集宁区13657534361: 电路板上DS1302时钟模块怎么与51单片机最小系统相?电路板上
采乖补中: SCLK 接 SCLK DATA 接 I/O CE 接 RST 如果要按照DS1302的引脚命名,单片机的DATA可以改成I/O,CE可以改成RST,这样程序看起来就更直观一些.

集宁区13657534361: 求高手给我写一个单片机(80c51)加的是DS1302S芯片的时钟程序!
采乖补中: //********DS1302读写程序************ void w(uchar u) //写入1位字节 { uchar i; ACC = u; for(i=8; i>0; i--) { IO = ACC0; CLK = 1; CLK = 0; ACC = ACC >> 1; } } uchar r(void) //读出1位字节 { uchar i; for(i=8; i>0; i--) { ACC =ACC>>1; ACC7 = IO; CLK = 1; ...

集宁区13657534361: 用51和DS1302设计时钟电路,都需要什么元器件??谢谢. -
采乖补中: 除了51单片机(stc,就不需外围器件了)和ds1302,还需要32.768kz时钟晶体,22pF电容,10k电阻,5V电源(稳压源)基本就可以了,要显示要有数码管,或者液晶也可以.

集宁区13657534361: DS1302和51单片机的智能数字电子钟
采乖补中: 如果是在设置某一个值的时候比另外的值要亮,这个可能由程序不太好实现,要配以外部的电路芯片,比如南京沁恒的产品. 你也还可以改为设置某个值时某个数就闪烁,这样就比较简单了. 配上一块纽扣电池,时钟就不会停了

集宁区13657534361: 跪求基于DS1302 芯片的单片机c51电子时钟代码.单片机型号是8用8位数码管显示,具有闹钟功能 -
采乖补中: #include <reg51.h> typedef unsigned int uint; typedef unsigned char uchar; sbit DS1302_SDA=P1^0; sbit DS1302_SCK=P1^1; sbit DS1302_RST=P1^2; sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit BEEP=P3^7; ...

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