本文目錄一覽:
時鐘程序(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();
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/288895.html