您现在所在的是:

单片机论坛

回帖:10个,阅读:4539 [上一页] [1] [2] [下一页]
902
kukuaman
文章数:2
年度积分:50
历史总积分:902
注册时间:2005/3/23
发站内信
发表于:2005/3/24 11:51:00
#0楼
无线电   2003  11期中介绍的制作方法  
其代码如下:
主程序(MAIN),如下:
  ORG 0000H

      AJMP MAIN

       ORG 000BH

      AJMP TIME

      ORG 0300H
MAIN: MOV 20H,#00H ;计时的0.1秒、秒、时和分单元清0

MOV 21H,#00H

MOV 22H,#00H

MOV 23H,#00H

MOV IP,#02H ;IP,IE初始化

MOV IE,#82H
MOV TMOD,#01H ;定时器的初始化

MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0 ;启动定时器工作
MOV SP,#40H ;堆栈指针设为40H
NEXT: LCALL DISP ;调用显示子程序
LCALL KEY ;调按键判断子程序
JZ NEXT ;无键按下转NEXT
LCALL ANKEY ;有键按下转按键处理子程序
SJMP NEXT ;按键处理完转NEXT
NOP
NOP
NOP
定时中断处理程序:
TIME: PUSH ACC ;现场保护
PUSH PSW
MOV TL0,#0B4H ;重置初值
MOV TH0,#3CH
INC 20H ;计时处理
MOV A,20H
CJNE A,#0AH,RETI1      ;这里应该是秒的个位不超过9
MOV 20H,#00H
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETI1       ;这里应该是秒的十位吧,他怎么写60H.应该是6h吧. MOV 21H,#00H
MOV A,22H
ADD A,#01H
DA A
MOV 22H,#00H
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1         ;这里他怎么把时的个位和十位连起来一起考虑了?? MOV 23H,#00H
RETI1: POP PSW ;恢复现场
POP ACC
RETI ;中断返回
NOP
NOP
显示子程序
DISP: ANL 2FH,#10H ;拆字,注意小数点的显示
MOV A,21H
ANL A,#0FH
ORL A,2FH
MOV 2FH,A
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A
ANL 2DH,#10H
MOV A,22H
ANL A,#0FH
ORL A,2DH
MOV 2DH,A
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A
ANL 2BH,#10H
MOV A,23H
ANL A,#0FH
ORL A,2BH
MOV 2BH,A
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A
MOV R0,#2FH
MOV R3,#06H
MOV DPTR,#TABLE
MOV A,#01H
LOOP1: MOV B,A ;送位控制字与段控制字
MOV P2,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV R2,#80H ;延时
DJNZ R2,$
DEC R0
MOV A,B
RL A
DJNZ R3,LOOP1
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;小数点不亮的代码
DB 82H,0F8H,80H,90H,00,00,00,00,00,00
DB 40H,79H,24H,30H,19H,12H,02H,78H ;小数点亮的显示代码
DB 00H,10H,00,00,00,00,00,00
NOP
NOP
按键判断程序
KEY: MOV P3,#0FFH ;读按键状态
MOV A,P3
CPL A
ANL A,#0FH
JZ RETX ;无键按下返回,有键按下延时去抖动
LCALL DISP
LCALL DISP
MOV A,P3
CPL A
ANL A,#0FH
JZ RETX ;是抖动则返回主程序,否则读按键状态存入R6及A中
MOV R6,A
LOOP2: LCALL DISP ;等待按键的释放
MOV A,P3
CPL A
ANL A,#0FH
JNZ LOOP2
MOV A,R6
RETX: RET
NOP
NOP
按键处理子程序
ANKEY: CLR EA ;关中断
LX: MOV A,R6
JB ACC.0,L1 ;是功能键转L1
JB ACC.1,L2 ;是确认键转L2
JB ACC.2,L3 ;是增1键转L3
JNB ACC.3,L12 ;不是减1键,转L12
JB 2BH.4,L6 ;判断使哪一位(时、分、秒)的值减1
JB 2DH.4,L8
JB 2FH.4,L9
L12: LCALL DISP
LCALL DISP
LCALL KEY
JZ L12
LJMP LX
L2: MOV 25H,#00H ;是确认键,处理完毕返回
CLR 2BH.4
CLR 2DH.4
CLR 2FH.4
SETB EA
RET
L3: JB 2BH.4,L61
JB 2DH.4,L81
JB 2FH.4,L91
AJMP L12
L1: MOV A,25H
JZ LB1
JB ACC.0,LB2
JB ACC.1,LB3
JNB ACC.2,L12
LB1: MOV 25H,#01H ;25H单元是标志位,(25H)=01H调节时单元的值
SETB 2BH.4
CLR 2DH.4
CLR 2FH.4
AJMP L12
LB3: MOV 25H,#04H ;(25H)=04H调节秒单元的值
SETB 2FH.4
CLR 2DH.4
CLR 2BH.4
AJMP L12
LB2: MOV 25H,#02H ;(25H)=02H,调节分单元的值
SETB 2DH.4
CLR 2BH.4
CLR 2FH.4
AJMP L12
L61: AJMP L611 ;调节时间时注意使用的是十进制,而且注意
L81: AJMP L811 ;分和秒都是60进制,时是24进制
L91: AJMP L911
L6: MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,L15
L15: JC L112
MOV 23H,#00H
L112: AJMP L12
L8: MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,L16
L16: JC L112
MOV 22H,#00H
AJMP L12
L9: MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,L17
L17: JC L112
MOV 21H,#00H
AJMP L12
L611: MOV A,23H
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,L112
MOV 23H,#23H
AJMP L12
L811: MOV A,22H
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,L112
MOV 22H,#59H
AJMP L12
L911: MOV A,21H
ADD A,#99H
DA A
MOV 21H,A
CJNE A,#99H,L112
MOV 21H,#59H
AJMP L12
NOP
NOP
END


小弟不明白的地方 用颜色标出来了.我不明白他怎么把秒位的十.个位一起考虑了?
很多 方案都是分开考虑的.
时钟的基本显示原理应该是:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
star:
mov a,#00h  ;把各个位全部清0
mov a_bit,a
mov b_bit,a
mov c_bit,a
mov d_bit,a
mov e_bit,a
mov f_bit,a
stlop:  acall display  ;程序的计算部分
      inc a_bit       ;秒位加1
       mov a,a_bit    ;送a
       cjne a,#10,stlop;如果秒到10那么转到10秒处理
       mov a_bit,#00h  ;秒位清0
       inc b_bit       ;10秒位加1
       mov a,b_bit     ;送a
       cjne a,#6,stlop ;如果10秒到了6那么到分处理
       mov b_bit,#00h  ; 10秒位清0
       inc c_bit
       mov a,c_bit
       cjne a,#10,stlop
       mov c_bit,#00h
       inc d_bit
       mov a,d_bit
       cjne a,#6,stlop
       mov d_bit,#00h
       inc e_bit
       mov a,e_bit
       cjne a,#10,stlop
       mov e_bit,#00h
       inc f_bit
       mov a,f_bit
       cjne a,#3,stlop
       mov f_bit,#00h
ajmp stlop  ;重新开始计算

不知道这两段 代码的区别.
902
kukuaman
文章数:2
年度积分:50
历史总积分:902
注册时间:2005/3/23
发站内信
发表于:2005/3/24 11:53:00
#1楼
急呀 其中DA操作是 什么用意?
1124
天叶
文章数:113
年度积分:50
历史总积分:1124
注册时间:2005/3/25
发站内信
发表于:2005/3/25 20:27:00
#2楼
人家是判断分是不是到了60
小时是不是到24点
www.5iplc.com
0591-8371 8015
139   5047     4082
903
cym06
文章数:1
年度积分:50
历史总积分:903
注册时间:2005/4/1
发站内信
发表于:2005/4/1 11:30:00
#3楼
晕..........DA是十进制调整指令呀.便于显示.............
60H就是指十进制数的60呀......60H是BCD码表示的..
906
kejianlove
文章数:3
年度积分:50
历史总积分:906
注册时间:2005/9/28
发站内信
发表于:2005/9/28 16:54:00
#4楼
请教
在电子钟程序中的;实用单片机电子钟的制作
;主程序(MAIN),如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME

ORG 0300H
MAIN:
mov 20h,#00h
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;设定定时器工作方式?
MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0 ;启动定时?
MOV SP,#40H ;重设堆栈指针
NEXT: LCALL DISP ;调用显示子程序?
LCALL KEY ;调用按键检测子程序
JZ NEXT ;
LCALL ANKEY ;调用按键处理子程序
SJMP NEXT ;重新循环
NOP
NOP
NOP
;定时中断处理程序:
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TL0,#0B4H ;赋定时初值
MOV TH0,#3CH
INC 20H ;
MOV A,20H
CJNE A,#20,RETI1
MOV 20H,#00H ;一秒钟时间到
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETI1
MOV 21H,#00H ;一分钟时间到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小时时间到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
MOV 23H,#00H ;到时间达到24小时,清零.
RETI1: POP PSW ;恢复现场
POP ACC
RETI ;中断返回?
NOP
NOP

;显示子程序
DISP: ANL 2FH,#10H ;处理小数点
MOV A,21H ;处理秒21H-->2DH,2EH
ANL A,#0FH
ORL A,2FH
MOV 2FH,A
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A
ANL 2DH,#10H
MOV A,22H ;处理分钟22H-->2CH,2DH
ANL A,#0FH
ORL A,2DH
MOV 2DH,A
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A
ANL 2BH,#10H
MOV A,23H ;处理小时23H-->2AH,2BH
ANL A,#0FH
ORL A,2BH
MOV 2BH,A
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A
MOV R0,#2FH ;显示偏移量
MOV R3,#06H
MOV DPTR,#TABLE
MOV A,#0BFH
LOOP1: MOV B,A ;
MOV P2,a
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,a ;送显示
MOV R2,#80H ;延时
DJNZ R2,$
DEC R0
MOV A,B
RR A
DJNZ R3,LOOP1 ;循环显示
RET

TABLE: db 28h,7eh,0a2h,62h,74h,61h,21h ;不带小数点
DB 7ah,20h,60h,00,00,00,00,00,00
DB 8H,5eH,82H,42H,54H,41H,1H,5aH ;带小数点
DB 00H,40H,00,00,00,00,00,00
NOP
NOP
;按键判断程序
KEY: MOV P2,#0FFH ;
MOV A,P2
CPL A
ANL A,#3CH
JZ RETX ;无键按下则返回
LCALL DISP ;
LCALL DISP
MOV A,P3
CPL A
ANL A,#3CH
JZ RETX ;键盘去抖动。
MOV R6,A ;将键值存入R6。
LOOP2: LCALL DISP ;
MOV A,P3
CPL A
ANL A,#3CH
JNZ LOOP2 ;等待键释放
MOV A,R6
RETX: RET
NOP
NOP
;按键处理子程序
ANKEY: CLR EA ;关中断
LX: MOV A,R6
JB ACC.2,L1 ;是功能键转L1
JB ACC.3,L2 ;是确认键转L2
JB ACC.4,L3 ;是减1键转L3
JNB ACC.5,L12 ;不是增1键,转L12
JB 2BH.4,L6 ;判断使哪一位(时、分、秒)的值加1
JB 2DH.4,L8
JB 2FH.4,L9

L12: LCALL DISP
LCALL DISP
LCALL KEY ;判断有无键按下。
JZ L12
LJMP LX

L2: MOV 25H,#00H ;确认键处理程序
CLR 2BH.4
CLR 2DH.4
CLR 2FH.4
SETB EA
RET

L3: JB 2BH.4,L61 ;增一键处理程序
JB 2DH.4,L81
JB 2FH.4,L91
AJMP L12

L1: MOV A,25H ;功能键处理程序
JZ LB1
JB ACC.0,LB2
JB ACC.1,LB3
JNB ACC.2,L12
LB1: MOV 25H,#01H ;25H单元是标志位,(25H)=01H调节时单元的值
SETB 2BH.4
CLR 2DH.4
CLR 2FH.4
AJMP L12

LB3: MOV 25H,#04H ;25H单元是标志位,(25H)=01H调节秒单元的值
SETB 2FH.4
CLR 2DH.4
CLR 2BH.4
AJMP L12

LB2: MOV 25H,#02H ;25H单元是标志位,(25H)=01H调节分单元的值
SETB 2DH.4
CLR 2BH.4
CLR 2FH.4
AJMP L12

L61: AJMP L611 ;
L81: AJMP L811 ;
L91: AJMP L911
L6: MOV A,23H ;时加一
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,L15
L15: JC L112
MOV 23H,#00H
L112: AJMP L12

L8: MOV A,22H ;分加一
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,L16
L16: JC L112
MOV 22H,#00H
AJMP L12

L9: MOV A,21H ;秒加一
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,L17
L17: JC L112
MOV 21H,#00H
AJMP L12

L611: MOV A,23H ;时减一
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,L112
MOV 23H,#23H
AJMP L12

L811: MOV A,22H ;分减一
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,L112
MOV 22H,#59H
AJMP L12

L911: MOV A,21H ;秒减一
ADD A,#99H
DA A
MOV 21H,A
CJNE A,#99H,L112
MOV 21H,#59H
AJMP L12
NOP
NOP
END

键控制程序的ACC.2 L1
                 ACC.3 L2
                      ....
  是什么意思 在单片机80c51中指的是哪几个脚

906
kejianlove
文章数:3
年度积分:50
历史总积分:906
注册时间:2005/9/28
发站内信
发表于:2005/9/28 16:58:00
#5楼
JB ACC.0,L1  ;是功能键转L1
 JB ACC.1,L2  ;是确认键转L2
 JB ACC.2,L3  ;是增1键转L3
 JNB ACC.3,L12 ;不是减1键,转L12
中 ACC。2是什么意思 转L1是指芯片的第几个脚
L1 L2 L12 LBI LB2 L61 L112等都是什么意思
906
kejianlove
文章数:3
年度积分:50
历史总积分:906
注册时间:2005/9/28
发站内信
发表于:2005/9/28 16:59:00
#6楼
JB ACC.0,L1  ;是功能键转L1
 JB ACC.1,L2  ;是确认键转L2
 JB ACC.2,L3  ;是增1键转L3
 JNB ACC.3,L12 ;不是减1键,转L12
中 ACC。2是什么意思 转L1是指芯片的第几个脚
L1 L2 L12 LBI LB2 L61 L112等都是什么意思
1185
85880527
文章数:136
年度积分:50
历史总积分:1185
注册时间:2006/1/16
发站内信
发表于:2006/1/16 13:22:00
#7楼
*******
************
[此贴子已经被作者于2006-10-13 18:07:27编辑过]
1185
85880527
文章数:136
年度积分:50
历史总积分:1185
注册时间:2006/1/16
发站内信
发表于:2006/1/16 13:45:00
#8楼
程序1和2在软件方面皆无误差累计,程序2在理论上无任何误差,由于定时中断响应引起的误差由NOP指令“吃掉”了,而程序1有几个周期的误差,但无“相位”误差,不会累计,就象步进电机的角度一样不累计,由ADD A,TL0给消除了
902
weige888
文章数:1
年度积分:50
历史总积分:902
注册时间:2006/2/13
发站内信
发表于:2006/2/13 18:05:00
#9楼
定时中断是这样的  
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TL0,#0B4H ;赋定时初值
MOV TH0,#3CH
INC 20H ;
MOV A,20H
CJNE A,#20,RETI1
MOV 20H,#00H ;一秒钟时间到
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETI1
MOV 21H,#00H ;一分钟时间到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小时时间到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
MOV 23H,#00H ;到时间达到24小时,清零.
RETI1: POP PSW ;恢复现场
POP ACC
RETI ;中断返回?


DA指令是调整十进制数的  比如 mov a,#8  
                                          add a,#4
                                          da a
结果是 a中变为 #12h      上面的定时中断不停的加一   a 中在9+1时  执行DA A 后变为10H     同理 在  19+1 后    da a   将变为   A=20H  固内存中的 秒指示单元21H  实际上保存了一个十进制的数

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

109.2007