搜索
您的当前位置:首页51单片机 数码管 定时器 准确时间

51单片机 数码管 定时器 准确时间

来源:世旅网


//51单片机控制四个数码管,通过定时器准确定时一秒,在数码管上显示小时和分钟,数码管上的小数点以间隔一秒的时间闪烁

#include \"reg51.h\"

unsigned char code table[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char l_posit=0; //显示位置

unsigned char ly_tt=0; //作为计数时间量

unsigned char ly_miao=0; //秒

unsigned char ly_fen=0; //分

unsigned char ly_shi=3; //时

sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)//表:共阳数码管 0-9

void display(unsigned char shi,unsigned char fen);//定义显示函数,参数为显示时分

void delay(unsigned int timer);

void init(); //初如化函数

void main()

{

init(); //初始化定时器0

while(1)

{

if(ly_tt==20) //20*50ms为1秒

{

ly_tt=0;

ly_miao++;

if(ly_miao==60)

{

ly_miao=0;

ly_fen++;

if(ly_fen==60)//满60分清0

{

ly_fen=0;

ly_shi++;

if(ly_shi==24)//满24小时清0

ly_shi=0;

}

}

}

display(ly_shi,ly_fen); //显示变量内容

delay(100);

}

}

void init()//初始化定时器0函数(定时50ms)

{

ly_tt=0;

TMOD=0X01; //设置定时器0为模式一,即16位计算模式

TH0=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间

TL0=(65536-50000)%256;

EA=1; //开启总中断

ET0=1; //开启定时器0中断

TR0=1; //启动定时器

}

//中断函数,关键字\"interrupt\" , 这是C语言的中断函数表示法,1表时定地器0

void timer() interrupt 1

{

TH0=(65536-50000)/256; //重新赋值

TL0=(65536-50000)%256;

ly_tt++; //50毫秒计时

}

void display(unsigned char shi,unsigned char fen)//显示函数,参数为显示内容

{

P0=0XFF; //关闭显示

switch(l_posit)

{

case 0: //选择千位数码管,关闭其它位

SMG_q=0;

SMG_b=1;

SMG_s=1;

SMG_g=1;

P0=table[shi/10]; //输出显示内容

break;

case 1: //选择百位数码管,关闭其它位

SMG_q=1;

SMG_b=0;

SMG_s=1;

SMG_g=1;

P0=table[shi%10];

if(ly_tt>=10)

{

P0&=0x7f;

} //前半秒不显示,后半秒显示,下一秒前半秒不显示,后半秒显示,这样前一次

显示距离下一次显示正好一秒钟(一般编程都这样)

break;

case 2: //选择十位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=0;

SMG_g=1;

P0=table[fen/10];

break;

case 3: //选择个位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=1;

SMG_g=0;

P0=table[fen%10];

break;

}

l_posit++; //每调用一次将轮流显示一位

if(l_posit>3)

l_posit=0;

}

void delay(unsigned int timer)//延时子函数,短暂延时

{

while(timer--);

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top