本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
高手给看一下:下面的程序错在哪里?凡是有关定时器2的语句都通不过。连“ LJMP TCT22 ”也通不过,开始以为keil的版本低,现在换了V3.3还是不行,选的是“AT89s52”,显示以下错误信息:
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP TCT22 ;定时/计数器T2中断服务程序入口地址
ORG 0050H
;-----主程序开始-----
MAIN:
MOV SP, #0DFH ;将0E0H-0FFH,共计32字节作为堆栈区
;---复位后,08H-0FF内部RAM单元清0。因如果非上电复位,RAM不一定清"0"
MOV R0, #08H
LOOP1:
MOV @R0, #0
INC R0
CJNE R0, #0, LOOP1
;----初始化定时器T2
MOV TH2, #(65536-10000)/256
MOV TL2, #(65536-10000) mod 256 ;初值送定时器T2
MOV RCAP2H, #(65536-10000)/256
MOV RCAP2L, #(65536-10000) mod 256 ;初始化重装初值
MOV T2CON, #00000100B ;初始化T2工作方式(自动重装初值、定时)
;并启动了T2;-----初始化中断控制器
SETB ET2 ;允许定时器T2中断
SETB EA ;开中断
SETB RS0 ;R0~R7使用第一组
MOV R0,#100 ;0.01秒到1秒
MOV R1,#60 ;秒数
MOV R2,#60 ;分数
MOV R3,#24 ;小时数
CLR RS0 ;R0~R7恢复到默认的0组,以供其它程序使用。
SJMP $
;END
;定时/计数器T2中断服务程序
CTC22:
PUSH PSW
SETB RS0 ;进入1组
MOV R4,#8 ;显示8位数,从小时数开始到秒个位
MOV A,#24 ;小时数送A(显示扫描从小时往秒方向)
SUBB A,R3 ; 显示"小时"下面的程序R3 是减,所以这里倒
;换一下,以便显示。
CALL DISP ;调显示子程序
MOV A, #60 ;显示"分"
SUBB A,R2
CALL DISP
MOV A,#60 ;显示"秒"
SUBB A,R1
CALL DISP
AD:
DJNZ R0,EXIT ;十毫秒计数不满,退出中断子程序
MOV R0,#100 ; 满了以后,重新开始
DJNZ R1,EXIT ;60秒不满,退出中断子程序
MOV R1,#60 ; 满了以后,重新开始
DJNZ R2,EXIT ;60分不满…….
MOV R2,#60
DJNZ R3,EXIT
MOV R3,#24
EXIT:
CLR RS0 ;仍然会到默认的组(实际上没必要)
POP PSW
CLR TF2 ;清除定时器T2溢出标志,一定要软件清除
RETI
DISP:
DEC R4 ;R4减1开始的时候在第8位(无),减1以后时第7位
MOV B,#10 ;除数送B
DIV AB ;A除以B,就是分开十位数和个位数
SWAP A ;数值在低四位,现在转到高四位
ORL A,R4 ;数码管的位置数在R4,相"或"以后在低四位
MOV P1,A ;显示数和位置数一道送P1口显示。
DEC R4 ;R4再减1
MOV A,B ;个位数由B送A,
SWAP A ;高低四位交换
ORL A,R4 ;和数码管位置相"与"
MOV P1,A
DEC R4 ;R4再减1,时、分、秒中间空一位
RET
END
[ 此贴被ahshmj在2009-02-05 13:26重新编辑 ]
|