51单片机的电子钟以及lcd1602显示器的工作原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机的电子钟以及lcd1602显示器的工作原理

基于51单片机的电子钟C语言程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

/*七段共阴管显示定义*/

uchar code

dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,

0xBF,0x86,0xCB,0xCF,0x EF,0xED,0xFD,0x87,0xFF,0xDF};

/*定义并初始化变量*/

uchar seconde=0;

uchar minite=0;

uchar hour=12;

uchar mstcnt=0;

sbit P1_0=P1^0; // second 调整定义sbit P1_1=P1^1; //minite调整定义

sbit P1_2=P1^2; //hour调整定义

/*函数声明*/

void delay(uchar k ); //延时子程序

void time_pro( ); //时间处理子程序

void display( ); //显示子程序

void keyscan( ); //键盘扫描子程序

/*****************************/

/*延时子程序*/

/****************************/

void delay (uchar k)

{

uchar j;

while((k--)!=0)

{

for(j=0;j<125;j++)

{;}

}

}

/**************************/

/*时间处理子程序*/

/**************************/

void time_pro( void)

{

if(seconde==60)

//秒钟设为60进制

{ seconde=0;

minite++;

if( minite==60) //分钟设为60进制

{ minite=0;

hour++;

if(hour==24) //时钟设为24进制

{hour=0; }

}

}

}

/*****************************/

/* 显示子程序*/

/*****************************/

void display(void)

{

P2=0xfe;

P0=dispcode[hour/10];

//显示小时的十位

delay(4);

P2=0xfd;

P0=(dispcode[(hour%10)])|0X80; //显示小时的个位

delay(4);

P2=0xfb;

P0=dispcode[minite/10]; //显示分的十位

delay(4);

P2=0xf7;

P0=(dispcode[minite%10])|0X80; //显示分的个位

delay(4);

P2=0xef;

P0=dispcode[seconde/10]; //显示秒的十位

delay(4);

P2=0xdf;

P0=dispcode[seconde%10]; //显示秒的个位

delay(4);

}

/*******************************/

/*键盘扫描子程序*/

/*******************************/

void keyscan (void)

{

if(P1_0==0) //按键1秒的调整

{

delay(30);

if(P1_0==0)

{

seconde++;

if(seconde==60)

{seconde=0; }

}

}

if(P1_1==0) //按键2分的调整

{

delay(30);

if(P1_1==0)

{

minite++;

if(minite==60)

{minite=0;}

}

}

if(P1_2==0) //按键3小时的调整

{

delay(30);

if(P1_2==0)

{

hour++;

if(hour==24)

{hour=0; }

}

}

}

void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms 中断一次

{

TH0=0x3c;

TL0=0xb0;

TMOD = 0x11;

mstcnt++;

if(mstcnt==20)

{

seconde++;

mstcnt=0; //注意点。对计数单元的清零十分的重要,本次调试中就是

} //因为忽略了这一点,给我早成了很大的被动。

}

/**************************/

/*主函数*/

/**************************/

void main(void)

{ P1=0xff; //初始化p1口,全设为1

TMOD = 0x11; //time0为定时器,方式1

TH0=0x3c; //预置计数初值

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

while (1)

{

keyscan( ); //按键扫描

time_pro( ); //时间处理

display( ); //显示时间

}

}

相关文档
最新文档