51单片机,请高手指点好的算法,题目如下
时间:10-02
整理:3721RD
点击:
使用12M晶振,使T0工作在方式3,从P1.0输出周期为200us占空比为50%的方波,从P1.1输出周期为100us占空比为50%的方波,T1工作在方式2,从P1.2输出周期为80us占空比为50%的方波,(T1没有中断申请标志位,使用读取计数数据的方法进行判断)。请用汇编写出程序。
由于我刚学单片机,还不会C语言,请用汇编指点。下边是我写的程序,输出频率误差好大啊,请指点一下该怎么写,谢谢。
ORG 0H
AJMP START
ORG 000BH
LJMP SUB_P10
ORG 0001BH
AJMP SUB_P11
ORG 0100H
START:
MOV TMOD,#13H;设置T0方式3,T1工作方式2,都为软件启动
MOV TL0,#9CH ;给定时器TL0赋初值,使定时100US
MOV TH0,#0CEH ;给定时器TH0赋初值,使定时50US
MOV TL1,#0H ;给定时器T1赋初值,使定时40US
MOV TH1,#00H ;给定时器T1赋预装值
ANL P1,#0F8H ;P1低三位清零
SETB ET0 ;开T0中断使能位
SETB ET1 ;开T1中断使能位
SETB EA ;
ORL TCON,#50H;开始计数
LOOP: CLR C ;
MOV A,#28H ;设比较大小基数
MOV R0,TL1 ;T1计数值读入A
SUBB A,R0 ;比较计数是否到
JC SUB_P12 ;C为1,则定时到时,转移
WAIT:NOP ;等待中断
;NOP
SJMP LOOP ;无中断则转移,
ORG 0150H
SUB_P12:CPL P1.2 ;处理P1.2
LJMP WAIT ;
SUB_P11:MOV TH0,#0CEH ;给定时器TH0赋初值
CPL P1.1 ;
RETI
SUB_P10:MOV TL0,#9CH ;给定时器TL0赋初值
CPL P1.0 ;
RETI
END
由于我刚学单片机,还不会C语言,请用汇编指点。下边是我写的程序,输出频率误差好大啊,请指点一下该怎么写,谢谢。
ORG 0H
AJMP START
ORG 000BH
LJMP SUB_P10
ORG 0001BH
AJMP SUB_P11
ORG 0100H
START:
MOV TMOD,#13H;设置T0方式3,T1工作方式2,都为软件启动
MOV TL0,#9CH ;给定时器TL0赋初值,使定时100US
MOV TH0,#0CEH ;给定时器TH0赋初值,使定时50US
MOV TL1,#0H ;给定时器T1赋初值,使定时40US
MOV TH1,#00H ;给定时器T1赋预装值
ANL P1,#0F8H ;P1低三位清零
SETB ET0 ;开T0中断使能位
SETB ET1 ;开T1中断使能位
SETB EA ;
ORL TCON,#50H;开始计数
LOOP: CLR C ;
MOV A,#28H ;设比较大小基数
MOV R0,TL1 ;T1计数值读入A
SUBB A,R0 ;比较计数是否到
JC SUB_P12 ;C为1,则定时到时,转移
WAIT:NOP ;等待中断
;NOP
SJMP LOOP ;无中断则转移,
ORG 0150H
SUB_P12:CPL P1.2 ;处理P1.2
LJMP WAIT ;
SUB_P11:MOV TH0,#0CEH ;给定时器TH0赋初值
CPL P1.1 ;
RETI
SUB_P10:MOV TL0,#9CH ;给定时器TL0赋初值
CPL P1.0 ;
RETI
END
好像很有问题呢。当定时器0工作在方式三,就成了TL0和TH0为两个独立的的8位寄存器,其中以TL0为寄存器的定时器使用原来Timer0中TMOD和TCON的控制位,即GATE0、TF0、TR0;以TH0为寄存器的定时器使用原来Timer1中TMOD和TCON的控制位,即GATE1、TF1、TR1。
定时器1在工作方式三中停止计数,不能使用了。但你这里居然还在用……
单是这里出问题了,其他的不再看下去了,你先改过这里先把。
我已经找到了答案,答案也是说不准确的
