100分求助汇编语言改成 C 语言写(单片机的)

来源:百度知道 编辑:UC知道 时间:2024/05/03 10:31:22
ORG 0000H
SJMP MAIN
ORG 000BH
LJMO I_T0
ORG 00013H
LJMP I_INT1
MAIN:
MOV R0,#0
MOV TMOD,#02H
MOV TH0,#0
MOV TL0,#0
SETB IT1
SETB EA
SETB EX1
SETB ET0
SJMP $
I_INT1:
SETB TR0
JNB P3.3,$
MOV 60H,TL0
MOV 61H,R0
MOV R0,#0
MOV TL0,#0
CLR TR0
RETI
I_T0:
CLR TF0
INC R0
RETI
END
最后正脉冲的宽度为:[(61H)×256+(60H)]×T
其中:T为机器周期,如果是6MHz的话就是2uS,如果是12MHz的话就是2uS。

//以下代码经Keil C51编译通过,应该是最佳答案了吧 ^_^
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

#include "reg51.h"
sbit P3_3 = P3^3;
uchar tmp_r0;
uchar tmp_60h,tmp_61h;

void main(void)
{
tmp_r0 = 0; // MOV R0,#0
TMOD=0x2; // MOV TMOD,#02H
TH0=0x00; // MOV TH0,#0
TL0=0x00; // MOV TL0,#0
IT1=1; // INT1下降沿中断 SETB IT1
EA=1; // SETB EA
EX1=1; // 允许INT1中断 SETB EX1
ET0=1; // SETB ET0
while(1); // SJMP $

}

void int1(void) interrupt 2 //I_INT1:
{
TR0 = 1; // SETB TR0
while(!P3_3); // JNB P3.3,$
tmp_60h = TL0; // MOV 60H,TL0
tmp_61h = tmp_r0; // MOV 61H,R0
tmp_r0 = 0; // MOV R0,#0
TL0 = 0; // MOV TL0,#0
TR0 = 0; //CLR TR0
}

void timer0(void) interrupt 1 //I_T0:
{
TF0 = 0; // CLR TF0
tmp_r0++; // INC R0