C51入門5,動(dòng)態(tài)數(shù)碼管顯示實(shí)驗(yàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
實(shí)驗(yàn)一:要求:利用動(dòng)態(tài)掃描和定時(shí)器1在數(shù)碼管上顯示出從7432開始以1/10秒的速度往下遞減直至7398并保持顯示此數(shù),與此同時(shí)利用定時(shí)器0以500MS速度進(jìn)行流水燈從上至下移動(dòng),當(dāng)數(shù)碼管上數(shù)減到停止時(shí),實(shí)驗(yàn)板上流水燈也停止然后全部開始閃爍,3秒后(用T0定時(shí))流水燈全部關(guān)閉、數(shù)碼管上顯示出“ABCD”。到此保持住。
程序:
//數(shù)碼動(dòng)態(tài)顯示
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x28,0xeb,0x32,0xa2,
0xe1,0xa4,0x04,0xea,
0x00,0x80,0x60,0x25,
0x3c,0x23,0x34,0x74};
uchar temp,t0,t1,bai,shi,ge,flag,flag1;
uint shu;
void init();
void display(uchar,uchar,uchar,uchar);
//延時(shí)函數(shù)
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
//主函數(shù)
void main()
{
init();
while(1)
{
if(flag1!=1)
display(7,bai,shi,ge);
else
display(10,11,12,13);//顯示A,B,C,D
}
}
//系統(tǒng)初始化
void init()
{
shu=432;//開始數(shù)目是432
temp=0xfe;
P1=temp;//數(shù)目給位地址
TMOD=0x11;//設(shè)置定時(shí)器0和1的工作方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時(shí)器中斷0
ET1=1;//開定時(shí)器中斷1
TR0=1;//啟動(dòng)定時(shí)器中斷0
TR1=1;//啟動(dòng)定時(shí)器中斷1
}
//中斷0,工作在模式1,控制LED燈
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(flag!=1)
{
if(t0==10)
{
t0=1;
temp=_crol_(temp,1);//循環(huán)右移動(dòng),控制燈的閃爍
P1=temp;
}
}
else
{
if(t0%4==0)//燈全亮和滅控制
P1=~P1;
if(t0==60)//燈全滅
{
TR0=0;
P1=0xff;
flag1=1;
}
}
}
//中斷1,工作是模式3,控制數(shù)碼管
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;//數(shù)自減
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
if(shu==398)
{
TR0=0;//關(guān)中斷0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;//開打中斷0
flag=1;//標(biāo)志位為1
t0=0;
P1=0xff;
TR1=0;//關(guān)中斷1
}
}
}
//顯示函數(shù)
void display(uchar aa,uchar ba,uchar sh,uchar g)
{
P0=table[aa];//位選
P2=0x7f;//段選
delay(5);
P0=table[ba];
P2=0xbf;
delay(5);
P0=table[sh];
P2=0xdf;
delay(5);
P0=table[g];
P2=0xef;
delay(5);
}