以下程序仿真成功,你试试看。
#include
#define uchar unsigned char
#define TL_0SET (256 - 25)
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
bdata uchar x=0;
sbit p16=x^0;
sbit p17=x^1;
sbit flag=x^2;
uchar i, j;
void e0int() interrupt 0 //用外部中断0作控制开关,控制四选一数据选择器的输出
{
x++;
if(x == 4) x = 0;
P1_7 = p16;
P1_6 = p17;
}
void time0() interrupt 1
{
//T0定时25us,T0的中断服务程序
TL0 = TL_0SET + 8;//加8,是对程序做一个误差补偿,因为从进入定时中断,到执行中断里的第一句程序,是有时间间隔的,在此做一个误差补偿
i++;
P1 = i;
P1_7 = p16;
P1_6 = p17;
}
void main()
{
TR0 = 0;
TMOD = 0x02;
TL0 = TL_0SET;
TR0 = 1; //T0定时器开始工作
ET0 = 1;
EX0 = 1;//外部中断0允许
IT0 = 1;//外部中断0由下降沿触发
EA = 1;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
flag = 0;
while(1) {;}
}
你把产生的程序放到中断里面,看看效果如何
//晶振为12M,可以输出p1.0=1.25kHZ,p1.1=2.5kHZ,p1.3=5khz,1.3=10KHZ五种方波,用T0做定时器, p1.6,p1.7做四选一数据选择器的选择位
#include
#define uchar unsigned char
#define TL_0SET (256-25)
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
bdata uchar x=0;
sbit p16=x^0;
sbit p17=x^1;
sbit flag=x^2;
uchar i,j;
void e0int() interrupt 0 //用外部中断0作控制开关,控制四选一数据选择器的输出
{
x++;
if(x==4)x=0;
P1_7=p16;
P1_6=p17;
}
void time0() interrupt 1
{
//T0定时25us,T0的中断服务程序
TL0=TL_0SET+8;//加8,是对程序做一个误差补偿,因为从进入定时中断,到执行中断里的第一句程序,是有时间间隔的,在此做一个误差补偿
P1_0=~P1_0;
flag=P1_0;
if(P1_0==1)
{
P1_1=~P1_1;
if(P1_1==0)
{ P1_2=~P1_2;
if(P1_2==0) P1_3=~P1_3;
}
}
//for(i=2;i>0;i--);
//flag=P1_0;
}
void main()
{
TR0=0;
TMOD=0x02;
EA=1;
ET0=1;
EX0=1;//外部中断0允许
IT0=1;//外部中断0由下降沿触发
TL0=TL_0SET;
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
flag=0;
TR0=1; //T0定时器开始工作
while(1);
}