编写51单片机程序,方波程序,at89s52的单片机

2024-12-22 19:01:13
推荐回答(2个)
回答1:

以下程序仿真成功,你试试看。

#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) {;}
}

回答2:

你把产生的程序放到中断里面,看看效果如何

//晶振为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);

}