请教关于中断和数码管的问题
#include<reg52.h>
sbitdula=P0^6;
sbitwela=P0^7;
sbitd1=P1^0;
intt=0;
voiddelay(int);
voidmain()
{
EA=1;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
ET0=1;
TR0=1;
while(1)
{
if(t==20)
{
delay(500);
t=0;
d1=~d1;
P0=0xFF;//清影
wela=1;
P0=0xFE;
wela=0;
dula=1;
P0=0x7f;
dula=0 ;
}
}
}
voidext0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
t++;
}
void delay(int time)
{
inti,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
为什么发光二极管会闪烁(而不是一直亮),而数码管不亮?
把d1=~d1;这一行去掉,数码管还是不亮。
P0=0x7F,数码管显示的也不是数字8.。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit wela=P0^7;
sbit dula=P0^6;
int t=0,num=0,led1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(int);
void main()
{
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xc0;
wela=0;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
led1=0xfe;
P1=led1;
delay(500);
led1=_crol_(led1,1);
P1=led1;
delay(500);
}
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
void delay (time)
{
chari,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
这个数码管和发光二极管都亮。
但是数码管是乱显示(显示什么数字和哪个数码管亮简直就是随机的)。
发光二极管只亮第一个,位移函数没起作用。
led1=0xfe;
P1=led1;
delay(500); (把这个delay函数去掉,只亮第二个,不去掉,只亮第一个(让它亮一段时间也是这样))
led1=_crol_(led1,1);
P1=led1;
用的是和郭天祥那本书配套的单片机.
把图贴上来看一下
什么图啊
第一个程序,个人认为中断if(a==20)这个语句中有delay(500)延时函数,时间比较长,可能会产生时序上的错误,建议将其放在中断函数之内处理,还有就是t=0应该放在delay(500)之前。
第二个程序在中断函数中,光是段选设置了,位选没有设置。发光二极管的问题,在while(1)中不应该有 led1=0xfe;应该将其放在while(1)外面,要不程序每执行一次就将第一个发光管点亮!
以上只是个人看程序的看到大概的问题,没有去进行验证,小编可以在调试一下,希望有些帮助呵呵!
你是想让两个灯同时亮?那就不要用移位了