51单片机流水灯与数码管显示实验设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4; //这个key没用到,具体功能可以完善函数
uint temp,shu=432;
uchar aa,bb,cc,bai,shi,ge,flag,flag1,t0,t1,count;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x76,0x38,0x3f,0};
void init();
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge); void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
init();
while(1)
{
if(flag!=1)//减数还未到指定值
{
temp=_crol_(temp,1);//流水灯
P1=temp;//赋值给P1口
delayms(10);//流水延时10ms
display(7,6,5,bai,shi,ge);
}
// if(t0%4==0) t0这个变量是T0溢出时间的倍数值,每次到指定的倍数值都会被清零,所以这个判断语句错误
// if(t0==60) t0每次到10都会被清零,所以这个判断语句错误
else if(count!=100) //没有到指定的时间3s,但这里设置的是5s,因为led闪烁的时间是50ms,这样闪烁的次数就多一点,便于看清效果
{
temp=0xff;
P1=temp;
delayms(50);//闪烁延时
temp=0x00;
P1=temp;
}
else
{
display(16,14,17,17,18,19);
temp=0xff;//关闭led
P1=temp;//这里我们可以看出在位带操作的时候P1是已定义变量,不需要中间变量过度
}
}
}
void init()
{
TMOD=0x11;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
TH1=(65535-5000)/256;
TL1=(65535-5000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
temp=0xfe;
P1=temp;
}
void timer0()interrupt 1
{
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
t0++;
if(t0==10)t0=0;//闪烁间隔时间10*50ms
if(flag==1)
{
count++;//计数3s
if(count==100)
{
EA=0;//关闭总中断,也可以写TR0=0,因为在数码管停止减数的时候已经关闭了TR1
}
}
}
void timer1()interrupt 3
{
TH1=(65535-5000)/256;
TL1=(65535-5000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
if(shu==398)
{
TR1=0;//关闭定时器1,数码管显示的内容不变
TR0=0;//这里也可以不关闭TR0直接清零
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
TR0=1;//这里的定时器0计数值的清零初始是为了3s的算时(函数里设置了5s)
flag=1;
}
}
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {
dula=1;
P0=table[aa];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[bb];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[cc];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
(注:可编辑下载,若有不当之处,请指正,谢谢!)。

相关文档
最新文档