第1个回答 2009-12-19
假设,信号从p0.0输入,且不计算晶振频率(你自己算)
ORG 00H
LJMP START
ORG 0BH
LJMP TIM
ORG 30H
START:
MOV SP,#7FH
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV IE,#10000010B
MOV TMOD,#00000001B
MOV TH0,#10H;微调。根据你的晶振自己算
MOV TL0,#12H
SETB TR0
LOOP:
JB P0.0,$
INC R0
CJNE R0,#10,OVER
MOV R0,#00H
INC R1
CJNE R1,#10,OVER
MOV R1,#00H
INC R2
CJNE R2,#10,OVER
MOV R2,#00H
INC R3
CJNE R3,#10,ERRO
OVER:
AJMP LOOP
ERRO:
MOV R3,#0EH
MOV R2,#0EH
MOV R1,#0EH
MOV R0,#0EH
SJMP $
TIM:
MOV TH0,#20H;粗调,根据你的晶振自己算
MOV TL0,#30H
INC R4;中断次数。根据你的晶振自己算
CJNE R4,#13H,OVER_TIM;如果时间未到,结束
DEC SP;否则,抛弃断点
DEC SP
LJMP OUT;跳转到输出程序
OVER_TIM:
RETI
OUT:
....;这些是输出程序,你根据自己的硬件自己写
LJMP LOOP;跳转到loop
END
第2个回答 2009-12-19
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,i=0,k;
uint x,m,n;
sbit led =P3^2;
sbit buzzer=P3^5;
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99,
0x49, 0x41, 0x1f, 0x01, 0x09};
void delayxms(uint);
void display();
void main()
{
while(1)
{
shi= i/10;
ge = i%10;
display();
}
}
void display()
{
P2=0x01;
P0= table[ge];
delayxms(5);
P2 = 0x02;
P0= table[shi];
delayxms(5);
if(led==0)
{
delayxms(50);
if(led==0)
{
i++;
if(i==59)
{
i=0;
}
}
}
}
void delayxms(uint x)
{
for(m=x;m>0;m--)
for(n=256;n>0;n--);
}
以上这个程序是自己练习时写的,能计数到59.。。本回答被网友采纳