标题: 51单片机汇编程序时钟 供电后,程序似乎卡住,求解 [打印本页]
作者: dvga 时间: 2018-1-6 18:42
标题: 51单片机汇编程序时钟 供电后,程序似乎卡住,求解
P1口段选,P2口位选,P3.0-3.3调秒分时。供电后,程序似乎卡住,求解
- ORG 00H JMP MAIN
- ORG 0BH
- JMP TIM0
- MAIN:
- MOV IE,#82H ;使能定时器中断
- MOV TMOD,#01H ;设置计数初始值,设置为4ms中断一次
- MOV TH0,#0F0H
- MOV TL0,#60H
- MOV R0,#00H ;1秒钟计数器,250次后为1s
- MOV 30H,#00H ;秒分时初始值00
- MOV 31H,#00H
- MOV 32H,#00H
- MOV R1,#00H ;位选累计器
- SETB TR0
- LOOP: ;按键设置时分秒,循环扫描按键,否则执行中断程序
- JB P3.0,NOPRESS2
- CALL FILTER
- MOV A,30H
- ADD A,#01H
- DA A
- MOV 30H,A
- CJNE A,#60H,NOPRESS1;等于60则清零
- MOV 30H,#00H
- NOPRESS1:
- JNB P3.0,$
- CALL FILTER
- NOPRESS2:
- JB P3.1,NOPRESS4
- CALL FILTER
- MOV A,31H
- ADD A,#01H
- DA A
- MOV 31H,A
- CJNE A,#60H,NOPRESS3;等于60则清零
- MOV 31H,#00H
- NOPRESS3:
- JNB P3.1,$
- CALL FILTER
- NOPRESS4:
- JB P3.2,LOOP
- CALL FILTER
- MOV A,32H
- ADD A,#01H
- DA A
- MOV 32H,A
- CJNE A,#24H,NOPRESS5;等于24则清零
- MOV 32H,#00H
- NOPRESS5:
- JNB P3.2,$
- CALL FILTER
- JMP LOOP
- TIM0:
- PUSH ACC
- CJNE R0,#250,SCAN ;等于250时说明到1秒,未满则继续扫描显示
- MOV A,#30H
- ADD A,#01H
- DA A
- MOV 30H,A
- CJNE A,#60H,INCSEC ;等于60时说明到一分
- MOV A,31H
- ADD A,#01H
- DA A
- MOV 31H,A
- CJNE A,#60H,INCMIN ;等于60时说明到一小时
- MOV A,32H
- ADD A,#01H
- DA A
- MOV 32H,A
- CJNE A,#24H,INCHR ;等于24说明到一天,清零时分秒寄存器
- MOV 30H,#00H
- MOV 31H,#00H
- MOV 32H,#00H
- INCSEC:
- JMP INCTIM
- INCMIN:
- MOV 30H,#00H ;满60秒,清零秒存储器
- JMP INCTIM
- INCHR:
- MOV 30H,#00H ;满60分,清零分寄存器,秒存储器
- MOV 31H,#00H
- INCTIM:
- MOV R0,#00H ;秒存储器清零
- SCAN:
- CJNE R1,#6,DISPLAY ;6位数码管扫描值为6,则完成一次扫描
- MOV R1,#00H ;清零扫描计数器,继续扫描
- JMP SCAN
- DISPLAY:
- CJNE R1,#0,CHK1 ;秒低位显示
- MOV A,30H
- ANL A,#0FH
- MOV P2,#0DFH
- JMP RELOAD
- CHK1:
- CJNE R1,#1,CHK2 ;秒高位显示
- MOV A,30H
- SWAP A
- ANL A,#0FH
- MOV P2,#0EFH
- JMP RELOAD
- CHK2:
- CJNE R1,#2,CHK3 ;分低位显示
- MOV A,31H
- ANL A,#0FH
- MOV P2,#0F7H
- JMP RELOAD
- CHK3:
- CJNE R1,#3,CHK4 ;分高位显示
- MOV A,31H
- SWAP A
- ANL A,#0FH
- MOV P2,#0FBH
- JMP RELOAD
- CHK4:
- CJNE R1,#4,CHK5 ;时低位显示
- MOV A,32H
- ANL A,#0FH
- MOV P2,#0FDH
- JMP RELOAD
- CHK5:
- CJNE R1,#5,RELOAD ;时高位显示
- MOV A,32H
- SWAP A
- ANL A,#0FH
- MOV P2,#0FEH
- RELOAD:
- MOV P1,A ;扫描显示
- INC R0
- INC R1
- MOV TH0,#0F0H
- MOV TL0,#60H
- POP ACC
- RETI
- FILTER:
- MOV R6,#60H
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- END
复制代码
秒分时。供电后,程序似乎卡住,求解
-
运行时的图片_1.png
(257.95 KB, 下载次数: 106)
-
数字表_1.png
(216.26 KB, 下载次数: 93)
作者: yzwzfyz 时间: 2018-1-6 20:42
1、R0何时+1?
2、如果T0中断发生在:
NOPRESS4:
JB P3.2,LOOP
CALL FILTER
MOV A,32H
ADD A,#01H...........发生在这里
中断返回后:
DA A
MOV 32H,A
这时的 DA A之后能保证正确码?
3、当秒会不会=60H、61H、62H呢?
作者: yzwzfyz 时间: 2018-1-6 20:45
写程序,先画个框图,框图走通了再写程序。
这么点逻辑关系都搞不定,复杂一些怎么办?学会画框图很重要!.
作者: yzwzfyz 时间: 2018-1-6 20:46
以分为例:
何时清0?何时+1?
作者: zl2168 时间: 2018-1-6 21:18
本帖最后由 zl2168 于 2018-1-6 21:28 编辑
实例93 具有校正功能的时钟1302(LED数码管显示)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学,可从零基础c语言开始学习。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: zl2168 时间: 2018-1-6 21:30
本帖最后由 zl2168 于 2018-1-6 21:32 编辑
实例94 模拟电子钟(由80C51定时器产生秒时基)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学,可从零基础c语言开始学习。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: dvga 时间: 2018-1-7 11:54
1,R0是每4毫秒加1,也就是每中断1次就加一,
2,执行中断时,我将累加器的值压入了堆栈,中断结束POP ACC,弹栈
3,秒不会等于大于60H,CJNE A,60H,INC MIN此时MOV 30H,00对秒请0了
作者: dvga 时间: 2018-1-7 11:56
老师,我是初学,受教了
作者: yzwzfyz 时间: 2018-1-7 12:50
看来你还不糊糊。
把你回答的,补写到中断服务程序中去。
另外DA A是依据PSW中的半进和进位标记进行调整的,你没有保护PSW!!!
我回你的三点在中断务程序中没有看到。
这与你是不是初学无关,能理解、逻辑清楚就好。初学不可以作借口,态度要正确。
作者: dvga 时间: 2018-1-7 13:14
保护程序标志位?什么意思啊,我回答的都是中断程序中有的啊,搞不清楚了。。。。无知确实不是借口,但我真不清楚
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |