利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。

下面两个程序有区别吗?

#include<reg52.h>
#define uchar unsigned char
uchar t;sbit m=P1^0;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
if(t==20)
{
t=0;
m=~m;
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}

#include<reg52.h>
#define uchar unsigned char
uchar t;sbit m=P1^0;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
m=~m;
}
}

有很大的区别:
第一段程序:在main末尾没有while死循环,那么if这个语句只执行一次,然后从头开始执行程序么这样LED 定时器永远都在初始化,而且只执行很短暂的时间,根本不会体现出来。
第二段程序,在main中有whil死循环,那么程序就等待定时器中断,等待t的增加,这样LED就能闪烁了。
所以一段程序是没有意义的,第二段程序能正常运行。
希望我的回答能帮助到你 。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-16
#include<reg52.h>
#define uchar unsigned char //宏定义,unsigned char 取值范围是0-255梁智钧//
uchar t;
sbit D=P1^0; //位定义//
void main()
{
t=0; //给t赋初值//
TMOD=0x01; //定时器T0方式1//
TH0=(65536-50000)/256; //高8位装初值//
TL0=(65536-50000)%256; //低8位装初值//
EA=1; //开总中断//
ET0=1; //定时器/计数器0中断允许位//
TR0=1; //启动定时器0//
while(1)
{
if(t==10) //中断10次为500mS//
{
t=0; //当t=10次后,复位//
D=~D; //取反//
}
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}