|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
#define PIN0 P0; //数码管段选端
#define PIN1 P1; //数码管位选端
uint cnt=0; //1s的次数的计数值
uint num=0; //进入中断次数的计数值(一次50ms)
uint num1=0; //0.001s的次数的计数值
uint haomiaou=0;
uchar code table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
//不带小数点的共阴极数码管段码0-9
uchar code table1[]={0xbf,0x86,
0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//带小数点的共阴极数码管段码0-9
char code table2[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//不带小数点的共阳极数码管段码0-9
uint a,b,c,d,e,f,g,w;
void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w); //声明显示函数
void InitTimer0(); //声明定时器初始化函数
void Delayms(uint x); //声明延时函数
void main ()
{
uint haomiao,haomiao1,haomiao2,s,s1,min,min1,minu=0,shi,shiu=0;
//分别是毫秒的个位,毫秒的十位,毫秒的百位,
//秒的个位,秒的十位,分的个位,分的十位,时的各位
InitTimer0(); //初始化定时器
while(1) //进入死循环
{
//Delayms(20); //延时消抖
num=0; //进入中断次数的计数值(一次50ms)
num1=0; //进入中断次数值清0
haomiaou=0; //毫秒的计数值清0
cnt=0; //秒的计数值清0
minu=0; //分的计数值清0
shiu=0; //时的计数值清0
}
if(num1>=200) //检测是否达到0.1s,(两百个50ms)
{
num1=0; //进入中断次数值清零
haomiao++; //毫秒秒的个位的计数值加1
if(haomiao>=10) //若毫秒的个位计数值达到10
{
haomiao=0; //清零毫秒的个位的计数值
num1=0;//进入中断次数值置0
}
}
if(num>=20) //判断计时时间是否达到1s(20个50ms)
{
cnt++; //秒的计数值加1
if(cnt>=60) //判断是否达到60s
{
cnt=0; //若达到60s,将秒的计数值置零
minu++; //分的计数值加1
TR0=!TR0; //达到60分钟则关闭定时器并清零所有的计数值
num1=0;
num=0;
haomiao=0;
cnt=0;
minu=0;
}
}
haomiao=haomiaou%10; //从毫秒的计数值里面分离毫秒的个位
haomiao1=haomiaou/10; //从毫秒的计数值里面分离毫秒的十位
haomiao2=haomiaou/100; //从毫秒的计数值里面分离毫秒的百位
s=cnt%10; //从秒的计数值里面分离秒的个位
s1=cnt/10; //从秒的计数值里面分离秒的十位
min=minu%10; //从分的计数值里面分离分的个位
min1=minu/10; //从分的计数值里面分离分的十位
Display(haomiao,haomiao1,haomiao2,s,s1,min,min1,shi); //显示这8个数
}
void InitTimer0() //定时器初始化函数
{
TMOD=0x10; //选择定时器1的工作方式1
TH0=(65536-45872)/65536; //装初值(定时50ms),晶振11.0592MHz
TL0=(65536-45872)%65536;
EA=1; //打开总中断
ET0=1; //打开定时器中断
TR0=0; //先不要启动定时器
}
void TI_time()interrupt 1 //定时器中断服务函数
{
TH0=(65536-45872)/65536; //重装初值
TL0=(65536-45872)%65536;
num++; //让进入中断次数值加1,用于判断是否达到1s
num1++; //让进入中断次数值加1,用于判断是否达到0.1s
}
void Delayms(uint x) //延时xms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w) //定义显示函数
{
PIN0 = table[a]; //毫秒的个位的段选
PIN1 = 0x7f; //毫秒的个位的位选
Delayms(5);
PIN0=table1[b]; //毫秒的十位的段选
PIN1=0xbf; //毫秒的十位的位选
Delayms(5);
PIN0=table1[c]; //毫秒的百位的段选
PIN1=0xdf; //毫秒的百位的位选
Delayms(5);
PIN0=table[d]; //秒的个位的段选
PIN1=0xef; //秒的个位的位选
Delayms(5);
PIN0=table1[e]; //秒的十位的段选
PIN1=0xf7; //秒的十位的位选
Delayms(5);
PIN0=table[f]; //分的个位的段选(带小数点)
PIN1=0xfb; //分的个位的位选
Delayms(5);
PIN0=table1[g]; //分的十位的段选
PIN1=0xfd; //分的十位的位选
Delayms(5);
PIN0=table[w]; //时的个位的段选
PIN1=0xfe; //时的个位的位选
Delayms(5);
}
|
|