假设单片机的晶体振荡器的频率是12MHz,利用定时器1采用方式1定时20ms,计算出初值并写出整个

2024-12-03 14:45:57
推荐回答(3个)
回答1:

定时器的初值的计算如下:
在定时器模式下,计数器的计数脉冲来自于晶振脉冲的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

   

回答2:

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;
}
//添加你的代码
}

回答3:

51 单片机?
编程,用 C 语言,还是汇编语言?