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

假设单片机的晶体振荡器的频率是12MHz,利用定时器1采用方式1定时20ms,计算出初值并写出整个定时器初始化程序,同时写出在P1.7脚上输出0.2秒的方波的完整程序(求答案)

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

   

追问

我要C语言

麻烦你了

追答#include <reg51.h>
unsigned char t1intcount=0;
void InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0B1;
    TL1 = 0x0E0;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}

void main(void)
{
    InitTimer1();
    //P1^7=1;//初始化为高电平
    while(1);
}

void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0B1;
    TL1 = 0x0E0;
    t1intcount++;
    if(t1intcount==5)//20ms*5=100ms
    {
        t1intcount=0; 
        P1^7=~P1^7  //在P1.7脚上输出周期为0.2秒的方波(高低电平各100ms) 
    }
}

追问

谢谢你

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-18
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;
}
//添加你的代码
}
第2个回答  2016-01-20
51 单片机?
编程,用 C 语言,还是汇编语言?追问

C

帮我做下这题

追答

晶振频率选用12MHz,机器周期则为1us。

定时 20ms,则需计数 20ms/1us = 20000。

方式1 计数最大是 65536。

初始值则为 65535 - 20000 = 45536 = B1E0H。

 

程序如下:

#include <reg51.h>
sbit  FB = P1^7; //输出方波
unsigned char n = 0;
void main(void) 

    TMOD = 0x10; 
    TH1 = 0xB1; 
    TL1 = 0xE0; 
    TR1 = 1; 
    IE  = 0x88;
    while(1);   //等待中断
}
 
void T1_INT()  interrupt 3 

    TH1 = 0xB1; 
    TL1 = 0xE0; 
    n++; 
    n %= 5;
    if(n == 0)  FB = ~FB;
}

 

网友采纳答案的程序,有错。

相似回答