您现在所在的是:

单片机论坛

回帖:4个,阅读:1584 [上一页] [1] [下一页]
1672
lizijie
文章数:188
年度积分:50
历史总积分:1672
注册时间:2005/7/16
发站内信
发表于:2006/10/19 18:01:00
#0楼
org  0000h  ;程序入口地址
     ajmp main  
     org  0003h  ;外部中断INTO入口地址
     ajmp pinto  ;转中断服务子程序
     org  000bh  ;T0中断入口
     ajmp wto    ;定时器T0入口地址
     org  20h    ;主程序起始地址
main: mov  sp,#40h ;设置栈指针
     clr  00h ;工作状态标志位(=0为“设置”状态,=1为“工作”状态)
     clr  01h ;状态指示灯标志位(=0时LED亮,=1时LED灭)
     setb 02h  ;控制信号标志位(=0时p3.7为低,=1时p3.7为高)
     mov  21h,#0   ;0.5毫秒计数器清零
     mov  22h,#0   ;100毫秒计数器清零
     mov  23h,#0   ;秒计数器清零
     mov  24h,#15  ;分计数器预置数
     mov  tl0,#6   ;装入定时初值
     mov  th0,#6
     mov  tmod,#02h ;设T0为方式2
     setb ea        ;开CPU中断
     setb et0       ;允许T0中断
     clr  tr0       ;禁止T0计数
     setb it0       ;设定INT0触发方式
     setb ex0       ;允许INT0中断
     mov 34h,#1     ;显示缓冲器预置数(十位)
     mov 35h,#5     ;显示缓冲器预置数(个位)
m:    nop
   acall  led       ;调用工作状态指示灯控制子程序
     jnb  00h,m  ;查询工作状态标志,为0时等待设置,为1时程序向下执行
mm:   nop
   acall  zh1    ;调用数制转换子程序,将设置的十进制数转换为二进制数送到分计数器
   acall  dsp    ;调用显示子程序,显示分计数器中的数据。
     jnb  02h,son ;查询控制信号标志位,为0时转到信号输出子程序
    ajmp  m       ;信号控制标志位为1时主程序循环
;输出控制信号子程序
son:  clr  ex0    ;关外部中断
     clr  tr0    ;关计数器
     clr  p3.7
     jnb  p3.4,son1  ;按K3使p3.7变高(清除输出信号)
    ajmp  son
;清除控制信号子程序
son1: jnb  p3.4,$     ;消除抖动
     setb  p3.7
     setb  02h       ;设置p3.7状态标志
     setb  ex0       ;开外部中断
      clr  00h       ;设置工作状态标志
     ajmp  m         ;返回主程序
;显示子程序
dsp:   mov  r7,#0afh
dsp0:  mov r0,#30h
      mov  dptr,#tab
      nop
      mov  a,@r0
     movc  a,@a+dptr
rx1:   mov p1,a
      clr  p3.0
     djnz  r7,rx1
      mov  r7,#0afh
      inc  r0
      mov  p1,#0ffh
     setb  p3.0
      mov  a,@r0
      movc a,@a+dptr
rx2:    mov p1,a
       clr  p3.1
      djnz  r7,rx2
      mov   r7,#8
      setb  p3.1
      djnz  r7,dsp0
      ret
dsp1:  mov  r7,#0fh
dsp01: mov r0,#34h
      mov  dptr,#tab
      mov  a,@r0
      movc a,@a+dptr
rx01:   mov p1,a
       clr  p3.1
      djnz r7,$
       mov  r7,#0fh
       inc r0
      setb p3.1
      mov  a,@r0
     movc a,@a+dptr
      mov p1,a
      clr p3.0
     djnz r7,$
     setb p3.0
      ret
;数制转换子程序
zh1:   mov r2,#0
      mov r3,24h
    acall bcd
      mov a,r6
      anl a,#0fh
      mov 30h,a
      mov a,r6
      anl a,#0f0h
      swap a
      mov 31h,a
      ret
;十进制转换为二进制子程序
dt0b:  mov 32h,#0
      mov 33h,#0
      mov r0,#32h
      mov r2,#3
    acall idtb
      mov a,r4
      mov 24h,a
      ret
idtb:  mov r3,#0
      mov a,@r0
      mov r4,a
idtl:  mov a,r4
      mov b,#10
      mul ab
      mov r4,a
      mov b,#10
      xch a,b
      xch a,r3
      mul  ab
      add a,r3
      xch a,r4
      inc r0
      add a,@r0
      xch a,r4
     addc a, #0
      mov r3,a
     djnz r2,idtl
     ret
;二进制数转换为十进制数子程序
bcd:   clr a
      mov r4,a
      mov r5,a
      mov r6,a
      mov r7,#16
ibtl2: clr c
      mov a,r3
      rlc a
      mov r3,a
      mov a,r2
      rlc a
      mov r2,a
      mov a,r6
     addc a,r6
       da a
      mov r6,a
      mov a,r5
     addc a,r5
       da a
      mov r5,a
      mov a,r4
     addc a,r4
       da a
      mov r4,a
     djnz r7,ibtl2
      ret
;外部中断服务子程序
pinto: clr ex0
      push acc
      push psw
      setb p3.5
     acall dsp1
pk:      jb p3.2,toext
pk0:  acall dsp1
       jnb p3.2,pk0
pk2:    jb  p3.3,pk3     ;判K2按下否,末按则转到判K3状态
     acall dsp1
       inc 34h
       mov a,34h
      cjne a,#0ah,pk22
      mov  34h,#0
pk22: acall dsp1         ;K2按下,30H加1
       jnb p3.3,pk22
      ajmp pk2
pk3:  acall dsp1
        jb p3.4,pk1     ;判K3按下否,末按则转到判K1状态
       inc 35h
       mov a,35h
      cjne a,#0ah,pk33
      mov  35h,#0
pk33: acall dsp1
      jnb  p3.4,pk33
      ajmp pk3
pk1:  acall dsp1
       jb  p3.2,pk2   ;K1末按则转判K2和K3
pk10: acall dsp1
       jnb p3.2,pk10
     acall dt0b
      setb 00h
toext: setb ex0       ;开中断
      setb tr0
       pop psw       ;恢复现场
       pop acc
      reti
;状态指示灯控制子程序
led:     jb 01h,led0
       clr p3.5
       ret
led0:  setb p3.5
       ret
;段码表
tab:     db  0c0h,0f9h,0a4h,0b0h,99h
        db  92h,82h,0f8h,80h,90h
;定时中断服务子程序
wto:   push acc
      push psw
       inc 21h
       mov a,21h
      cjne a,#0c8h,toreti
       mov 21h,#0
       inc 22h
       mov a,22h
      cjne a,#10,toreti
       mov 22h,#0
       inc 23h
       cpl 01h
       mov a,23h
      cjne a,#60,toreti
       mov 23h,#0
       dec 24h
       mov a,24h
      cjne a,#0,toreti
       clr tr0
       clr 02h
       clr 01h
       clr 00h
toreti: pop psw
       pop acc
       reti
       end  
5140
liguoxing
文章数:1691
年度积分:56
历史总积分:5140
注册时间:2006/4/21
发站内信
发表于:2006/10/20 15:54:00
#1楼
要问的程序太长了,估计没哪个有此等耐心来看完你的程序,并给你指错。不信?走着瞧。
呜呜。我没有个性化Logo,谁能帮我设计个?拜托啦。
916
yuyang_yfy
文章数:15
年度积分:50
历史总积分:916
注册时间:2006/9/2
发站内信
发表于:2006/11/10 13:59:00
#2楼
不指出错误呢?
907
乞丐宠儿
文章数:3
年度积分:50
历史总积分:907
注册时间:2006/9/8
发站内信
发表于:2006/12/27 11:35:00
#3楼
自己模拟调试看看
944
jqwx
文章数:17
年度积分:50
历史总积分:944
注册时间:2004/10/9
发站内信
发表于:2006/12/27 23:38:00
#4楼
1.建议使用最小系统法来调试,就是将程序主要框架留出来,进行调试,调通了之后再分模块将子程序加上去,一部分一部分得加
2.为保险起见,程序第7行,ORG 0020H是否可以改成0030H,因为0023H是串口中断入口,虽然好象你的程序没有使用串口.
单片机学习板STC51型110/S51型125 让你步入单片机的世界
http://www.ednchina.com/blog/jqwx http://superplc.gkbk.com

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

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

78.0005