定时器的初值的计算如下:
在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12M晶振,则定时器的计数频率为1MHZ。假设定时时间为T,机器周期为T1,即12/晶振频率。X为定时器初值。则 X=2^n-T/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8
本题技术初值计算如下:
X=2^16-20*10^(-3)/(12/12*10^6)
=65536-20000=45536=B1E0H
T1INTCOUNT DATA 30H;中断次数累加
ORG 0000H
LJMP START
ORG 001BH
LJMP Timer1Interrupt
START:
MOV SP,#60H
LCALL InitTimer1
MOV T1INTCOUNT,#0;
LOOP:
LJMP LOOP
InitTimer1:
MOV TMOD,#10H;控制字
MOV TH1,#0B1H;初值高位
MOV TL1,#0E0H;初值低位
SETB EA
SETB ET1
SETB TR1
RET
Timer1Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH1,#0B1H
MOV TL1,#0E0H
INC T1INTCOUNT
MOV A,T1INTCOUNT
CJNE A,#5, Timer1Interrupt_EXIT
MOV T1INTCOUNT,#0
CPL P1.7;在P1.7脚上输出周期为0.2秒的方波(高低电平各100ms)
Timer1Interrupt_EXIT:
POP ACC
POP DPL
POP DPH
RETI
END
1.全局中断没有开启,所有中断响应将不被执行!
2.定时器/计数器0设置定时时间20000us,却没有被使能!
*****************************************************/
#include
void
main(void)
{
P0=0x00;
P1=0x80;
P2=0x00;
P3=0x00;
TCON=0x40;
TMOD=0x11;
TH0=0xB1;
TL0=0xE0;
TH1=0xB1;
TL1=0xE0;
T2CON=0x00;
RCAP2H=0x00;
RCAP2L=0x00;
IP=0x00;
IE=0x08;
PCON=0x00;
SCON=0x00;
while(1)
{
//添加你的代码
}
}
void
T1Isr(void)
interrupt
3
{
static
unsigned
char
i=0;
TH1=0xB1;
TL1=0xE0;
i++;
if(i==10)
{
i=0;
P1=~P1;
}
//添加你的代码
}
51 单片机?
编程,用 C 语言,还是汇编语言?