AT89C52RC单片机频率12MHz,用定时器1及中断的方法,产生周期为1s的等宽方波,从P1.1口输出,求相应程序

单片机频率12MHz,用定时器1及中断的方法,产生周期为1s的等宽方波,从P1.1口输出,求相应程序

#include<reg52.h>

#define uint unsigned int 

#define uchar unsigned char 

sbit d1=P1^0;

uchar num1;

void main()

{

 

 TMOD=0x01;//设置定时器0为工作方式1

 EA=1;//开总中断

 ET0=1;//开定时器0中断

 ET1=1;

 TR0=1;//启动定时器0

 TR1=1;

 while(1)

 {

  if(num1==2)

   {

    num1=0;

    d1=~d1;

   }

 

 }

}

void time1() interrupt 3

{

 TH1=(65536-1000)/256;

 TL1=(65536-1000)%256;

 num1++; 

}

  有些参数自己改 我难得改

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-13
#include<reg52.h>

sbit PWM=P1^1;
int t=0;

void Init_Timer1(void)
{
TMOD |= 0x10;
TH1=0xD8;//@12M 10ms 16bit 自动重载; Init value
TL1=0xF0;
EA=1; /* interupt enable */
ET1=1; /* enable timer1 interrupt */
TR1=1;
}

main()
{
Init_Timer1();
while(1);
}

void Timer1_isr(void) interrupt 3 using 1
{
TH1=0xD8;//@12M 10ms 16bit 自动重载; Init value
TL1=0xF0;
t++;
if(t==50) //50个10MS是0.5秒,两次是一个周期
{
t=0;
PWM=~PWM;
}

}本回答被提问者采纳
第2个回答  2010-06-13
ORG 0000H
LJMP START
ORG 001BH
LJMP Timer1Interrupt

START:
SETB P1.1
MOV R7, #0
LCALL InitTimer1

LOOP:
SJMP LOOP

InitTimer1:
MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#0B0H
SETB EA
SETB ET1
SETB TR1
RET

Timer1Interrupt:
MOV TH1,#3CH
MOV TL1,#0B0H
INC R7
CJNE R7, #10, T1_RETI
CPL P1.1
MOV R7, #0
T1_RETI:
RETI

END
相似回答