原创 【单片机基础-12】电子时钟

2023-3-26 20:49 568 4 4 分类: MCU/ 嵌入式 文集: 单片机基础

风风雨雨二十载,多少bug在心间。

代码编译不通过,急得抓耳直挠腮。

回想当年恩师讲,基础知道全忘干。

忙里偷闲回首看,权当引玉的抛转。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

电路图

2、程序设计

#include

#define uchar unsigned char

#define uint unsigned int

uchar a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0xbf}; //0~9,-的字形码

uchar miao,fen,shi,v; //定义秒、分钟、小时的变量,并初始化为 //0。后面会介绍为何为0。

void delay(uint m);

void main()

{ //定时计数器T0初始化程序

TMOD=0x01; //定时功能、工作方式1

TH0=(65535-50000)/256; //定时时间50ms

TL0=(65535-50000)%256;

EA=1; //开总中断

ET0=1; //开T0中断

TR0=1; //启动T0

while(1)

{

P0=a[miao%10]; //取秒的个位数作为字形码数组下标

P2=0x80; //右一位的位码输送给P2

delay(1); //短暂延时

P0=0xff;P2=0x00; //消隐

P0=a[miao/10]; //将秒的十位数的字形码输送给P0

P2=0x40; //右二位的位码输送给P2

delay(1);

P0=0xff;P2=0x00;

P0=a[10]; //将“-”的字形码输送给P0

P2=0x20; //右三位的位码输送给P2

delay(1);

P0=0xff;P2=0x00;

P0=a[fen%10]; //取分钟的个位数作为字形码数组下标

P2=0x10; //右四位的位码输送给P2

delay(1);

P0=0xff;P2=0x00;

P0=a[fen/10]; //将分的十位数的字形码输送给P0

P2=0x08; //将左四位的字形码输送给P2

delay(1);

P0=0xff;P2=0x00;

P0=a[10]; //将“-”的字形码输送给P0

P2=0x04;

delay(1);

P0=0xff;P2=0x00;

P0=a[shi%10];

P2=0x02;

delay(1);

P0=0xff;P2=0x00;

P0=a[shi/10];

P2=0x01;

delay(1);

P0=0xff;P2=0x00;

}

}

void delay(uint m)

{

uchar i;

while(m--)

for(i=0;i<120;i++);

}

void t0() interrupt 1

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256; //重装初值

v++; //变量v为50ms的累加

if(v==20) //v=20时,50ms*20=1s

{

v=0;

miao++; //每过1s秒自加1,直到加到60清零

if(miao==60)

{

miao=0;

fen++; //每过60s,fen自加1,直到加到60清零

}

if(fen==60)

{

fen=0;

shi++;

}

if(shi==24) shi=0;

}

}

变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。如上述程序中,

void delay(uint m)

{

uchar i;

while(m--)

for(i=0;i<120;i++);

}

i变量只适用于延时函数内部,所以i为局部变量。

全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。一个局部变量在被其它对象引用时,会是一个空值。但全局变量却不会出现这种情况。如上述程序中,变量miao、fen、shi、v均为全局变量,在定义时如果没有初始赋值,则自动初始化为0。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条