您的位置:

钟表c语言编程,时钟C语言

本文目录一览:

时钟程序(C语言)怎么写

具体代码如下:

#includegraphics.h

#includemath.h

#includedos.h

#define PI 3.1415926

//屏幕中心的坐标(640X480模式下)

#define mid_x 320

#define mid_y 240

int main()

{ int graphdriver=DETECT,graphmode;

int end_x,end_y;

struct time curtime;

float th_hour,th_min,th_sec;

initgraph(graphdriver,graphmode,"C:\\TC2"); //初始化VGA屏幕模式

setbkcolor(BLACK); //使用黑色的背景色

while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序

{ setcolor(GREEN); //把画笔设为绿色

circle(mid_x,mid_y,180); //钟的外圆

circle(mid_x,mid_y,150); //钟的内圆

circle(mid_x,mid_y,1); //画出钟的圆心

gettime(curtime); //取得系统当前时间

th_sec=(float)curtime.ti_sec*0.1047197551; //把秒针的角度化为弧度,为以后绘制时方便,下同

th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0; //分针的弧度

th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0; //时度的弧度,注意整时是12等分的,所时乘的是3.14/180*5

//计算出时针的尾的坐标(时针长70)

end_x=mid_x+70*sin(th_hour);

end_y=mid_y-70*cos(th_hour);

setcolor(RED);

line(mid_x,mid_y,end_x,end_y); //用红色线画出时针

//计算出分针坐标(分针长110)

end_x=mid_x+110*sin(th_min);

end_y=mid_y-110*cos(th_min);

setcolor(RED);

line(mid_x,mid_y,end_x,end_y); //用红色画出分针

end_x=mid_x+140*sin(th_sec);

end_y=mid_y-140*cos(th_sec);

setcolor(RED);

line(mid_x,mid_y,end_x,end_y); //同上,画出秒针,长为140

//画出钟盘上的刻度,刻度长20

line(140,240,160,240); //9点对应的大刻度

line(320,60,320,80); //12点对应的大刻度

line(500,240,480,240); //3点的刻度

line(320,420,320,400); //6点的刻度

line(410,395.7,400,378.4); //5点

line(475.7,330,458.4,320); //4点

line(475.7,150,458.4,160); //2点

line(410,84.3,400,101.6); //1点

line(230,84.3,240,101.6); //11点

line(164.3,150,181.6,160); //10点

line(164.3,330,181.6,320); //8点

line(230,395.7,240,378.4); //7点

sleep(BLUE); //这里应该是打错,停止一秒,应为sleep(1000)

cleardevice(); //清除屏幕上的显示

}

closegraph(); //关闭VGA屏幕,即返回文本方式

return 0;

}

c语言编写数字时钟

#includestdio.h

#includewindows.h

int main()

{

for(int i=0;i24;i++)

for(int j=0;j60;j++)

for(int k=0;k5;k++)

{

system("cls");

printf("%0.2d:%0.2d:%0.2d",i,j,k);

Sleep(1000);

}

}

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

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

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

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

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

#includereg52.h

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;i0;i--)

for(j=248;j0;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(T50ms10)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();

}

}

}

}

用C语言编一个数字电子时钟的程序

1.这是用windows api写的程序。所以要求是纯c的话就没有办法了

2.其中定时用了两种方法。一种是用取消息。另一种是延时队列。这里只使用了取消息的方法。延时队列由于我机器上是vc6.0,CreateTimerQueue在本人机器上无法使用,需要新的sdk,所以没有加以验证,但取消息的方式是可行的。

3.稍稍验证了下,基本满足要求。

-------------------------------------------

程序如下:

// DigitalClock.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include windows.h

#include winbase.h

typedef struct _st_time{

int hour;

int min;

int sec;

}ST_TIME;

ST_TIME g_Time; // The struct contain the hour,min and sec.

HANDLE g_hStdout; //

WORD g_cxCenter, g_cyCenter; // Center of the screen.

HANDLE g_DoneEvent; // The program could be over.

BOOL g_ThreadTerminated; // The Thread should be terminated.

#define SECOND_CIRCLE 60

#define MINUTE_CIRCLE 60

#define HOUR_CIRCLE 24

void TimeIncreaseSecond(ST_TIME st)

{

st.sec ++;

if (st.sec = SECOND_CIRCLE)

{

st.sec -= SECOND_CIRCLE;

st.min++;

if (st.min = MINUTE_CIRCLE)

{

st.min -= MINUTE_CIRCLE;

st.hour++;

if (st.hour = HOUR_CIRCLE)

{

st.hour -= HOUR_CIRCLE;

}

}

}

}

void PrintTimeToScreen(HANDLE hStdout, short cxCenter, short cyCenter, ST_TIME st)

{

char buf[64] = {0};

COORD crdPos;

// make it format to output.

sprintf (buf, "%02d:%02d:%02d", st.hour, st.min, st.sec);

crdPos.X = cxCenter - 4;

crdPos.Y = cyCenter;

SetConsoleCursorPosition(hStdout, crdPos);

printf(buf);

}

#ifdef USE_TIMERQUEUE

// if we use the timer queue function.

// Its procdure is in this.

void CALLBACK TimerRoutine (LPVOID lpParam, BOOL TimerOrWaitFired)

{

if (lpParam == NULL)

{

printf ("NULL parameters.\n");

}

else

{

ST_TIME *st = (ST_TIME *)lpParam;

TimeIncreaseSecond(st);

PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st);

}

}

#else

DWORD WINAPI TimerThreadProc(LPVOID lpParam)

{

#define ID_TIMER_SECOND 1

MSG msg;

BOOL ret;

ST_TIME *st = (ST_TIME *)lpParam;

SetTimer(NULL, ID_TIMER_SECOND, 1000, NULL);

PeekMessage(msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);

while (!g_ThreadTerminated (ret = GetMessage (msg, NULL, 0, 0)) != 0)

{

if (ret == -1)

{

//process fatal event.

}

else if (msg.message == WM_TIMER)

{

TimeIncreaseSecond(*st);

PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st);

}

else

{

TranslateMessage (msg);

DispatchMessage (msg);

}

}

return 1;

}

#endif

// If the ctrl+break combined key pressed. call this function.

// It set the g_DoneEvent. this terminate the program.

BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)

{

switch (fdwCtrlType)

{

case CTRL_BREAK_EVENT:

// Terminate the program.

printf ("Terminate.\n");

SetEvent(g_DoneEvent);

return TRUE;

default:

return FALSE;

}

}

BOOL InitApplication()

{

// Get the stdin and stdout handle.

HANDLE hStdIn;

hStdIn = GetStdHandle(STD_INPUT_HANDLE);

if (hStdIn == INVALID_HANDLE_VALUE)

return FALSE;

g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

// Set the mode, make the input echo.

DWORD fOldMode;

GetConsoleMode(hStdIn, fOldMode);

fOldMode |= ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;

SetConsoleMode(hStdIn, fOldMode);

// Set the window buffer.

// make a line 40 columns.

CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

GetConsoleScreenBufferInfo(g_hStdout, csbiInfo);

csbiInfo.srWindow.Right = 40;

// get the center point.

g_cxCenter = csbiInfo.srWindow.Right / 2;

g_cyCenter = csbiInfo.srWindow.Bottom / 2;

// Set the window.

SetConsoleWindowInfo(g_hStdout, TRUE, csbiInfo.srWindow);

return TRUE;

}

BOOL PrintTheInitalStateAndGetInput(HANDLE hStdout, WORD cxCenter, WORD cyCenter, ST_TIME time)

{

#define GAPS_LEFT_COLON (-2)

#define GAPS_RIGHT_COLON (1)

#define GAPS_LEFT_UNDERLINE_START (-4)

#define GAPS_MIDDLE_UNDERLINE_START (-1)

#define GAPS_RIGHT_UNDERLINE_START (2)

// __:__:__

// So the left ":" center -2

// so the right ":" center + 1

// so the left "_" center - 4;

// so the lfet "_" center - 1;

// so the right "_" center + 2;

COORD crdPos;

crdPos.X = cxCenter + GAPS_LEFT_COLON;

crdPos.Y = cyCenter;

SetConsoleCursorPosition(hStdout, crdPos);

printf (":");

crdPos.X = cxCenter + GAPS_RIGHT_COLON;

SetConsoleCursorPosition(hStdout, crdPos);

printf (":");

crdPos.X = cxCenter + GAPS_LEFT_UNDERLINE_START;

SetConsoleCursorPosition(hStdout, crdPos);

scanf ("%d", time.hour);

crdPos.X = cxCenter + GAPS_MIDDLE_UNDERLINE_START;

SetConsoleCursorPosition(hStdout, crdPos);

scanf ("%d", time.min);

crdPos.X = cxCenter + GAPS_RIGHT_UNDERLINE_START;

SetConsoleCursorPosition(hStdout, crdPos);

scanf ("%d", time.sec);

if (time.hour 0 || time.hour HOUR_CIRCLE ||

time.min 0 || time.min MINUTE_CIRCLE ||

time.sec 0 || time.sec SECOND_CIRCLE)

return FALSE;

return TRUE;

}

int main(int argc, char* argv[])

{

InitApplication();

PrintTheInitalStateAndGetInput(g_hStdout, g_cxCenter, g_cyCenter, g_Time);

// create a event to tell the program to terminate.

g_DoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

#ifdef USE_TIMERQUEUE

HANDLE hTimerQueue, hTimer;

hTimerQueue = CreateTimerQueue();

if (!CreateTimerQueueTimer(hTimer,

hTimerQueue, TimerRoutine, g_Time, 1000, 0, 0))

{

printf("CreateTimerQueueTimer failed (%d)\\n", GetLastError());

return 3;

}

#else

// create the thread.

HANDLE hThreadTimer;

DWORD dwThreadId;

g_ThreadTerminated = FALSE;

hThreadTimer = CreateThread(NULL, 0,

TimerThreadProc, g_Time, 0, dwThreadId);

if (hThreadTimer == NULL)

{

}

#endif

SetConsoleCtrlHandler(CtrlHandler, TRUE);

if (WaitForSingleObject(g_DoneEvent, INFINITE) != WAIT_OBJECT_0)

printf("WaitForSingleObject failed (%d)\\n", GetLastError());

#ifdef USE_TIMERQUEUE

if (!DeleteTimerQueue(hTimerQueue))

printf("DeleteTimerQueue failed(%d) \\n", GetLastError());

#else

g_ThreadTerminated = TRUE;

if (WaitForSingleObject(hThreadTimer, INFINITE) != WAIT_OBJECT_0)

printf("WaitForSingleObject failed (%d)\\n", GetLastError());

#endif

return 0;

}

--------------------------------------------

下面是纯c的。

有几个问题:

1.textmode函数在turboc中没有办法使用,不知道是什么问题,而borland c就可以。

2.无论怎么设置,自己的ctrlbreak函数在上述两个环境中都不能被调用,非常遗憾。所以不能够优雅的退出。只能按两次ctrlbreak。

下面是程序。

------------------------------------------

#include stdio.h

#include stdlib.h

#include stdio.h

#include conio.h

#include dos.h

#define ABORT 0

int jump_out_loop = -1;

int jump_out(void)

{

jump_out_loop = 1;

printf("Abort ..\n");

return ABORT;

}

int main(void)

{

struct text_info ti;

int center_x, center_y;

int hour, min, sec;

char str_out[64] = {0};

clrscr();

/*textmode(BW40);*/

/*textmode在turbo c下设置会出问题*/

gettextinfo(ti);

center_x = ti.winright / 2;

center_y = ti.winbottom / 2;

gotoxy(center_x - 4, center_y);

cprintf(" : : ");

gotoxy(center_x - 4, center_y);

cscanf("%d", hour);

gotoxy(center_x - 1, center_y);

cscanf("%d", min);

gotoxy(center_x + 2, center_y);

cscanf("%d", sec);

/* check input valid or not */

{}

setcbrk(1);

ctrlbrk(jump_out);

/*jump_out没有起到作用,实在不好意思.*/

/*

if (getcbrk())

printf("crtl break is on\n");

else

printf("is off\n");

*/

while (1)

{

delay(1000);

sec++;

if (sec = 60)

{

sec -= 60;

min++;

if (min = 60)

{

min -= 60;

hour++;

if (hour = 24)

{

hour -= 24;

}

}

}

sprintf(str_out, "%02d:%02d:%02d", hour, min, sec);

gotoxy(center_x - 4, center_y);

cprintf(str_out);

}

/* getch();*/

return 0;

}

谁能帮我用c语言编写桌面钟表啊!

#includemath.h

#includedos.h

#includegraphics.h

#define

CENTERX

320

/*表盘中心位置*/

#define

CENTERY

175

#define

CLICK

100

/*喀嗒声频率*/

#define

CLICKDELAY

30

/*喀嗒声延时*/

#define

HEBEEP

10000

/*高声频率*/

#define

LOWBEEP

500

/*低声频率*/

#define

BEEPDELAY

200

/*报时声延时*/

/*表盘刻度形状*/

int

Mrk_1[8]={-5,-160,5,-160,5,-130,-5,-130,

};

int

Mrk_2[8]={-5,-160,5,-160,2,-130,-2-130,

};

/*时针形状*/

int

HourHand[8]={-3,-100,3,-120,4,

10,-4,10};

/*分针形状*/

int

MiHand[8]={-3,-120,3,-120,4,

10,-4,10};

/*秒针形状*/

int

SecHand[8]={-2,-150,2,-150,3,

10,-3,10};

/*发出喀嗒声*/

void

Click()

{

sound(CLICK);

delay(CLICKDELAY);

nosound();

}

/*高声报时*/

void

HighBeep()

{

sound(HEBEEP);

delay(BEEPDELAY);

nosound;

}

/*低声报时*/

void

LowBeep()

{

sound(LOWBEEP);

}

/*按任意角度画多边形*/

void

DrawPoly(int

*data,int

angle,int

color)

{

int

usedata[8];

float

sinang,cosang;

int

i;

sinang=sin((float)angle/180*3.14);

cosang=cos((float)angle/180*3.14);

for(i=0;i8;i+=2)

{

usedata[i]

=CENTERX+

cosang*data[i]-sinang*data[i+1]+.5;

usedata[i+1]=CENTERY+sinang*data[i]+cosang*data[i+1]+.5;

}

setfillstyle(SOLID_FILL,color);

fillpoly(4,usedata);

}

/*画表盘*/

void

DrawClock(struct

time

*cutime)

{

int

ang;

float

hourrate,minrate,secrate;

setbkcolor(BLUE);

cleardevice();

setcolor(WHITE);

/*

画刻度*/

for(ang=0;ang360;ang+=90)

{

DrawPoly(Mrk_1,ang,WHITE);

DrawPoly(Mrk_2,ang+30,WHITE);

DrawPoly(Mrk_2,ang+60,WHITE);

}

secrate=(float)cutime-ti_sec/60;

minrate=((float)cutime-ti_min+secrate)/60;

hourrate=(((float)cutime-ti_hour/12)+minrate)/12;

ang=hourrate*360;

DrawPoly(HourHand,ang,YELLOW);/*画时针*/

ang=minrate*360;

DrawPoly(MiHand,ang,

GREEN);/*画分针*/

ang=secrate*360;

DrawPoly(SecHand,ang,

RED);/*画秒针*/

}

main()

{

int

gdriver=EGA,

gmode=EGAHI;

int

curpage;

struct

time

curtime

,newtime

;

initgraph(gdriver,gmode,"c:\\tc");

setbkcolor(BLUE);

cleardevice();

gettime(curtime);

curpage=0;

DrawClock(curtime);

while(1)

{

if(kbhit())

break;

/*按任意键退出*/

gettime(newtime);

/*检测系统时间*/

if(newtime.ti_sec!=curtime.ti_sec)/*每1秒更新一次时间*/

{

if(curpage==0)

curpage=1;

else

curpage=0;

curtime=newtime;

/*设置绘图页*/

setactivepage(curpage);

/*在图页上画表盘*/

DrawClock(curtime);

/*设置绘图页为当前可见页*/

setvisualpage(curpage);

/*0分0秒高声报时*/

if(newtime.ti_min==0newtime.ti_sec==0)

HighBeep();

/*

59分55至秒时低声报时*/

else

if(newtime.ti_min==59

newtime.ti_sec=59)

LowBeep();/*其他时间只发出喀嗒声*/

else

Click();

}

}

closegraph();

}