单片机数字钟
那位有51单片机的数字钟课程设计可以给我发一份么?其他的就不说了,只要是单片机数字钟就行,起码可以参考参考~谢谢rodin870316@163.com...
那位有51单片机的数字钟课程设计可以给我发一份么?其他的就不说了,只要是单片机数字钟就行,起码可以参考参考~谢谢
rodin870316@163.com 展开
rodin870316@163.com 展开
2个回答
展开全部
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP_BUFF DATA 30H ;显示缓冲区(请保留6个连续的RAM单元)
SLA_W DATA 3AH ;器件从地址,PCF8563P从地址写操作为0A2H
SLA_R DATA 3BH ;器件从地址,PCF8563P从地址读操作为0A3H
SUBA DATA 3CH ;器件子地址,器件子地址秒单元操作为02H
NUMBYTE DATA 3DH ;读/写的字节数
KEY_DATA DATA 3EH
MTD DATA 40H ;发送数据缓冲区首址 (缓冲区40H46H)
MRD DATA 47H ;接收数据缓冲区首址 (缓冲区47H4DH)
SEC DATA 50H ;秒 (子地址02H)
MIN DATA 51H ;分 (子地址03H)
HOUR DATA 52H ;时 (子地址04H)
DAY DATA 53H ;日 (子地址05H)
WEEK DATA 54H ;星期 (子地址06H)
MOON DATA 55H ;月 (子地址07H)
YEAS DATA 56H ;年 (子地址08H)
;;;;;;;;;;;;;;;;;;;;初始化程序;;;;;;;;;;;;;;;;;;;;;;;;;
START:
MOV R0,#10 ;清空RAM数据存储区
MOV A,#0 ;地址为10H到0FFH
NEXT: ;
MOV @R0,A ;
INC R0 ;
CJNE R0,#0FFH,NEXT ;
MOV R0,#00H
MOV P0,#0FFH ;初始化P0口为高
MOV P1,#0FFH ;初始化P1口为高
MOV P2,#0FFH ;初始化P2口为高
MOV P3,#0FFH ;初始化P3口为高
MOV SP,#60H ;设定堆栈栈低为61H
CLR OE_595
MOV DISP_BUFF,#6
MOV DISP_BUFF+1,#5
MOV DISP_BUFF+2,#4
MOV DISP_BUFF+3,#3
MOV DISP_BUFF+4,#2
MOV DISP_BUFF+5,#1
MOV MTD,#08H
MOV MTD+1,#00H
MOV NUMBYTE,#02H
MOV SUBA,#00H
LCALL IWRNBYTE
MOV MTD,#00H
MOV MTD+1,#02H
MOV MTD+2,#18H
MOV MTD+3,#26H
MOV MTD+4,#05H
MOV MTD+5,#12H
MOV MTD+6,#08H
MOV SLA_W,#0A2H
MOV SLA_R,#0A3H
MOV SUBA,#02H
LCALL DISP
MOV NUMBYTE,#07H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向器件指定子地址读取N个数据
;入口参数: 器件从地址SLA,器件子地址SUBA,接收字节数NUMBYTE
;出口参数: 接收数据缓冲区MTD
;占用A R0 R1 R2 CY
IRDNBYTE:
MOV R2,NUMBYTE ;接收字节数送入工作寄存器
LCALL STAR ;启动IIC总线
MOV A,SLA_W ;器件写操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,RETRDN ;没有应答跳转退出
MOV A,SUBA ;器件子地址送入累加器A
LCALL WRBYTE ;发送器件子地址
LCALL CACK ;检查是否有应答
JNB ACK,RETRDN ;没有应答跳转退出
LCALL STAR ;有应答重新起动总线
MOV A,SLA_R ;器件读操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,IRDNBYTE ;没有应答跳转退出
MOV R1,#MRD ;载入接收数据缓冲区首址
RDN1:
LCALL RDBYTE ;读操作开始
MOV @R1,A ;接收的数据载入接收缓冲区
LCALL MACK ;发送应答信号
INC R1 ;接收缓冲区地址加1
DJNZ R2,RDN1 ;数据全部读取完了吗?没完转移读取下一位
LCALL MNACK ;读取完了,最后一字节发非应答位
RETRDN:
LCALL STOP ;读取完成,结束总线
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
RDBYTE:
MOV R0,#08H ;每字节读取8位
RLP:
SETB SDA ;置高数据线
NOP
NOP
SETB SCL ;时钟线为高接收数据位
NOP
NOP
NOP
NOP
NOP
MOV C,SDA ;读取数据位(从D7位开始读取一直到D0位)
CLR SCL ;将SCL拉低时间大于4.7us
RLC A ;进行数据位的处理
NOP
NOP
DJNZ R0,RLP ;未够8位再来一次
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向器件指定子地址写N个数据
;入口参数: 器件从地址SLA器件子地址SUBA 发送数据缓冲区MTD发送字节数NUMBYTE
; 占用 A R0 R1 R2 CY
IWRNBYTE:
MOV R2,NUMBYTE ;接收字节数送入工作寄存器
LCALL STAR ;起动总线
MOV A,SLA_W ;器件写操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,RETWRN ;无应答则转移退出
MOV A,SUBA ;器件子地址送入累加器A
LCALL WRBYTE ;发送器件子地址
LCALL CACK ;检查是否有应答
JNB ACK,RETWRN ;无应答则转移退出
MOV R1,#MTD ;有应答载入写入数据缓冲区首址
WRDA:
MOV A,@R1 ;写入数据缓冲区数据送入累加器A
LCALL WRBYTE ;开始写入数据
LCALL CACK ;检查是否有应答
JNB ACK,IWRNBYTE ;无应答则转移退出
INC R1 ;有应答写入数据缓冲区地址加1
DJNZ R2,WRDA ;数据全部写入完了吗?没完转移写入下一位
LCALL MNACK ;写入完了,最后一字节发非应答位
RETWRN:
LCALL STOP ;写入完成,结束总线
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序取应答位
WRBYTE:
MOV R0,#08H ;每字节写入8位
WLP:
RLC A ;进行数据位的处理
MOV SDA,C ;写入数据位(从D7位开始写入一直到D0位)
NOP
NOP
SETB SCL ;时钟线为高时写入数据位
NOP
NOP
NOP
NOP
NOP
CLR SCL ;将SCL拉低时间大于4.7us
NOP
NOP
NOP
NOP
NOP
DJNZ R0,WLP ;未够8位再来一次
NOP
RET
;;;;;;;;;;;;;;;;;;;;启动I2C总线子程序;;;;;;;;;;;;;;;;;;;;;
;;在时钟线为高电平时,数据线从高向低切换,这个情况表示起始条件
STAR:
SETB SDA
NOP
SETB SCL ;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA ;起始条件锁定时大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线准备发数据
NOP
RET
;;;;;;;;;;;;;;;;;;;;结束总线子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;在时钟线为高电平时,数据线从低向高切换,这个情况表示停止条件
STOP:
CLR SDA
NOP
SETB SCL ;发送结束条件的时钟信号
NOP ;结束总线时间大于4.7us
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
NOP ;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;发送应答信号;;;;;;;;;;;;;;;;
MACK:
CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP ;保持数据时间即SCL为高时间大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;发送非应答信号;;;;;;;;;;;;;;;
MNACK:
SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
NOP
NOP ;保持数据时间即SCL为高时间大于4.7us
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;检查应答位子程序,返回值ACK=1时表示有应答;;;;;;;;;;;;;;;;;;;;;;;;;;
CACK:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR ACK ;无应答,应答标志位置0
MOV C,SDA ;串行数据读入CY
JC CEND ;CY=1无应答转移
SETB ACK ;CY为0,有应答,应答标志位置1
CEND:
CLR SCL
NOP
NOP
RET
DISP_BUFF DATA 30H ;显示缓冲区(请保留6个连续的RAM单元)
SLA_W DATA 3AH ;器件从地址,PCF8563P从地址写操作为0A2H
SLA_R DATA 3BH ;器件从地址,PCF8563P从地址读操作为0A3H
SUBA DATA 3CH ;器件子地址,器件子地址秒单元操作为02H
NUMBYTE DATA 3DH ;读/写的字节数
KEY_DATA DATA 3EH
MTD DATA 40H ;发送数据缓冲区首址 (缓冲区40H46H)
MRD DATA 47H ;接收数据缓冲区首址 (缓冲区47H4DH)
SEC DATA 50H ;秒 (子地址02H)
MIN DATA 51H ;分 (子地址03H)
HOUR DATA 52H ;时 (子地址04H)
DAY DATA 53H ;日 (子地址05H)
WEEK DATA 54H ;星期 (子地址06H)
MOON DATA 55H ;月 (子地址07H)
YEAS DATA 56H ;年 (子地址08H)
;;;;;;;;;;;;;;;;;;;;初始化程序;;;;;;;;;;;;;;;;;;;;;;;;;
START:
MOV R0,#10 ;清空RAM数据存储区
MOV A,#0 ;地址为10H到0FFH
NEXT: ;
MOV @R0,A ;
INC R0 ;
CJNE R0,#0FFH,NEXT ;
MOV R0,#00H
MOV P0,#0FFH ;初始化P0口为高
MOV P1,#0FFH ;初始化P1口为高
MOV P2,#0FFH ;初始化P2口为高
MOV P3,#0FFH ;初始化P3口为高
MOV SP,#60H ;设定堆栈栈低为61H
CLR OE_595
MOV DISP_BUFF,#6
MOV DISP_BUFF+1,#5
MOV DISP_BUFF+2,#4
MOV DISP_BUFF+3,#3
MOV DISP_BUFF+4,#2
MOV DISP_BUFF+5,#1
MOV MTD,#08H
MOV MTD+1,#00H
MOV NUMBYTE,#02H
MOV SUBA,#00H
LCALL IWRNBYTE
MOV MTD,#00H
MOV MTD+1,#02H
MOV MTD+2,#18H
MOV MTD+3,#26H
MOV MTD+4,#05H
MOV MTD+5,#12H
MOV MTD+6,#08H
MOV SLA_W,#0A2H
MOV SLA_R,#0A3H
MOV SUBA,#02H
LCALL DISP
MOV NUMBYTE,#07H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向器件指定子地址读取N个数据
;入口参数: 器件从地址SLA,器件子地址SUBA,接收字节数NUMBYTE
;出口参数: 接收数据缓冲区MTD
;占用A R0 R1 R2 CY
IRDNBYTE:
MOV R2,NUMBYTE ;接收字节数送入工作寄存器
LCALL STAR ;启动IIC总线
MOV A,SLA_W ;器件写操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,RETRDN ;没有应答跳转退出
MOV A,SUBA ;器件子地址送入累加器A
LCALL WRBYTE ;发送器件子地址
LCALL CACK ;检查是否有应答
JNB ACK,RETRDN ;没有应答跳转退出
LCALL STAR ;有应答重新起动总线
MOV A,SLA_R ;器件读操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,IRDNBYTE ;没有应答跳转退出
MOV R1,#MRD ;载入接收数据缓冲区首址
RDN1:
LCALL RDBYTE ;读操作开始
MOV @R1,A ;接收的数据载入接收缓冲区
LCALL MACK ;发送应答信号
INC R1 ;接收缓冲区地址加1
DJNZ R2,RDN1 ;数据全部读取完了吗?没完转移读取下一位
LCALL MNACK ;读取完了,最后一字节发非应答位
RETRDN:
LCALL STOP ;读取完成,结束总线
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
RDBYTE:
MOV R0,#08H ;每字节读取8位
RLP:
SETB SDA ;置高数据线
NOP
NOP
SETB SCL ;时钟线为高接收数据位
NOP
NOP
NOP
NOP
NOP
MOV C,SDA ;读取数据位(从D7位开始读取一直到D0位)
CLR SCL ;将SCL拉低时间大于4.7us
RLC A ;进行数据位的处理
NOP
NOP
DJNZ R0,RLP ;未够8位再来一次
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向器件指定子地址写N个数据
;入口参数: 器件从地址SLA器件子地址SUBA 发送数据缓冲区MTD发送字节数NUMBYTE
; 占用 A R0 R1 R2 CY
IWRNBYTE:
MOV R2,NUMBYTE ;接收字节数送入工作寄存器
LCALL STAR ;起动总线
MOV A,SLA_W ;器件写操作从地址送入累加器A
LCALL WRBYTE ;发送器件从地址
LCALL CACK ;检查是否有应答
JNB ACK,RETWRN ;无应答则转移退出
MOV A,SUBA ;器件子地址送入累加器A
LCALL WRBYTE ;发送器件子地址
LCALL CACK ;检查是否有应答
JNB ACK,RETWRN ;无应答则转移退出
MOV R1,#MTD ;有应答载入写入数据缓冲区首址
WRDA:
MOV A,@R1 ;写入数据缓冲区数据送入累加器A
LCALL WRBYTE ;开始写入数据
LCALL CACK ;检查是否有应答
JNB ACK,IWRNBYTE ;无应答则转移退出
INC R1 ;有应答写入数据缓冲区地址加1
DJNZ R2,WRDA ;数据全部写入完了吗?没完转移写入下一位
LCALL MNACK ;写入完了,最后一字节发非应答位
RETWRN:
LCALL STOP ;写入完成,结束总线
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序取应答位
WRBYTE:
MOV R0,#08H ;每字节写入8位
WLP:
RLC A ;进行数据位的处理
MOV SDA,C ;写入数据位(从D7位开始写入一直到D0位)
NOP
NOP
SETB SCL ;时钟线为高时写入数据位
NOP
NOP
NOP
NOP
NOP
CLR SCL ;将SCL拉低时间大于4.7us
NOP
NOP
NOP
NOP
NOP
DJNZ R0,WLP ;未够8位再来一次
NOP
RET
;;;;;;;;;;;;;;;;;;;;启动I2C总线子程序;;;;;;;;;;;;;;;;;;;;;
;;在时钟线为高电平时,数据线从高向低切换,这个情况表示起始条件
STAR:
SETB SDA
NOP
SETB SCL ;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA ;起始条件锁定时大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线准备发数据
NOP
RET
;;;;;;;;;;;;;;;;;;;;结束总线子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;在时钟线为高电平时,数据线从低向高切换,这个情况表示停止条件
STOP:
CLR SDA
NOP
SETB SCL ;发送结束条件的时钟信号
NOP ;结束总线时间大于4.7us
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
NOP ;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;发送应答信号;;;;;;;;;;;;;;;;
MACK:
CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP ;保持数据时间即SCL为高时间大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;发送非应答信号;;;;;;;;;;;;;;;
MNACK:
SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
NOP
NOP ;保持数据时间即SCL为高时间大于4.7us
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;;;;;;;;;;;;;;;;;;;;检查应答位子程序,返回值ACK=1时表示有应答;;;;;;;;;;;;;;;;;;;;;;;;;;
CACK:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR ACK ;无应答,应答标志位置0
MOV C,SDA ;串行数据读入CY
JC CEND ;CY=1无应答转移
SETB ACK ;CY为0,有应答,应答标志位置1
CEND:
CLR SCL
NOP
NOP
RET
深圳市兴威帆电子技术有限公司
2023-06-12 广告
2023-06-12 广告
同步时钟芯片有很多品牌,其中优秀的品牌包括好亦佳、美世达、康巴丝、北极星、噜噜家纺、丽盛、歌佩蕾、POWER、爱时达和麦丁。这些品牌的产品性能稳定可靠,广泛应用于各种计时器、钟表、智能家居等领域。建议在选择同步时钟芯片时,需要考虑以下因素:...
点击进入详情页
本回答由深圳市兴威帆电子技术有限公司提供
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询