255倒计时器的需求是,有s28(单刀开关),s29(按钮)两个控制构件,要求是s28低电位时,进入预设模式,有滑动电阻器输入电压,利用adc0808模数转换,得到数字量,然后在8位数码管最左3位动态显示出来,s28高电位时,8位数码管上最左边3位显示预设值,最右边3位显示实时倒计时值,按下s29(1下开始,2下暂停)开始倒计时,每一秒-1,减到0,则使蜂鸣器响30秒,然后8位数码管最右边重新显示预设值,等待下一次倒计时。
自己写的时候,遇到问题如下:①动态数码管仿真显示异常,s28接高电位可以显示左右各3位,但是拨动到低电位只能显示一位(正常是显示左三位),利用的是同一个显示子程序(寄存器值不同)。②s28只能从高电位切换回低电位(由低到高只显示一位),且只有第一次有效,后面无论怎么拨动都只显示一位,如①问题。③使用寄存器间接寻址,mov A,[url=]@R0,指向bcd码缓存区时,指向异常,比如60H内有#01H,但是读取的时候,a取到了0,inc[/url]r0,依次向后也是如此。接线图以及汇编程序如下:
- IOCON EQU 8003H
- PORTA EQU 8000H
- PORTB EQU 8001H
- IN0 EQU 9000H
- BUF EQU 60H ;ad转换读入缓存
- EOC BIT P1.0
- BIZ BIT P1.1
- S28 BIT P1.2
- S29 BIT P3.2
- ORG 0000H
- LJMP START
- ORG 0200H
- ORG 0003H
- JNB S28,out
- CPL TR0
- out:
- RETI
- ORG 000BH
- INC R4 ;+1,重装值
- MOV TH0,#4EH
- MOV TL0,#20H
- CJNE R4,#20,leave
- MOV R4,#00H
- JNB F0,jishu
- CLR BIZ
- INC R5
- CJNE R5,#30,leave
- SETB BIZ
- MOV A,R3 ;无法 MOV R2,R3
- MOV R2,A
- LCALL CON
- CLR TR0
- AJMP leave
- jishu:
- MOV A,R2
- DEC A
- MOV R2,A
- MOV B,#100 ;开始计算
- DIV AB
- MOV 63H,A ;63H 预设百位
- MOV A,B
- MOV B,#10
- DIV AB
- MOV 64H,A ;64H 预设十位
- MOV 65H,B ;65H 预设个位
- CJNE R2,#00H,leave
- SETB F0
- leave:
- RETI
- CON:
- MOV 63H,60H
- MOV 64H,61H
- MOV 65H,62H
- RET
- SHOW:
- MOV R7,#80H ;从第一位开始
- MOV R0,#60H ;缓存首地址
- next:
- LCALL DELAY
- MOV A,@R0 ;送段码
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV DPTR,#PORTA
- MOVX @DPTR,A
- INC R0 ;下一段
- MOV A,R7 ;送位码
- CPL A
- INC DPTR ;指向portb
- MOVX @DPTR,A
- CPL A
- RR A ;下一位
- MOV R7,A
- CJNE R7,#10H,gou
- MOV R7,#04H
- gou:
- DJNZ R6,next
- RET
- TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
- DELAY:
- MOV R1,#0FFH
- DJNZ R1,$
- RET
- START:
- MOV P0,#0FFH ;准双向口读,先写1
- MOV P1,#0FFH
- MOV P3,#0FFH
- MOV DPTR,#IOCON ;指向8255命令口
- MOV A,#80H ;PA、PB、PC设为基本输出模式
- MOVX @DPTR,A
- MOV TMOD,#01H ;初始化T0定时器,11.1HZ频率下,设为20000即可
- MOV TH0,#4EH
- MOV TL0,#20H
- SETB EA
- SETB ET0
- SETB EX0
- SETB IT0 ;下降沿触发
- pan:
- JB S28, DJS ;是0,则进入设置计数值
- MOV DPTR,#9000H ;指向A/D的0通道
- SETB EOC
- MOVX @DPTR,A ;启动A/D转换
- JNB EOC ;没转换好则等待
- MOVX A,@DPTR ;读A/D转换值
- MOV A,#107 ;测试用
- MOV R2,A ;用于倒计时
- MOV R3,A ;用于恢复计数值
- MOV R4,#00H ;用于计秒
- MOV R5,#00H ;用于计蜂鸣器
- MOV B,#100;开始计算
- DIV AB
- MOV 60H,A ;60H 预设百位
- MOV 63H,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOV 61H,A ;61H 预设十位
- MOV 64H,A
- MOV 62H,B ;62H 预设个位
- MOV 65H,B
- MOV R6,#03H ;显示位数
- LCALL SHOW
- AJMP PAN
- djs:
- MOV R6,#06H ;显示位数
- LCALL SHOW
- AJMP PAN
- END
复制代码
end.zip
(203.6 KB, 下载次数: 0)
|