找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1227|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机255倒计时器汇编程序调试遇到问题

[复制链接]
跳转到指定楼层
楼主
本帖最后由 buxiangzhuche 于 2021-12-17 19:49 编辑

255倒计时器的需求是,有s28(单刀开关),s29(按钮)两个控制构件,要求是s28低电位时,进入预设模式,有滑动电阻器输入电压,利用adc0808模数转换,得到数字量,然后在8位数码管最左3位动态显示出来,s28高电位时,8位数码管上最左边3位显示预设值,最右边3位显示实时倒计时值,按下s29(1下开始,2下暂停)开始倒计时,每一秒-1,减到0,则使蜂鸣器响30秒,然后8位数码管最右边重新显示预设值,等待下一次倒计时。


自己写的时候,遇到问题如下:①动态数码管仿真显示异常,s28接高电位可以显示左右各3位,但是拨动到低电位只能显示一位(正常是显示左三位),利用的是同一个显示子程序(寄存器值不同)。②s28只能从高电位切换回低电位(由低到高只显示一位),且只有第一次有效,后面无论怎么拨动都只显示一位,如①问题。③使用寄存器间接寻址,mov A,@R0,指向bcd码缓存区时,指向异常,比如60H内有#01H,但是读取的时候,a取到了0,inc r0,依次向后也是如此。接线图以及单片机程序如下:
  1.         IOCON EQU 8003H
  2.         PORTA EQU 8000H
  3.         PORTB EQU 8001H
  4.         IN0   EQU 9000H               
  5.         BUF   EQU 60H  ;ad转换读入缓存
  6.         EOC   BIT P1.0
  7.         BIZ   BIT P1.1
  8.         S28   BIT P1.2
  9.         S29   BIT P3.2
  10.         
  11.         ORG 0000H
  12.         LJMP START
  13.         ORG 0200H
  14.                
  15.         ORG 0003H
  16.         JNB S28,out
  17.         CPL  TR0
  18.         out:
  19.         RETI
  20.         
  21.         ORG 000BH
  22.         INC R4 ;+1,重装值
  23.         MOV TH0,#4EH
  24.         MOV TL0,#20H
  25.         CJNE R4,#20,leave
  26.         MOV R4,#00H
  27.         JNB F0,jishu
  28.         CLR BIZ
  29.         INC R5
  30.         CJNE R5,#30,leave
  31.         SETB BIZ
  32.         MOV A,R3 ;无法 MOV R2,R3
  33.         MOV R2,A
  34.         LCALL CON
  35.         CLR TR0
  36.         AJMP leave
  37.         jishu:
  38.         MOV A,R2
  39.         DEC A
  40.         MOV R2,A
  41.         MOV B,#100 ;开始计算
  42.         DIV AB
  43.         MOV 63H,A        ;63H 预设百位
  44.         MOV A,B
  45.         MOV B,#10
  46.         DIV AB
  47.         MOV 64H,A        ;64H 预设十位        
  48.         MOV 65H,B        ;65H 预设个位
  49.         CJNE R2,#00H,leave
  50.         SETB F0
  51.         leave:
  52.         RETI
  53.         
  54.         CON:
  55.         MOV 63H,60H
  56.         MOV 64H,61H
  57.         MOV 65H,62H
  58.         RET
  59.                
  60.         SHOW:
  61.         MOV R7,#80H        ;从第一位开始
  62.         MOV R0,#60H        ;缓存首地址
  63.         next:
  64.         LCALL DELAY
  65.         MOV A,@R0         ;送段码
  66.         MOV DPTR,#TAB
  67.         MOVC A,@A+DPTR
  68.         MOV DPTR,#PORTA
  69.         MOVX @DPTR,A
  70.         INC R0        ;下一段
  71.         MOV A,R7        ;送位码
  72.         CPL A
  73.         INC DPTR        ;指向portb
  74.         MOVX @DPTR,A
  75.         CPL A
  76.         RR A        ;下一位        
  77.         MOV R7,A
  78.         CJNE R7,#10H,gou
  79.         MOV R7,#04H
  80.         gou:
  81.         DJNZ R6,next
  82.         RET
  83.         
  84.         TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
  85.                
  86.         DELAY:
  87.         MOV R1,#0FFH
  88.         DJNZ R1,$
  89.         RET
  90.         
  91.         START:
  92.         MOV P0,#0FFH        ;准双向口读,先写1
  93.         MOV P1,#0FFH
  94.         MOV P3,#0FFH
  95.         MOV DPTR,#IOCON        ;指向8255命令口
  96.         MOV A,#80H        ;PA、PB、PC设为基本输出模式
  97.         MOVX @DPTR,A
  98.         MOV TMOD,#01H ;初始化T0定时器,11.1HZ频率下,设为20000即可
  99.         MOV TH0,#4EH
  100.         MOV TL0,#20H
  101.         SETB EA
  102.         SETB ET0
  103.         SETB EX0
  104.         SETB IT0        ;下降沿触发
  105.         pan:
  106.         JB S28, DJS ;是0,则进入设置计数值
  107.         MOV DPTR,#9000H        ;指向A/D的0通道
  108.         SETB EOC
  109.         MOVX @DPTR,A        ;启动A/D转换
  110.         JNB EOC,[        DISCUZ_CODE_17        ]nbsp;       ;没转换好则等待
  111.         MOVX A,@DPTR        ;读A/D转换值
  112.         MOV A,#107        ;测试用
  113.         MOV R2,A         ;用于倒计时
  114.         MOV R3,A         ;用于恢复计数值
  115.         MOV R4,#00H         ;用于计秒
  116.         MOV R5,#00H         ;用于计蜂鸣器
  117.         MOV B,#100;开始计算
  118.         DIV AB
  119.         MOV 60H,A        ;60H 预设百位
  120.         MOV 63H,A
  121.         MOV A,B
  122.         MOV B,#10
  123.         DIV AB
  124.         MOV 61H,A        ;61H 预设十位
  125.         MOV 64H,A
  126.         MOV 62H,B        ;62H 预设个位
  127.         MOV 65H,B
  128.         MOV R6,#03H ;显示位数
  129.         LCALL SHOW
  130.         AJMP PAN
  131.         djs:
  132.         MOV R6,#06H ;显示位数
  133.         LCALL SHOW
  134.         AJMP PAN
  135.         END
复制代码


                end.zip (203.6 KB, 下载次数: 6)


为了便于各位大佬前辈调试,源码及protues8.9工程文件一并附上了,十分感谢。
        



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2021-12-17 22:47 | 只看该作者
顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表