- [583553088] 汇编和C写51单片机程序有什么区别? 04/08 22:01
- [游客] 博主主动性,值得学习! 06/23 16:43
- [q470393267] 我是在武汉上学,电脑城就有卖的呢~ 06/08 20:00
- [pmsheep82] 请问零件一般在哪能买到? 06/08 19:58
- [q470393267] 说起自己买零件焊接就烦,这东西我们学校就是让我们自己设计原理图然后买元件焊接的,那么多的线焊那么辛苦 06/08 19:13
- [游客] 哇塞!! 我们这学电子的也是自己买零件焊接的,锻炼动手能力的同时让自己也别浪费材料,自己买的用心。 06/08 11:20
- [q470393267] 这个和上次的性质差别很大的~ 呵呵算是个日历系统~ 之前发的那个没有和时钟芯片(DS1302)联用所 06/07 10:09
- [whos] 还在搞啊,嘿嘿…… 06/06 23:27
- [游客] 学习 06/05 23:22
- [q470393267] 是的啊~ 我C又不行哦! 05/25 19:06
- [whos] 最近有啥成果没有?也不见你 我准备下学期买块板子,搞单片机 07/21 11:35
- [whos] 我来看看了 06/22 09:39
- [fangyugirl] 你咋不上MSN呢? 05/25 08:29
- [游客] 我是fangyugirl,我装的虚拟机和虚拟软驱,但是用不了,我装的虚拟机,我在里面写code的时候 05/24 11:20
- [whos] 留个言,走人 嘎嘎…… 05/22 16:51
- [fangyugirl] 你没有上线,如果你看不到我,或者是没反应,你可以先退出MSN,然后在登录。 05/18 15:28
- [fangyugirl] 好了好了,不过你不在线 05/18 15:17
- [fangyugirl] 你再加我:fangyugirl@hotmail.com 05/18 15:10
- [fangyugirl] 我加了,你要接受哟。 05/18 15:09
- [fangyugirl] 呵呵,谢谢呀,到时候有MSN的人可以同时一起在线讨论问题了。 05/18 14:54
[2009-06-06 12:46] 单片机课程设计(基于DS1302的51单片机数字时钟与日历系统)
1),主界面显示日期和时间,具有调整时间信息和闹钟功能,时间信息在断电后能继续在DS1302芯片中内部供电运行,显示部分在LCD1602上面显示,另外还带有DS18B20温度检测芯片,也在LCD1602上显示实时温度(精确到1度)代码标注我不想写了哦~,这点我还蛮水,叫不会讲道理啊谁让咱高中语文学那么那么水呢~ 这也是我自《汇编语言》课设2后最长的程序,虽然啰里巴嗦的还是挺满意的就是那X86让人郁闷呢~
代码如下:
RS EQU P1.5 ;确定具体硬件的连接方式
RW EQU P1.6 ;确定具体硬件的连接方式
E EQU P1.7 ;LCD1602引脚
SCLK EQU P3.4 ;DS1302引脚
IO EQU P3.3
RST EQU P3.5
DQ EQU P1.4 ;DS18B20引脚
TEMPER_L EQU 61H ;用于保存读出温度的低8位
TEMPER_H EQU 60H ;用于保存读出温度的高8位
FLAG1 EQU 3FH ;是否检测到DS18B20标志位
A_BIT1 EQU 3DH ;数码管十位数存放内存位置
B_BIT1 EQU 3EH ;数码管个位数存放内存位置
ORG 0H
AJMP MAIN
ORG 0BH
AJMP JST0
ORG 1BH
AJMP TIM0
;准备部分代码
MAIN: MOV TMOD,#11h
SETB ET0
SETB ET1
SETB EA ;开定时器1,定时器0和中断总控
MOV R0,#20H
D: MOV @R0,#20H
INC R0
CJNE R0,#3fH,D
MOV R0,#33H
D0: MOV @R0,#3AH ;':'
INC R0
INC R0
INC R0
CJNE R0,#39H,D0
ACALL D1
MOV R0,#49H
MOV R1,#0
MOV DPTR,#TAB1
NAO: MOV A,R1
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
CJNE R1,#8,NAO
MOV R1,#4AH
MOV R7,#52H
ACALL ASCB
MOV R1,#4DH
MOV R7,#51H
ACALL ASCB
MOV P0,#1H ;清屏并光标复位
ACALL ENABLE ;调用写入命令子程序
MOV P0,#38H ;设置显示模式:8位2行5X7点阵
ACALL ENABLE ;调用写入命令子程序
MOV P0,#6H ;文字不动,光标自动右移
ACALL ENABLE ;调用写入命令子程序
ACALL SZXS1
MOV P0,#0CFH ;自建字型
MOV A,#0
LCALL WRITE2
mov P0,#40h
Acall enable
mov dptr,#tab2
Acall writestring2
;主程序代码
D3: ACALL XSSJ
ACALL ANJ
CJNE A,#0E7H,D4
ACALL SZSJ
SJMP D3
D4: CJNE A,#0D7H,D5
ACALL SZNZ
SJMP D3
D5: CJNE A,#0B7H,D3
MOV A,21H
CJNE A,#0EFH,D6
MOV 21H,#20H
SJMP D3
D6: MOV 21H,#0EFH
SJMP D3
XSSJ: MOV P0,#0CH ;显示器开、光标关
ACALL ENABLE ;调用写入命令子程序
SJ: MOV R0,#25H
MOV A,#8DH ;年份
ACALL DS1302
ACALL BCD
INC R0
MOV R1,#89H ;月份和日期
SJ1: MOV A,R1
ACALL DS1302
ACALL BCD
INC R0
DEC R1
DEC R1
CJNE R1,#85H,SJ1
MOV A,#8BH ;星期
ACALL DS1302
ACALL BCD
MOV 2EH,#57H
INC R0
MOV R1,#85H ;时分秒
SJ2: MOV A,R1
ACALL DS1302
ACALL BCD
INC R0
DEC R1
DEC R1
CJNE R1,#7FH,SJ2
MOV R0,#20H
ACALL SZXS
RET
DS1302:ACALL WRITE
ACALL READ
CLR RST
RET
D1: MOV R0,#23H
MOV @R0,#32H
INC R0
MOV @R0,#30H ;年份高两位为20
MOV R0,#27H
D2: MOV @R0,#0B0H
INC R0
INC R0
INC R0
CJNE R0,#2DH,D2 ;内存20H-3EH单元存放显示时间界面部分信息
RET
;BCD码转换为ASCII码
BCD: MOV B,#10H
DIV AB
ADD A,#30H
MOV @R0,A
INC R0
MOV A,B
ADD A,#30H
MOV @R0,A
INC R0
RET
ASC: INC @R1
MOV A,@R1
DEC R1
CJNE A,#3AH,ASC1
ASC1: JC ASC2
INC R1
MOV @R1,#30H
DEC R1
INC @R1
ASC2: MOV A,@R1
CJNE A,#3AH,ASC3
ASC3: JC ASC4
MOV @R1,#30H
ASC4: INC R1
ASCB: DEC R1
MOV A,@R1
ANL A,#0FH
MOV B,#10H
MUL AB
MOV B,A
INC R1
MOV A,@R1
ANL A,#0FH
ADD A,B
MOV B,R7
MOV R0,B
MOV @R0,A
RET
SJBZ: CJNE R5,#86H,BZ0
MOV A,45H
CJNE A,#2,BZX
MOV A,44H
CJNE A,#29H,BZX
MOV 44H,#28H
MOV 2CH,#38H
MOV 2BH,#32H
SJMP BZX
BZ0: CJNE R5,#89H,BZ1
CJNE @R0,#2,YF1
ACALL NIAN
CJNE A,#0,YF1
MOV A,44H
CJNE A,#29H,YF
SJMP BZR
YF: JC BZR
MOV 44H,#29H
MOV 2CH,#39H
MOV 2BH,#32H
SJMP BZR
YF1: CJNE @R0,#13H,YF2
YF2: JNC BZ
MOV A,45H
MOV DPTR,#TAB
MOVC A,@A+DPTR
CJNE A,44H,YF3
YF3: JNC BZR
MOV 44H,A
MOV B,#10H
DIV AB
ADD A,#30H
MOV 2BH,A
MOV A,B
ADD A,#30H
MOV 2CH,A
SJMP BZR
BZ: JC BZR
ACALL ZIBZ
BZX: SJMP BZR
BZZ: JC BZR
ACALL ZIBZ1
SJMP BZR
BZW: JNC BZR
ACALL ZIBZ
SJMP BZR
BZ1: CJNE R5,#8cH,BZ2
MOV A,45H
CJNE A,#2,RQ1
ACALL NIAN
CJNE A,#0,RQ1
CJNE @R0,#29H,BZ
SJMP BZR
RQ1: MOV A,45H
MOV DPTR,#TAB
MOVC A,@A+DPTR
CJNE A,44H,BZW
SJMP BZR
BZ2: CJNE R5,#8FH,BZ3
MOV 2EH,#57H
CJNE @R0,#7H,BZ
SJMP BZR
BZ3: CJNE R5,#0c2H,BZ4
CJNE @R0,#23H,BZZ
SJMP BZR
BZ4: CJNE R5,#0C5H,BZR
CJNE @R0,#59H,BZZ
BZR: RET
NIAN: MOV A,46H
MOV B,#10H
DIV AB
MOV R2,B
MOV B,#10
MUL AB
ADD A,R2
MOV B,#4
DIV AB
MOV A,B
RET
ZIBZ: MOV @R0,#1
MOV @R1,#31H
DEC R1
MOV @R1,#30H
INC R1
MOV 2EH,#57H
RET
ZIBZ1: MOV @R0,#0
MOV @R1,#30H
DEC R1
MOV @R1,#30H
INC R1
RET
;按键处理
ANJ: SETB RS1
LCALL GET_TEMPER
LCALL TEMPCOV ;处理温度
CLR RS1
MOV P2,#0F7H
MOV A,21H
CJNE A,#0EFH,AJ1
MOV A,#85H
ACALL DS1302
CJNE A,52H,AJ1
MOV A,#83H
ACALL DS1302
CJNE A,51H,AJ1
MOV A,#81H
ACALL DS1302
CJNE A,#0,AJ1
ACALL LIN
SJMP AJR
AJ1: MOV P2,#0F7H
MOV A,P2
ANL A,#0F0H
CJNE A,#0F0H,AJ
SJMP AJR
AJ: ACALL DAY ;按键延时0.1s
MOV A,P2
MOV R4,#200
AJR: RET
TEMP0: INC A
AJMP TEMP1
TEMPCOV:MOV A,TEMPER_L ;数据处理子程序TEMPCOV
MOV B,#16
DIV AB
JB B.3,TEMP0
TEMP1: MOV 62H,A ;将TEMPER_L的高四位右移四位,存入62H中(温度值)
MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,62H ;62H中存入温度值的整数部分
MOV B,#10
DIV AB
PUSH ACC
MOV A,B
ADD A,#30H
MOV B_BIT1,A ;个位存入3EH中
POP ACC
MOV B,#10
DIV AB
MOV A,B
ADD A,#30H
MOV A_BIT1,A ;十位存入3DH中
EXIT7: RET
INIT_1820: ;这是DS18B20复位初始化子程序
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
SJMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
SJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
SJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB DQ
RET
;-------------------------------------------------
GET_TEMPER: ;读出转换后的温度值
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
MOV R1,#4 ;等待AD转换结束,750微秒
TSS3:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSS3
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820: MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;设置时间界面
SZSJ: MOV TH0,#3CH
MOV TL0,#0B0H ;定时50ms
SETB TR0 ;开定时器0
MOV R0,#37H
MOV @R0,#30H
INC R0
MOV @R0,#30H
MOV R7,#46H
MOV R1,#26H
SZB: ACALL ASCB
INC R1
INC R1
INC R1
DEC R7
CJNE R1,#38H,SZB
MOV R0,#20H
ACALL SZXS
MOV R5,#86H
MOV R1,#26H
MOV R7,#46H
SZS1: ACALL ANJ
CJNE A,#0E7H,SZS5
INC R5
INC R5
INC R5
DEC R7
CJNE R5,#92H,SZS2
MOV R5,#0C2H
SZS2: CJNE R5,#0C8H,SZS3
MOV R7,#46H
MOV R5,#86H
SZS3: MOV A,R5
CLR C
SUBB A,#60H
CJNE A,#60H,SW
SW: JC SW1
SUBB A,#30H
SW1: MOV R1,A
SJMP SZS9
SZS5: CJNE A,#0D7H,SZS6
ACALL ASC
ACALL SJBZ
MOV R0,#20H
ACALL SZXS
SJMP SZS9
SZS6: CJNE A,#0B7H,SZS7
SJMP SZSR
SZS7: CJNE A,#77H,SZS9
MOV R1,#43H
SZS8: MOV A,@R1
INC R1
XCH A,@R1
DEC R1
MOV @R1,A
INC R1
CJNE R1,#45H,SZS8
MOV R0,#8CH
MOV R1,#46H
RW_: MOV A,R0
ACALL WRITE
MOV A,@R1
ACALL WRITE
CLR RST
DEC R1
DEC R0
DEC R0
CJNE R1,#3FH,RW_
SJMP SZSR
SZS9: MOV P0,#0EH ;显示器开、光标开
ACALL ENABLE ;调用写入命令子程序
MOV P0,R5 ;定光标
ACALL ENABLE ;调用写入命令子程序
CJNE R4,#0,SZS1
SZSR: CLR TR0
RET
;设置闹钟
SZNZ: MOV TH0,#3CH
MOV TL0,#0B0H ;定时50ms
SETB TR0 ;开定时器0
MOV R0,#22H
NZ: MOV @R0,#20H
INC R0
CJNE R0,#39H,NZ
MOV R0,#31H
MOV R1,#49H
NZ0: MOV A,@R1
MOV @R0,A
INC R0
INC R1
CJNE R1,#51H,NZ0
MOV R0,#20H
ACALL SZXS1
MOV R5,#0C2H
MOV R1,#32H
MOV R7,#48H
NZ1: ACALL ANJ
CJNE A,#0E7H,NZ3
INC R5
INC R5
INC R5
DEC R6
CJNE R5,#0C8H,NZ2
MOV R5,#0C2H
MOV R7,#48H
NZ2: MOV A,R5
CLR C
SUBB A,#90H
MOV R1,A
SJMP NZ9
NZ3: CJNE A,#0D7H,NZ4
ACALL ASC
ACALL BZ3
MOV R0,#20H
ACALL SZXS1
SJMP NZ9
NZ4: CJNE A,#0B7H,NZ5
SJMP NZR
NZ5: CJNE A,#077H,NZ9
MOV R0,#31H
MOV R1,#49H
NZ6: MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R1,#51H,NZ6
MOV R1,#4AH
MOV R7,#52H
ACALL ASCB
MOV R1,#4DH
MOV R7,#51H
ACALL ASCB
MOV 21H,#0EFH
SJMP NZR
NZ9: MOV P0,#0EH ;显示器开、光标开
ACALL ENABLE ;调用写入命令子程序
MOV P0,R5 ;定光标
ACALL ENABLE ;调用写入命令子程序
CJNE R4,#0,NZ1
NZR: ACALL D1
CLR TR0
RET
SZXS: MOV 27H,#0B0H
SZXS1:MOV P0,#0CH ;显示器开、光标关
ACALL ENABLE ;调用写入命令子程序
MOV P0,#80H ;写入显示起始地址(第一行第一个位置)
ACALL ENABLE ;调用写入命令子程序
MOV R6,#16
ACALL WRITE1
MOV P0,#0C0H
ACALL ENABLE ;调用写入命令子程序
MOV R6,#15
ACALL WRITE1
RET
;DS1302部分
WRITE: MOV R2,#8
CLR C
CLR SCLK
NOP
SETB RST
NOP
LOOP1: RRC A
MOV IO,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ R2,LOOP1
RET
READ: MOV R2,#8
LOOP2: NOP
CLR SCLK
NOP
MOV C,IO
NOP
RRC A
SETB SCLK
DJNZ R2,LOOP2
RET
;LCD1602部分
ENABLE: CLR RS ;写入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
WRITE1:MOV A,@R0
LCALL WRITE2 ;调用写入数据寄存器子程序
INC R0 ;取码指针加1
DJNZ R6,WRITE1
RET
WRITE2: MOV P0,A
SETB RS ;RS=1
CLR RW ;RW=0准备写入数据
CLR E ;E=0执行显示命令
ACALL DELAY ;判断液晶模块是否忙?(用延时代替)
SETB E ;E=1
RET
writestring2:
mov R7,#00h
c1: mov a,R7
movc a,@a+dptr
Acall WRITE2
inc R7
call delay
cjne R7,#8,c1
ret
DELAY: MOV R2,#2FH
DL1: MOV R3,#0FH
DJNZ R3,$
DJNZ R2,DL1
RET
DAY: MOV R2,#100 ;按键延时0.1s
DL3: MOV R3,#250
DL2: NOP
NOP
DJNZ R3,DL2
DJNZ R2,DL3
RET
;定时器0中断处理
JST0: CJNE R4,#0,JS1
SJMP JS2
JS1: DEC R4
JS2: MOV TH0,#3CH
MOV TL0,#0B0H
RETI
lin: setb et1
mov 53h,#8
lin0:MOV 54h,#00
NEXT:MOV A,54h
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
JZ END0
MOV 55h,A
ANL A,#0FH
MOV 58h,A
MOV A,55h
SWAP A
ANL A,#0FH
JNZ SING
CLR TR1
sJMP lD1
SING:DEC A
MOV 56h,A
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV TH1,A
MOV 57H,A
MOV A,56h
RL A
INC A
MOVC A,@A+DPTR
MOV TL1,A
MOV 55H,A
SETB TR1
lD1: ACALL DAY2
INC 54h
sJMP NEXT
END0:CLR TR1
dec 53h
mov r3,53h
cjne r3,#0,lin0
END1:CLR TR1
CLR et1
ret
DAY2: MOV 59h,#2
DL5: ACALL XSSJ
JNB P2.6,DL6 ;扫描4号键按下则闹钟停止
dec 59h
mov r3,59h
cjne r3,#0,DL5
dec 58h
mov r3,58h
cjne r3,#0,DAY2
RET
DL6: POP DPH
POP DPL
MOV DPTR,#END1
PUSH DPL
PUSH DPH
RET
;闹钟发声部分
TIM0:PUSH ACC
PUSH PSW
MOV TL1,55h
MOV TH1,57h
CPL P3.2
POP PSW
POP ACC
RETI
TABLE1: DW 64260,64400,64524,64580,64684,64777,64820,64898
DW 64968,65030,65058,65110,65157,65178,65217 ;音律表
TABLE2: DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04,0 ;发声部分的延时时间
TAB: DB 0,31H,28H,31H,30H,31H,30H,31H,31H,30H
DB 0,1,2,3,4,5,31H,30H,31H ;非闰年下的不同月份下日期的最大值
TAB1: DB 30H,38H,3AH,30H,30H,3AH,30H,30H ;闹钟的初始值
TAB2: db 18h,1bh,05h,04h,04h,05h,03h,00h
[ whos 发表于 2009-06-06 23:27 ]
还在搞啊,嘿嘿……
[ q470393267 发表于 2009-06-07 10:09 ]
这个和上次的性质差别很大的~ 呵呵算是个日历系统~ 之前发的那个没有和时钟芯片(DS1302)联用所以不具备掉电保存时间功能,哎和你说我们还得自己买所有的器件手工焊接,还不知道焊好后能实现功能不啊~不过所有的功能我都在51开发板上面验证过了,就我们老师非得让我们自己动手做苦力~
[ 游客 发表于 2009-06-08 11:20 ]
哇塞!!
我们这学电子的也是自己买零件焊接的,锻炼动手能力的同时让自己也别浪费材料,自己买的用心。呵呵
[ q470393267 发表于 2009-06-08 19:13 ]
说起自己买零件焊接就烦,这东西我们学校就是让我们自己设计原理图然后买元件焊接的,那么多的线焊那么辛苦结果把程序烧进去什么反应都没有,还是买的开发板好用点,别人的PCB那么方便学校非得让我们受这苦~
[ pmsheep82 发表于 2009-06-08 19:58 ]
请问零件一般在哪能买到?
[ q470393267 发表于 2009-06-08 20:00 ]
我是在武汉上学,电脑城就有卖的呢~