#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P1^0;
uint tt;
void main()
{
TMOD=0x01; //éè???¨ê±?÷0?a1¤×÷·?ê?1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //?a×ü?D??
ET0=1; //?aT0?¨ê±?÷0?D???a1?
TR0=1; //???ˉT0
while(1)
{
if(tt=20)
{
tt=0;
d1=1;
}
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256; //??×°3??μ
TL0=(65536-50000)%256;
tt++;
}
期待现象:周期为1s的方波,P1^0的灯
实际现象:灯一直亮,我真的会无语,而且在这个程序我都还没“d1=0",他的灯就亮了。
关于我和郭老师的程序完全相同,但我的实验现象正确,而郭老师的程序的实物仿真错误。
//1?óúlesson4-1μ?×÷ó?£oá÷??μ?oíLEDóé0?a?af±??ˉ
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
uchar code table[]={ //12ò????t??1üμ???ê?μ?16??êy
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
sbit dula=P2^6;
sbit wela=P2^7;
void main()
{
num=0;
aa=0; //?ùóD±?á?μ?3?ê??ˉ
TMOD=0x01; //éè???¨ê±?÷0?a1¤×÷·?ê?1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //?a×ü?D??
ET0=1; //?aT0?¨ê±?÷0?D???a1?
TR0=1; //???ˉT0
temp=0xfe;
P1=temp;
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xc0; //????6??êy??1ü
wela=0; //?′DDμ??aà?£?6??êy??1ü??áá0
while(1)
{
delay(1000);
temp=_crol_(temp,1);
P1=temp; //ò?é?èyDDê?á÷??μ??óê±
}
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void time0() interrupt 1
{
TH0=(65536-50000)/256; //??×°3??μ
TL0=(65536-50000)%256;
aa++;
if(aa=40) //??LEDμ?±??ˉ????·?μ??D??oˉêy?D
{ //?óê±á???μ?á?
aa=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
这是把对LED的控制移到了中断函数中,结果实物实验结果:流水灯1秒1变,而LED变得非常快。
把对LED的控制放在主函数中是,其变化与流水灯观察同步,但是现在的问题是我明明设置了50ms*40=2s,但是实物的实验结果不太对。
我的妈呀,就感觉很奇怪,明明内容一样,但我的if好像起不了作用,但是我将老师的一复制,替换到我的if那里,就可以了,真是不明所以。
关于把if(aa==20)写成if(a=20),结果一直调试不出来这件事。我真的要被我自己气死了。
#include<reg52.h> //??óú?-1y×??oμ÷ê?o?á?3ìDò£?óDê±ê?2??é??òò??£?μ?2?òa°??ùóD×??o2??aμàμ??¢?Yê±?ò2?3?à′?êìaμ??êìa£?1éμ?èí?téíé?
#define uint unsigned int
#define uchar unsigned char
uchar aa,numwei,numduan;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void main()
{
numduan=0;
numwei=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(aa==10)
{
aa=0;
if(numduan>15)
numduan=0;
dula=1;
P0=table[numduan];
dula=0;
numduan++;
wela=1;
P0=tablewe[numwei];
wela=0;
numwei++;
if(numwei>5)
numwei=0;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
关于这个代码,可喜可贺之自己调试出来
功能展示:LED由0-F依次亮。
经验与教训:不要把问题都推给别人,推给电脑,推给打印机,不要怨天尤人,自己的错误自己来承担,实验问题肯定是自身原因导致差池,遇到问题总得先从自身找原因,记住啦。
但是,这有时候也是很令人莫名奇妙,我的问题:关于无参数值返回的函数在调用时,一定要加上(),小问题就会造成大错误。
还有这段明明正确,但很奇怪,后来又可以了。
void main()
{
init(); //3?ê??ˉ×ó3ìDò
while(1)
{
if(aa==20) //ê?·?μ?á?ò????ó
{
temp++;
aa=0;
if(temp==100)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
display(bai,shi,ge); //??μ?ò????ó£?μ÷ó???ê?3ìDò
}
}
|