单片机学习资料,如何设置一个闹钟
1. 能显示时时-分分-秒秒;
2. 能够设定定时时间、修改定时时间;
3. 定时时间到能发出报警声。
PPT内容预览:
单片机汇编语言源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP TIME
- ORG 0100H
- MAIN:
- MOV SP,#50H
- MOV 20H,#00H //暂存秒、分、时数字
- MOV 21H,#00H
- MOV 22H,#00H
- MOV 23H,#01H
- MOV 24H,#01H
- MOV 25H,#00H
- MOV 30H,#00H //以下至35H 为当前显示秒钟分钟时钟
- MOV 31H,#00H
- MOV 32H,#00H
- MOV 33H,#00H
- MOV 34H,#00H
- MOV 35H,#00H
- MOV 36H,#01H //以下至39H 为设定的分钟时钟时间
- MOV 37H,#00H
- MOV 38H,#01H
- MOV 39H,#00H
- MOV TMOD,#01H //16位计数器
- MOV TH0,#3CH //计数初值=15536 定时50000微秒=0.05秒
- MOV TL0,#0B0H
- MOV IE,#87H
- SETB TR0 //启动计数 定时0.5秒后中断跳转 TIME
- MOV R2,#14H //20
- MOV P2,#0FFH //P2口写一
- LOOP:
- LCALL TIMEPRO //看当前是否到达设定时间
- LCALL DISPLAY1
- JB P1.1,M1 //设定时间按钮是否按下,未被按下查询下一个键
- MOV R1, #23H //存储按下状态
- LCALL SETTIME //跳转至设定当前时间程序
- LJMP LOOP
- M1:
- JB P1.2,M2//确认是否进入设定定时时间,未被按下查询下一个键
- MOV R1,#24H //存储按下状态
- LCALL SETATIME //跳转至设定定时时间程序
- LJMP LOOP
- M2:
- JB P1.5,M4 //确认是否返回 未被按下跳转M4返回
- M4:
- LJMP LOOP //功能键全都未被按下 返回loop继续查询
- DELAY: MOV R4,#030H //延时
- DL00:MOV R5,#0FFH
- DL11:MOV R6,#9H
- DL12:
- DJNZ R6,DL12
- DJNZ R5,DL11
- DJNZ R4,DL00
- RET
- SETTIME:
- L0:LCALL DISPLAY1 //显示当前时间
- MM1:
- JB P1.3,L1 //查看小时+1按钮是否按下 未按下查询下一个键
- MOV C,P1.3
- JC MM1 //防抖动
- LCALL DELAY1 //延时
- JC MM1 //cy=1跳转 P1.2没被按下跳转
- MSTOP1: //确认p1.3按键松开,按一次键只执行一次
- MOV C,P1.3
- JNC MSTOP1 //未松开按键则死循环 松开跳出
- LCALL DELAY1
- MOV C,P1.3
- JNC MSTOP1//防抖动
- CJNE R1,#23H,NEXT //区分设定当前时间状态与设定定时状态
- L3:
- INC 22H //小时+1
- MOV A,22H //A =1
- CJNE A,#18H,GO12 //A不等于18H(24)则跳转(防溢出)
- MOV 22H,#00H //清零(24H清零)
- MOV 34H,#00H
- MOV 35H,#00H
- LJMP L0 //显示当前时间
- NEXT: LJMP L4
- L1:
- JB P1.4,L2 //查询分钟+1按钮是否按下,未按下查询下一个键
- MOV C,P1.4
- JC L1 // 防抖动
- LCALL DELAY1
- JC L1// 直到P1.4按下跳出死循环
- MSTOP2: //确认P1.4松开,按一次键只执行一次加一程序
- MOV C,P1.4 //读取目前按键状态
- JNC MSTOP2 //P1.4未松开进入死循环,松开后跳出
- LCALL DELAY1
- MOV C,P1.4
- JNC MSTOP2//
- CJNE R1,#23H,NEXT1 //判断是否在设定当前时间状态下
- L5:
- INC 21H //分钟+1
- MOV A,21H
- CJNE A,#3CH,GO11 //分钟不等于60跳转,防溢出
- MOV 21H,#00H //分钟到达60复位清零
- MOV 32H,#00H
- MOV 33H,#00H
- LJMP L0 //显示当前时间
- NEXT2:CJNE R1,#24H,L0
- LJMP SETATIME
- L2:
- JB P1.5,NEXT2 //查看P1.5是否按下
- MOV C,P1.5
- JC L2 //再次查询
- LCALL DELAY1
- MOV C,P1.5
- JC L2// 防抖动 直到P1.4按下跳出循环
- STOP1: //确认P1.5松开
- MOV C,P1.5
- JNC STOP1// P1.5按下跳转 直到松开
- LCALL DELAY1
- MOV C,P1.5//防抖动
- JNC STOP1
- MOV R1,#00H //清零按键状态存储
- LJMP LOOP//返回
- NEXT1: LJMP L6
- GO11: //分钟显示预备程序
- MOV B,#0AH //B=10
- DIV AB
- MOV 32H,B //放余数 分钟第二位
- MOV 33H,A //放商 分钟第一位
- LJMP L0 //显示
- GO12: //小时显示预备程序
- MOV B,#0AH //B=10
- DIV AB
- MOV 34H,B //余数 小时数第二位
- MOV 35H,A //商 小时数第一位
- LJMP L0 //显示
- SETATIME:LCALL DISPLAY2 //显示设定时间
- N0:LCALL DISPLAY2 //同上
- LJMP MM1 //查询按键状态
- L4:
- INC 24H //小时+1
- MOV A,24H //
- CJNE A,#24,GO22 //如果A不等于24 跳转GO22防溢出
- MOV 24H,#00H //A=24 小时溢出 复位
- MOV 38H,#00H
- MOV 39H,#00H
- LJMP N0 //跳转显示
- L6:
- INC 23H //分钟+1
- MOV A,23H
- CJNE A,#60,GO21 //不等于60跳转,防溢出
- MOV 23H,#00H //复位
- MOV 36H,#00H
- MOV 37H,#00H
- LJMP N0 //跳转显示
- GO21: //分钟显示预备程序
- MOV B,#0AH //B=10
- DIV AB //
- MOV 36H,B // 设定的分钟第二位
- MOV 37H,A // 设定的分钟第一位
- LJMP N0 //跳转显示
- GO22: //小时显示预备程序
- MOV B,#0AH
- DIV AB
- MOV 38H,B //设定的小时第二位
- MOV 39H,A //设定的小时第一位
- LJMP N0 //跳转显示
- TIMEPRO: //判断是否到达当前设定时间
- MOV A,21H
- MOV B,23H
- CJNE A,B,BK // 查询分钟是否相等 A B不相等跳转至BK
- MOV A,22H
- MOV B,24H
- CJNE A,B,BK //小时不相等 跳转至BK
- SETB 25H.0
- MOV C,25H.0
- JC XX //跳转至XX 时分相等 到达设定时间
- XX:
- LCALL TIMEOUT //跳转闹铃程序
- BK:
- RET
- TIMEOUT:
- X1:
- LCALL BZ // 跳转喇叭程序
- LCALL DISPLAY2 //显示设定时间
- CLR 25H.0 //复位
- JB P1.5,X1 //查询P1.5状态 按下跳转
- LCALL DELAY
- MOV 23H,#00H
- MOV 24H,#00H
- CLR 25H.0
- LJMP LOOP //显示当前时间
- BZ:
- CLR P3.7 // 喇叭程序 清零P3.7
- MOV R7,#10 //延时
- T2:
- MOV R6,#64H
- T3:
- DJNZ R6,T3
- DJNZ R7,T2
- SETB P3.7 //延时一段时间后取反
- RET //返回X1
- DELAY1:MOV R4,#14H //防抖动专用延时
- DL001:MOV R5,#0FFH
- DL111:DJNZ R5,DL111
- DJNZ R4,DL001
- RET
- TIME: //时间运行程序,定时器定时0.05秒后产生中断
- PUSH ACC
- PUSH PSW //现场保护
- MOV TH0,#3CH
- MOV TL0,#0B0H //重装初值
- DJNZ R2,RET0 //R2减一不为0跳转至RET0 R2=20 循环20次后以后已定时1秒
- MOV R2,#14H //重装循环值
- MOV A,20H //秒钟存储单元
- CLR C //清零CY
- INC A //秒钟自动加一
- CJNE A,#3CH,GO1 //秒钟A不等于60 跳转GO1 防溢出
- MOV 20H,#0 //复位
- MOV 30H,#0
- MOV 31H,#0
- MOV A,21H //当前时间分钟存储单元
- INC A //定时60秒后分钟+1
- CJNE A,#3CH,GO2 //分钟A不等于60跳转
- MOV 21H,#0H //复位
- MOV 32H,#0
- MOV 33H,#0
- MOV A,22H //设定小时时间(当前)
- INC A //定时60min后小时自动加一
- CJNE A,#18H,GO3 //小时A不等于24跳转
- MOV 22H,#00H //复位
- MOV 34H,#0
- MOV 35H,#0
- AJMP RET0 //出栈返回
- GO1: //GO123均为显示预备程序
- MOV 20H,A //当前秒钟
- MOV B,#0AH
- DIV AB
- MOV 31H,A //秒钟第一位
- MOV 30H,B //秒钟第二位
- AJMP RET0
- GO2:
- MOV 21H,A //当前分钟
- MOV B,#0AH
- DIV AB
- MOV 33H,A //分钟第一位
- MOV 32H,B //分钟第二位
- AJMP RET0
- GO3:
- MOV 22H,A //当前小时
- MOV B,#0AH
- DIV AB
- MOV 35H,A //小时第一位
- MOV 34H,B //小时第二位
- AJMP RET0
- RET0:
- POP PSW //出栈
- POP ACC
- RETI //中断返回
- DISPLAY1: //显示当前时间
- MOV R0,#30H //
- MOV R3,#0FEH //数码管选择码
- MOV A,R3 //
- PLAY1:
- MOV P2,A //数码管选通 写P2
- MOV A,@R0 //秒钟第二位存储单元
- MOV DPTR,#DSEG1 //表首地址送DPTR
- MOVC A,@A+DPTR //查表=查对应数字的数码管显示码送对应选通数码管
- MOV P0,A //输出显示
- LCALL DL1 //延时
- MOV P2,#0FFH //读P2先写一
- MOV A,R3
- RL A //向左循环选择数码管
- JNB ACC.6,LD1 //循环6次 跳转至LD1返回
- INC R0 //30——35以此为秒分时的二位、一位、轮流显示
- MOV R3,A
- LJMP PLAY1
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
仿真ppt程序.7z
(7.65 MB, 下载次数: 105)
|