51单片机求这个时钟的c语言程序

51单片机求这个时钟的c语言程序,第1张

以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。

/ 本程序中,晶振为12MHz, /

/ 时间控制采用定时中断控制方式。 /

/ 模式和时间调整采用查询方式。 /

#include<reg52h>

sbit P20=P2^0; //分个位控制端

sbit P21=P2^1; //分十位控制端

sbit P22=P2^2; //时个位控制端

sbit P23=P2^3; //时十位控制端

sbit led=P2^7; //second display led

sbit key0=P3^0; //模式设置

sbit key1=P3^1; //加

sbit key2=P3^2; //减

unsigned char hour,min,sec,T50ms;

unsigned char modstate; //模式状态

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

void init(); //初始化子程序声明

void delay500us(unsigned char X); //延时子程序声明

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

void display001(); //显示子程序声明

void display002(); //显示子程序声明

void keyscan(); //按键识别子程序声明

void main()

{

init();

while(1)

{

keyscan();

}

}

void init() //初始化子程序

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

ET0=1;

EA=1;

TR0=1;

}

void delay500us(unsigned char X)

{

unsigned char i,j;

for(i=X;i>0;i--)

for(j=248;j>0;j--);

}

void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

T50ms++;

if(T50ms>=20)

{

T50ms=0;

sec++;

if(sec>=60)

{

sec=0;

min++;

if(min>=60)

{

min=0;

hour++;

if(hour>=24)hour=0;

}

}

}

}

void display()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(5);

if(T50ms<=10)led=0;

if(T50ms>10)led=1;

}

void display001()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(10);

}

void display002()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(10);

}

void keyscan() //按键识别钟程序

{

while(modstate==0)

{

display();

if(key0==0)

{

display();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display001(); //等待按键释放。

}

}

////

while(modstate==1)

{

display001();

if(key0==0)

{

display001();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display002(); //等待按键释放。

}

if(key1==0)

{

display001();

if(key1==0)

{

hour++;

if(hour>=24)hour=0;

while(key1==0)display001();

}

}

if(key2==0)

{

display001();

if(key2==0)

{

hour--;

if(hour>=24)hour=0;

while(key2==0)display001();

}

}

}

////

while(modstate==2)

{

display002();

if(key0==0)

{

display002();

if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display(); //等待按键释放。

}

if(key1==0)

{

display002();

if(key1==0)

{

min++;

if(min>=60)min=0;

while(key1==0)display002();

}

}

if(key2==0)

{

display002();

if(key2==0)

{

min--;

if(min>=60)min=0;

while(key2==0)display002();

}

}

}

}

两个参看啊:

第一个:

算法:将当前时间显示到屏幕,当时间发生变化时,清屏,显示新的时间(当有键盘 *** 作时退出程序)。

显示时间格式:小时:分钟:秒

/ DEV C++ Win XP/

#include <stdioh>

#include <stdlibh>

#include <conioh>

#include <timeh>

typedef struct

{

int x;

int y;

}Point;

time_t now;

struct tm pt,t1,t2;

int printpoint(Point p)

{

Point p1;

p1x=px+2; p1y=py+4;

gotoxy(p1x,p1y); printf("%c%c",2,2);

gotoxy(p1x, p1y+1); printf("%c%c",2,2);

p1y+=4;

gotoxy(p1x,p1y); printf("%c%c",2,2);

gotoxy(p1x,p1y+1); printf("%c%c",2,2);

return 0;

}

int print0(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else

printf("%c%4s%c",2," ",2);

}

return 0;

}

int print1(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

printf("%5s%c"," ",2);

}

return 0;

}

int print2(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%5s%c"," ",2);

else

printf("%c",2);

}

return 0;

}

int print3(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int print4(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i<6) printf("%c%4s%c",2," ",2);

else if(i==6)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%5s%c"," ",2);

}

return 0;

}

int print5(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c",2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int print6(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c",2);

else

printf("%c%4s%c",2," ",2);

}

return 0;

}

int print7(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0) printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%5s%c"," ",2);

}

return 0;

}

int print8(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%c%4s%c",2," ",2);

}

return 0;

}

int print9(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c%4s%c",2," ",2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int clear(Point p)

{

int i=0;

for(;i<13;i++)

gotoxy(px,py+i); printf("%16s"," ");

return 0;

}

int printtime(Point p, int n)

{

int a,b;

Point pp;

a=n/10, b=n%10;

ppx=px+8, ppy=py;

switch(a)

{

case 0: print0(p); break;

case 1: print1(p); break;

case 2: print2(p); break;

case 3: print3(p); break;

case 4: print4(p); break;

case 5: print5(p); break;

}

switch(b)

{

case 0: print0(pp); break;

case 1: print1(pp); break;

case 2: print2(pp); break;

case 3: print3(pp); break;

case 4: print4(pp); break;

case 5: print5(pp); break;

case 6: print6(pp); break;

case 7: print7(pp); break;

case 8: print8(pp); break;

case 9: print9(pp); break;

}

return 0;

}

int main()

{

Point phour, pmin, psec,point1,point2;

phourx=9, pminx=32, psecx=55;

phoury=pminy=psecy=7;

point1x=25, point2x=49;

point1y=point2y=7;

clrscr();

textbackground(BLUE);

textcolor(YELLOW);

now=time(0);

pt=localtime(&now);

t1=pt;

printtime(phour, t1tm_hour);

printpoint(point1);

printtime(pmin, t1tm_min);

printpoint(point2);

printtime(psec, t1tm_sec);

while(1)

{

now=time(0);

pt=localtime(&now);

t2=pt;

if(t2tm_sec!=t1tm_sec)

{

t1=t2;

clrscr();

printtime(phour, t1tm_hour);

printpoint(point1);

printtime(pmin, t1tm_min);

printpoint(point2);

printtime(psec, t1tm_sec);

}

if(bioskey(1)==0) continue;

else exit(0);

}

return 0;

}

晕,还有一份字数限制了

#include <timeh>

#include <stdioh>

#include <stdlibh>

#define BUF_SIZE 80

int main()

{

time_t t;

struct tm tm;

char s[BUF_SIZE];

if(time(&t) == ((time_t)-1)) return 1;

tm = localtime(&t);

if(!tm) return 1;

strftime(s, sizeof(s), ":%H:%M:%S", tm);

printf("%s\n", s);

system("pause");

return 0;

}

CLOCK()函数:

clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t

clock(void)

;

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock

tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型,在timeh文件中,我们可以找到对它的定义:

#ifndef

_CLOCK_T_DEFINED

typedef

long

clock_t;

#define

_CLOCK_T_DEFINED

#endif

很明显,clock_t是一个长整形数。在timeh文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define

CLOCKS_PER_SEC

((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void

elapsed_time()

{

printf("Elapsed

time:%u

secs\n",clock()/CLOCKS_PER_SEC);

}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#include

<stdioh>

#include

<stdlibh>

#include

<timeh>

int

main(void)

{

long

i

=

10000000L;

clock_t

start,

finish;

double

duration;

/

测量一个事件持续的时间/

printf(

"Time

to

do

%ld

empty

loops

is

",

i)

;

start

=

clock();

while(

i--

);

finish

=

clock();

duration

=

(double)(finish

-

start)

/

CLOCKS_PER_SEC;

printf(

"%f

seconds\n",

duration

);

system("pause");

}

在笔者的机器上,运行结果如下:

Time

to

do

10000000

empty

loops

is

003000

seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

time_t

time(

time_t

timer

);

返回值是1970年到现在的秒数

用long型接就可以了

参数也是同样意义

long

time_s

=

0;

time_s

=

time(

NULL

);

//

time_s就是1970年到现在的秒数

或者

long

time_s

=

NULL;

time(time_s);

//

time_s就是1970年到现在的秒数

要计算前后一段时间的话之前取一次time,之后取一次相减就知道用了多少秒了

以上就是关于51单片机求这个时钟的c语言程序全部的内容,包括:51单片机求这个时钟的c语言程序、四位数字时钟设计 C语言程序、c语言 数字时钟程序 要求显示格式为:HH:MM:SS等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9456710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存