每计一次为一个机器周期,如果振荡频率为12MHz,则一个机器周期为1us,一般采用方法,是设计一基本延时,然后通过一参数来实现不同的延时要求,象你程序中的NUM.
按12MHz来算,如果要产生1000Hz的方波信号,也就是周期为1ms的方波,则要计数1000次就好,所以我认为,最好固定X,然后改变NUM实现.
比如固定X为1000,当NUM=1时,表示为1000Hz,当NUM=10就为100Hz了,而当NUM=100就为10Hz,当NUM=5就为200Hz.按照这个思路,以振荡频率为12MHz来算,程序可更改为:
#include "reg51.h"
#define uint unsigned int
uint num,x;
sbit a=P0^6;
sbit b=P1^0;
sbit c=P1^1;
sbit d=P1^2;
sbit e=P1^3;
main()
{
while(1)
{
if(b==0) num=100; //10hz
else if(c==0) num=10; //100hz
else if(d==0) num=5; //200hz
else num=1; //1000hz
TMOD=0x10;
EA=1;
ET1=1;
TR1=1;
x=0;
}}
void T1_time()interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
x++;
if(x==num) {x=0;a=~a;}
}
#include
sbit P10=P1^0;
void gr()interrupt 1 using 3
{TH0=(65536-500)/256;
TL0=(65536-500)%256;
TL0=0x17;
P10=!P10;
}
main()
{ET0=1;
EA=1;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
while(1);
}
试试~将250赋值给X~你用的是12M晶振?
在中断函数中将
if(x==num) {x=0;a=~a;}
改为:
a=~a