这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » ylzhjy的进程

共19条 2/2 1 2 跳转至
工程师
2011-12-09 11:11:27     打赏
11楼
发图

院士
2011-12-09 11:20:52     打赏
12楼
怎么可能?

工程师
2011-12-11 10:31:02     打赏
13楼

时钟程序先送上,该日在上图
//寄存器宏定义
WRITE_SECOND EQU 80H
WRITE_MINUITE EQU 82H
WRITE_HOUR  EQU 84H
READ_SECOND  EQU 81H
READ_MINUITE EQU 83H
READ_HOUR  EQU 85H
WRITE_PROTECT EQU 8EH
READ_PROTECT EQU 8FH

//位寻址寄存器定义
//管脚定义
SCLK  BIT P3.6
IO_DATA  BIT P3.4
RST   BIT P3.5

BitCnt  EQU 30H         //数据位计数器
ByteCnt  EQU 31H         //数据字节计数器
Command  EQU 32h        // 命令字节地址
RcvDat  EQU 40H        // 接收数据缓冲区
XmtDat  EQU 50H        // 发送数据缓冲区
ORG  0000H
LJMP 0030H
ORG  0030H
Initial:
MOV  Command,#0BFH//命令字节为BFh,多数据传输模式
MOV  ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV  R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV  A,#60H
SUBB A,RcvDat
JNC  Initial0
MOV  RcvDat,#00H
Initial0:
MOV  A,#60H
SUBB A,RcvDat+1
JNC  Initial1
MOV  RcvDat,#00H
Initial1:
MOV  A,#24H
SUBB A,RcvDat+2
JNC  Initial2
MOV  RcvDat,#00H
Initial2:

//允许数据写入
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//允许数据读出
MOV  Command,#READ_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV  Command,#WRITE_SECOND
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV  Command,#WRITE_MINUITE
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV  Command,#WRITE_HOUR
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV        Command,#80h
MOV        ByteCnt,#1//单字节传送模式
MOV        R0,#XmtDat//数据地址覆给R0
MOV        XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL     Send_Byte//调用写入数据子程序

Set_Time:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T0
ajmp Read_time
Set_T0:
acall Delay_Short
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T1
ajmp Read_time
Set_T1:
cjne a,#0feh,Set_M0
mov a,RcvDat+2
add a,#1
da a
cjne a,#24h,Set_H0
mov a,#00H
Set_H0:
mov RcvDat+2,a
ajmp Set_H1
Set_M0:
cjne a,#0fdh,Read_time
mov a,RcvDat+1
add a,#1
da a
cjne a,#60h,Set_M1
mov a,#00h
Set_M1:
mov RcvDat+1,a
Set_H1:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_H1

//允许数据写入
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序

//允许数据读出
MOV  Command,#READ_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV  Command,#WRITE_SECOND
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV  Command,#WRITE_MINUITE
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV  Command,#WRITE_HOUR
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV        Command,#80h
MOV        ByteCnt,#1//单字节传送模式
MOV        R0,#XmtDat//数据地址覆给R0
MOV        XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL     Send_Byte//调用写入数据子程序


//读取时分秒数据
Read_Time:
MOV  Command,#0BFH//命令字节为BFh,多数据传输模式
MOV  ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV  R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV  DPTR,#LEDTAB

MOV  R1,#RcvDat//数据地址覆给R1
MOV  ByteCnt,#3//循环3次
MOV  R2,#7//选择数码
LOOP0:
MOV  P2,R2//把数码选择数据送到P2
MOV  A,#0FH
ANL  A,@R1//和时间数据作与操作,取出低四位数据
MOVC A,@A+DPTR//查表获得数码管显示数据
MOV  P0,A
ACALL Delay_Short
DEC  R2
MOV  P2,R2
MOV  A,#0F0H
ANL  A,@R1//和时间数据作与操作,取出高四位数据
SWAP A//高四位和低四位互换
MOVC A,@A+DPTR
MOV  P0,A
ACALL Delay_Short
//显示时、分、秒间的短横
CJNE R2,#0,LOOP1
AJMP LOOP2
LOOP1:
DEC  R2
MOV  P2,R2
MOV  P0,#40H
DEC  R2
INC  R1
LOOP2:
ACALL Delay_Short
DJNZ ByteCnt,LOOP0
AJMP Set_Time 

Send_Byte:
CLR  RST//复位引脚为低电平所有数据传送终止复位引脚为低电平所有数据传送终止
NOP
CLR  SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
NOP
MOV  A,Command
MOV  BitCnt,#08h//传送数位为8

S_Byte0://发送命令
RRC  A//将最低位传送给进位位C
MOV  IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR  SCLK//清时钟总线
DJNZ BitCnt,S_Byte0//位传送未完毕则继续
NOP

S_Byte1:
MOV  A,@R0
MOV  BitCnt,#08h
S_Byte2:
RRC  A
MOV  IO_DATA,C
NOP
SETB SCLK
NOP
CLR  SCLK
DJNZ BitCnt,S_Byte2
INC  R0//发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1//字节传送未完毕则继续
NOP     
CLR  RST//逻辑操作完毕清RST
RET

Receive_Byte:
CLR  RST //复位引脚为低电平所有数据传送终止
NOP
CLR  SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
MOV  A,Command//准备发送命令字节
MOV  BitCnt,#08h//传送位数为8

R_Byte0:
RRC  A//将最低位传送给进位位C
MOV  IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR  SCLK// 清时钟总线
DJNZ BitCnt,R_Byte0//位传送未完毕则继续
NOP          

R_Byte1://准备接收数据
CLR  A //清类加器
CLR  C//清进位位C
MOV  BitCnt,#08h//接收位数为8
NOP
R_Byte2:
MOV  C,IO_DATA //数据总线上的数据传送给C
RRC  A//从最低位接收数据
SETB SCLK//时钟总线置高
NOP
CLR  SCLK //时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2//位接收未完毕则继续
MOV  @R1,A//接收到的完整数据字节放入接收内存缓冲区
INC  R1//接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1//字节接收未完毕则继续
NOP
CLR  RST//逻辑操作完毕清RST
RET

Delay_Short:
mov r6,#0f0h
dys0:
djnz r6,dys0
ret

LEDTAB:
db  3fh,06h,5bh,4fh,66h
db  6dh,7dh,07h,7fh,67h
END


助工
2011-12-11 10:42:05     打赏
14楼
不是吧!??

工程师
2011-12-11 12:17:10     打赏
15楼
附图

工程师
2011-12-11 12:20:01     打赏
16楼

工程师
2011-12-11 16:55:15     打赏
17楼

工程师
2011-12-11 16:55:37     打赏
18楼
为啥无法发flash

工程师
2011-12-11 20:06:27     打赏
19楼

时间显示程序再次更新,对老程序优化,并添加了可以调节秒的功能,大家多多支持
//寄存器宏定义
WRITE_SECOND EQU 80H
WRITE_MINUITE EQU 82H
WRITE_HOUR  EQU 84H
READ_SECOND  EQU 81H
READ_MINUITE EQU 83H
READ_HOUR  EQU 85H
WRITE_PROTECT EQU 8EH
READ_PROTECT EQU 8FH

//位寻址寄存器定义
//管脚定义
SCLK  BIT P3.6
IO_DATA  BIT P3.4
RST   BIT P3.5

BitCnt  EQU 30H         //数据位计数器
ByteCnt  EQU 31H         //数据字节计数器
Command  EQU 32h        // 命令字节地址
RcvDat  EQU 40H        // 接收数据缓冲区
XmtDat  EQU 50H        // 发送数据缓冲区
ORG  0000H
LJMP 0030H
ORG  0030H
Initial:
MOV  Command,#0BFH//命令字节为BFh,多数据传输模式
MOV  ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV  R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV  A,#60H
SUBB A,RcvDat
JNC  Initial0
MOV  RcvDat,#00H
Initial0:
MOV  A,#60H
SUBB A,RcvDat+1
JNC  Initial1
MOV  RcvDat,#00H
Initial1:
MOV  A,#24H
SUBB A,RcvDat+2
JNC  Write_Time
MOV  RcvDat,#00H
AJMP Write_Time

//设定时间,可以设定时,分,秒
Set_Time:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T0
ajmp Read_time
Set_T0:
acall Delay_Short
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_H0
ajmp Read_time
Set_H0:
cjne a,#0feh,Set_M0
mov a,RcvDat+2
add a,#1
da a
cjne a,#24h,Set_H1
mov a,#00H
Set_H1:
mov RcvDat+2,a
ajmp Set_T1
Set_M0:
cjne a,#0fdh,Set_S0
mov a,RcvDat+1
add a,#1
da a
cjne a,#60h,Set_M1
mov a,#00h
Set_M1:
mov RcvDat+1,a
ajmp Set_T1
Set_S0:
cjne a,#0fbh,Read_Time
mov a,RcvDat
add a,#1
da a
cjne a,#60h,Set_S1
mov a,#00h
Set_S1:
mov RcvDat,a
Set_T1:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T1

Write_Time:
//允许数据写入
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序

//允许数据读出
MOV  Command,#READ_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址赋给R0
MOV  XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV  Command,#WRITE_SECOND
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV  Command,#WRITE_MINUITE
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV  Command,#WRITE_HOUR
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV  Command,#WRITE_PROTECT
MOV  ByteCnt,#1//单字节传送模式
MOV  R0,#XmtDat//数据地址覆给R0
MOV  XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV        Command,#80h
MOV        ByteCnt,#1//单字节传送模式
MOV        R0,#XmtDat//数据地址覆给R0
MOV        XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL     Send_Byte//调用写入数据子程序


//读取时分秒数据
Read_Time:
MOV  Command,#0BFH//命令字节为BFh,多数据传输模式
MOV  ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV  R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV  DPTR,#LEDTAB

MOV  R1,#RcvDat//数据地址覆给R1
MOV  ByteCnt,#3//循环3次
MOV  R2,#7//选择数码
LOOP0:
MOV  P2,R2//把数码选择数据送到P2
MOV  A,#0FH
ANL  A,@R1//和时间数据作与操作,取出低四位数据
MOVC A,@A+DPTR//查表获得数码管显示数据
MOV  P0,A
ACALL Delay_Short
DEC  R2
MOV  P2,R2
MOV  A,#0F0H
ANL  A,@R1//和时间数据作与操作,取出高四位数据
SWAP A//高四位和低四位互换
MOVC A,@A+DPTR
MOV  P0,A
ACALL Delay_Short
//显示时、分、秒间的短横
CJNE R2,#0,LOOP1
AJMP LOOP2
LOOP1:
DEC  R2
MOV  P2,R2
MOV  P0,#40H
DEC  R2
INC  R1
LOOP2:
ACALL Delay_Short
DJNZ ByteCnt,LOOP0
AJMP Set_Time 

Send_Byte:
CLR  RST//复位引脚为低电平所有数据传送终止复位引脚为低电平所有数据传送终止
NOP
CLR  SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
NOP
MOV  A,Command
MOV  BitCnt,#08h//传送数位为8

S_Byte0://发送命令
RRC  A//将最低位传送给进位位C
MOV  IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR  SCLK//清时钟总线
DJNZ BitCnt,S_Byte0//位传送未完毕则继续
NOP

S_Byte1:
MOV  A,@R0
MOV  BitCnt,#08h
S_Byte2:
RRC  A
MOV  IO_DATA,C
NOP
SETB SCLK
NOP
CLR  SCLK
DJNZ BitCnt,S_Byte2
INC  R0//发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1//字节传送未完毕则继续
NOP     
CLR  RST//逻辑操作完毕清RST
RET

Receive_Byte:
CLR  RST //复位引脚为低电平所有数据传送终止
NOP
CLR  SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
MOV  A,Command//准备发送命令字节
MOV  BitCnt,#08h//传送位数为8

R_Byte0:
RRC  A//将最低位传送给进位位C
MOV  IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR  SCLK// 清时钟总线
DJNZ BitCnt,R_Byte0//位传送未完毕则继续
NOP          

R_Byte1://准备接收数据
CLR  A //清类加器
CLR  C//清进位位C
MOV  BitCnt,#08h//接收位数为8
NOP
R_Byte2:
MOV  C,IO_DATA //数据总线上的数据传送给C
RRC  A//从最低位接收数据
SETB SCLK//时钟总线置高
NOP
CLR  SCLK //时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2//位接收未完毕则继续
MOV  @R1,A//接收到的完整数据字节放入接收内存缓冲区
INC  R1//接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1//字节接收未完毕则继续
NOP
CLR  RST//逻辑操作完毕清RST
RET

Delay_Short:
mov r6,#0f0h
dys0:
djnz r6,dys0
ret

LEDTAB:
db  3fh,06h,5bh,4fh,66h
db  6dh,7dh,07h,7fh,67h
END


共19条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]