C51入门5,动态数码管显示实验
扫描二维码
随时随地手机看文章
实验一:要求:利用动态扫描和定时器1在数码管上显示出从7432开始以1/10秒的速度往下递减直至7398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“ABCD”。到此保持住。
程序:
//数码动态显示
#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);
//延时函数
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
//主函数
void main()
{
init();
while(1)
{
if(flag1!=1)
display(7,bai,shi,ge);
else
display(10,11,12,13);//显示A,B,C,D
}
}
//系统初始化
void init()
{
shu=432;//开始数目是432
temp=0xfe;
P1=temp;//数目给位地址
TMOD=0x11;//设置定时器0和1的工作方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器中断0
ET1=1;//开定时器中断1
TR0=1;//启动定时器中断0
TR1=1;//启动定时器中断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);//循环右移动,控制灯的闪烁
P1=temp;
}
}
else
{
if(t0%4==0)//灯全亮和灭控制
P1=~P1;
if(t0==60)//灯全灭
{
TR0=0;
P1=0xff;
flag1=1;
}
}
}
//中断1,工作是模式3,控制数码管
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;//数自减
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
if(shu==398)
{
TR0=0;//关中断0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;//开打中断0
flag=1;//标志位为1
t0=0;
P1=0xff;
TR1=0;//关中断1
}
}
}
//显示函数
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);
}