本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我是一名51单片机初学者,跟着郭天祥的《十天学会单片机》学习,在做第四课第三题时,要求的功能已实现,但是数码管出现闪烁,一直查不出原因,请高手诊断。谢谢了!!!!!!!!!!!!!
/************************************************************************************************
利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,
与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停
止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。
*************************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar ge,shi,bai,qian,wan,shw;
uchar code tabl[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x0};
sbit wela=P2^7;
sbit dula=P2^6;
uint a,t0,t1;
void smgxs(uchar,uchar,uchar,uchar,uchar,uchar); //声明数码管显示子函数
unsigned long b;
uint led=0x7f;
/**********时延子函数***********/
void sy(unsigned int a)
{
unsigned int b,c;
for(b=a;b>0;b--)
for(c=124;c>0;c--);
}
/***********************************/
void main()
{
P1=0x7f;
b=765432;
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TR0=1;
TR1=1;
while(1)
{
if(TR0==1)
smgxs(ge,shi,bai,qian,wan,shw);
else
smgxs(19,0,18,18,17,16);
}
}
/*******数码管显示子函数********/
void smgxs(uchar ge,uchar shi,uchar bai,uchar qian,uchar wan,uchar shw)
{
dula=1;
P0=tabl[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
sy(1);
dula=1;
P0=tabl[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
sy(1);
dula=1;
P0=tabl[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
sy(1);
dula=1;
P0=tabl[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
sy(1);
dula=1;
P0=tabl[wan];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
sy(1);
dula=1;
P0=tabl[shw];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
sy(1);
}
/****定时器0中断,以500MS速度进行流水灯从上至下移动*****/
void T0_time()interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
t0++;
if(TR1==1)
{
if(t0%500==0)
{
t0=0;
led=_cror_(led,1);
P1=led;
}
}
else
{
if(t0%200==0)
P1=~P1;
if(t0==3000)
{
TR0=0;
P1=0xff;
}
}
}
/**********定时器1中断****************/
void T1_time()interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
t1++;
if(t1==100)
{
t1=0;
b--;
shw=b/100000;
wan=b%100000/10000;
qian=b%100000%10000/1000;
bai=b%100000%10000%1000/100;
shi=b%100000%10000%1000%100/10;
ge=b%10;
if(b==765398)
{
P1=0xff;
TR1=0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
}
} |
|