小学生
最后登录1970-1-1
在线时间 小时
注册时间2022-10-14
|
楼主 |
发表于 2022-10-21 17:06:28
|
显示全部楼层
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uint num,disnum;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选编码
display(uint); //数码管显示函数声明
delay(uchar); //延时函数声明
void main()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-50000)/256; //给定时器0装初值,12M晶振定时时间为50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
if(num==20) //如果到了20次,说明1秒时间到了
{
num=0; //然后把num的值清0,让它重新再计20次
if(disnum==1000) //这个数用来送到数码管显示,到1000后归0
disnum=0;
disnum++; //每到1秒钟,disnum的值加1
}
display(disnum); //数码管显示
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256; //重装初值,12M晶振隔间50ms重装一次
TL0=(65536-50000)%256;
num++; //每中断一次,num的值加1
}
display(uint disnum) //数码管显示函数
{
P0=0xff; //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
wela=1;
wela=0;
P0=table_du[disnum/100]; //百位上的数
dula=1;
dula=0;
P0=0xfe; //第1个数码管位选值
wela=1;
wela=0;
delay(10); //延时
P0=0xff; //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
wela=1;
wela=0;
P0=table_du[disnum%100/10]; //十位上的数
dula=1;
dula=0;
P0=0xfd; //第2个数码管位选值
wela=1;
wela=0;
delay(10);
P0=0xff; //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
wela=1;
wela=0;
P0=table_du[disnum%100%10]; //个位上的数
dula=1;
dula=0;
P0=0xfb; //第3个数码管位选值
wela=1;
wela=0;
delay(10);
}
delay(uchar x) //延时函数
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
} |
|