void pause0() interrupt 0
{
TR0=0; //你在外部中断0中把定时器0禁止了,退出外部中断后,没有开启。
}
/
你可以这样写,第一次进入外部中断关闭定时器0,
第二次进入外部中断就打开定时器0,然后循环,如下!
/
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
uchar aa,num;
bit temp=0; //用于存储进入外部中断的标志,第一次进入后取反为1
void main()
{
while(1)
{
TMOD=0x01;
EA=1;
EX0=1;
ET0=1;
IT0=1; //这时改为下降沿触发中断
TR0=1;
aa=0xfe;
P1=aa;
while(1)
{
if(num==20)
{
num=0;
aa=_crol_(aa,1);
P1=aa;
}
}
}
}
void timer0() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
num++;
}
void pause0() interrupt 0
{
temp = ~temp;
if(temp)TR0=0;
else TR0=1;
}
case 0 : ADDR0=0; ADDR1=0; ADDR2=0;P0=number[a[0]]; break;
case 1 : ADDR0=1; ADDR1=0; ADDR2=0;P0=number[a[1]]; break;
case 2 : ADDR0=0; ADDR1=1; ADDR2=0;P0=number[a[2]]; break;
case 3 : ADDR0=1; ADDR1=1; ADDR2=0;P0=number[a[3]]; break;
你每次切LED的时候,先切了地址线,没有动数据,导致上一个LED的数据,会在下一个地址上出现,瞬间闪烁,点亮不该亮的段位
建议先将P0=0,小延时,然后输出新地址线,然后输出新的LED数据
程序如下:
#include <reg52h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//点亮第一个灯
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延时1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什么也不做
}
}
//点亮第二个灯
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//点亮剩余的灯
//省略……
while(1);
}
扩展资料:
流水灯几点说明:
void:因为该延时函数不需要返回值,所以写为void
delay1s:该函数的函数名,命名需要符合C语言的标识符命名规则。
(): 不需要传入参数,所以括号中为空
至此我们可以把流水灯程序写为以下形式:
sbit P10=p^0 少了分号,而且定义端口最右边的p要大写 TH0=(655535-1000)/256;TL0=(65535-1000)%256;这里的是延时,这里只用看1000就知道延时1ms,如果里面的1000换成10000就是延时10ms
以上就是关于51单片机程序运行异常全部的内容,包括:51单片机程序运行异常、51单片机计数器程序怎么不稳定 求解答 下面是我的程序。(其中key.h已经设定好了各个使能端 没错)、51单片机流水灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)