我做的呼吸灯为什么不亮啊啊啊啊
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit led0=P0^0;
uint count,time0,time1,DIR;
void unit ( );
void main( ){
unit ( );
count=0;
time0=0;
time1=0;
DIR=0;
while (1){
if(count==100){
count=0;
if(DIR==0)
time1++;
else
time1--;
}
if(time1==1000)
DIR=1;
if(time1==0)
DIR=0;
if(time0==1000)
time0=0;
if(time0<time1)
led0=1;
else
led0=0;
}
}
void unit ( ){
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xFF;
TL0=0xFF;
TR0=1;
}
void zhongduan0( ) interrupt 1
{
time0++;
count++;
TH0=0xFF;
TL0=0xFF;
}
基本可以认定是这个原因,if(count==100),这里有漏洞,因为中断频繁,count有可能会大于100,程序就跑乱套了,你看图就能明白,程序跑第一次就飞了,就算偶尔碰巧能行,循环到下一次是还是要飞掉。红圈处都无法执行到。
你确定你的中断能进去吗?
P0^0上拉了没?换一个端口再试试看。
在天祥开发板试了,LED可以亮,貌似中断时间太短,看不到变化。
//改了4个运算符就可以呼吸了
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit led0=P0^0;
uint count,time0,time1,DIR;
void unit ( );
void main( )
{
unit ( );
count=0;
time0=0;
time1=0;
DIR=0;
while (1)
{
if(count>=100)
{
count=0;
if(DIR==0)
time1++;
else
time1--;
}
if(time1>=1000)
DIR=1;
if(time1==0)
DIR=0;
if(time0>=1000)
time0=0;
if(time0<=time1)
led0=1;
else
led0=0;
}
}
void unit ( )
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xFF;
TL0=0xFF;
TR0=1;
}
void zhongduan0( ) interrupt 1
{
time0++;
count++;
TH0=0xFF;
TL0=0xFF;
}
//改成这样效果更好些
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit led0=P0^0;
uint count,time0,time1,DIR;
//void unit ( );
void main( )
{
// unit ( );
count=0;
time0=0;
time1=0;
DIR=0;
while (1)
{
time0++;
count++;
if(count>=200)
{
count=0;
if(DIR==0)
time1++;
else
time1--;
}
if(time1>=500)
DIR=1;
if(time1==0)
DIR=0;
if(time0>=500)
time0=0;
if(time0<=time1)
led0=1;
else
led0=0;
}
}
/*
void unit ( )
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xFF;
TL0=0xFF;
TR0=1;
}
void zhongduan0( ) interrupt 1
{
time0++;
count++;
TH0=0xFF;
TL0=0xFF;
}
*/
可以可以
为什么我那个不行呢求教
好像有点明白了,每次进入中断所用的时间因为很短,导致单片机在执行每条指令时很可能多次进入中断,本来count累加到200l,结果在未执行完一条语句时,又加了一,,,,,错误是出现在这吗?
嗯嗯,学到了,谢谢你