A. c语言时钟代码
#include<graphics.h> /* 引入graphic.h */
#include<math.h> /* 引入math.h */
#include<dos.h> /* 引入dos.h */
#define pi 3.1415926 /*定义pi=3.14159*/
#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;
#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;
#define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) /*定义……*/
void init() /*初始化程序*/
{int i,l,x1,x2,y1,y2; /*定义……*/
setbkcolor(1); /*设置颜色*/
circle(300,240,200); /*作园*/
circle(300,240,205);
circle(300,240,5);
for(i=0;i<60;i++) /*循环(算时间)*/
{if(i%5==0) l=15;
else l=5;
x1=200*cos(i*6*pi/180)+300;
y1=200*sin(i*6*pi/180)+240;
x2=(200-l)*cos(i*6*pi/180)+300;
y2=(200-l)*sin(i*6*pi/180)+240;
line(x1,y1,x2,y2);
}
}
main()
{
int x,y;
int gd=VGA,gm=2;
unsigned char h,m,s; /*定义*/
struct time t[1];
initgraph(&gd,&gm,"d:\\tc");
init();
setwritemode(1);
gettime(t);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec; /*定义时分秒*/
setcolor(7); /*设置颜色*/
d(150,h,30);
setcolor(14);
d(170,m,6);
setcolor(4);
d(190,s,6);
while(!kbhit()) /*获取键盘相应*/
{while(t[0].ti_sec==s)
gettime(t); /*C语言中得到时间的函数*/
sound(400); /*计算时间……*/
delay(70);
sound(200);
delay(30);
nosound();
setcolor(4);
d(190,s,6);
s=t[0].ti_sec;
d(190,s,6);
if (t[0].ti_min!=m)
{
setcolor(14);
d(170,m,6);
m=t[0].ti_min;
d(170,m,6);
}
if (t[0].ti_hour!=h)
{ setcolor(7);
d(150,h,30);
h=t[0].ti_hour;
d(150,h,30);
sound(1000);
delay(240);
nosound();
delay(140);
sound(2000);
delay(240);
nosound();
}
}
getch(); /*设置空格后退出*/
closegraph();
}
具体的。。就是套用用几个函数算时间。。
不要对这种很长的东西害怕,其实大部分都是在画这个钟~
加油哦~
B. 求一个关于用C语言编写的电子时钟的程序,内容要有闹钟,可以调整时间
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
//#define HZ 12
sbit key0=P0^0; // 分钟调整
sbit key1=P0^1; // 小时调整
sbit P2_0=P2^7; //秒 指示灯
sbit MN_RXD=P3^6;
sbit MN_TXD=P3^7;
uchar data CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)
//数码管显示表0-f 灭
uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//**********************************
//模拟串口发送一个字节数据 函数
//**********************************
void SendData(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}
}
//**********************************
//显示程序函数
//**********************************
void display(void)
{
// unsigned int n;
uchar temp;
temp=CLOCK[1]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[1]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp/10; SendData(TABLE[temp]);
/*
for(n=0;n<5000;n++);
for(n=0;n<6;n++)
{
SendData(TABLE[10]);
}
*/
}
//**********************************
//按键控制函数
//**********************************
void keycan()
{
unsigned int n;
EA=0;
if(key0==0) // 分钟调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
}
display();
}
if(key1==0) // 小时调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
display();
}
EA=1;
}
//**********************************
//T0中断服务函数
//**********************************
void time0() interrupt 1 //using 1
{
TH0=0xD8; TL0=0xF0; //重置初值
// TH0=0xB1; TL0=0xE0;
//时钟处理
CLOCK[0]=CLOCK[0]+1;
}
//**********************************
//主函数
//**********************************
void main()
{
EA=1;
ET0=1;
TMOD=0x01; //T0方式1定时
TH0=0xD8; TL0=0xF0; //D8F0 定时10ms
// TH0=0xB1; TL0=0xE0; //定时 20ms
TR0=1;
for(;;)
{
if(CLOCK[0]==100) //到一秒 10ms*100
{
CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60) //到一分
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
display();
}
keycan();
}
}
C. 用C语言做一个小程序,电子时钟。做完后将代码复制到答案上。
学C不久。VC6写了一个控制台的,修改时个人时间不能后台走。你可以试试在mytime下面加多一个case到change()修改时也显示gomytime()的内容。
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
voidsystime();
voidmytime();
voidwel();
voidgomytime();
voidchange();
intye,mo,da,ho,mi,se;
voidmain()
{
wel();
}
//界面
voidwel()
{
intk;
printf("电子时钟 ");
printf(" ");
printf("1新建我的时间,2为系统时间,3为修改时间,4去我的时间,5退出 ");
printf(" ");
printf("选择:");
scanf("%d",&k);
switch(k)
{
case1:
mytime();
break;
case2:
systime();
break;
case3:
change();
break;
case4:
gomytime();
break;
case5:
exit(0);
break;
}
}
//个人设定的时间并行走
voidmytime(){
intk;
printf("输入年:");
scanf("%d",&ye);
printf("输入月:");
scanf("%d",&mo);
printf("输入日:");
scanf("%d",&da);
printf("输入时:");
scanf("%d",&ho);
printf("输入分:");
scanf("%d",&mi);
printf("输入秒:");
scanf("%d",&se);
while(1)
{
Sleep(1000);
system("cls");
se++;
if(se>=60)
{
se-=60;
mi++;
if(mi>=60)
{
mi-=60;
ho++;
if(ho>=24)
{
da++;
ho-=24;
if(da>=30)
{
mo++;
da-=30;
if(mo>=12)
{
ye++;
mo-=12;
}
}
}
}
}
printf("电子时钟 ");
printf(" ");
printf("个人设定的时间:");
printf("%d年%d月%d日%d时%d分%d秒",ye,mo,da,ho,mi,se);
printf(" ");
printf(" ");
printf("1为返回,2为继续 ");
printf("选择:");
if(kbhit())
{
scanf("%d",&k);
break;
}
}
switch(k){
case1:
system("cls");
wel();
break;
case2:
gomytime();
break;
}
}
//个人时间行走
voidgomytime(){
intk;
while(1)
{
Sleep(1000);
system("cls");
se++;
if(se>=60)
{
se-=60;
mi++;
if(mi>=60)
{
mi-=60;
ho++;
if(ho>=24)
{
da++;
ho-=24;
if(da>=30)
{
mo++;
da-=30;
if(mo>=12)
{
ye++;
mo-=12;
}
}
}
}
}
printf("电子时钟 ");
printf(" ");
printf("个人设定的时间:");
printf("%d年%d月%d日%d时%d分%d秒",ye,mo,da,ho,mi,se);
printf(" ");
printf(" ");
printf("1为返回,2为继续 ");
printf("选择:");
if(kbhit())
{
scanf("%d",&k);
break;
}
}
switch(k){
case1:
system("cls");
wel();
break;
case2:
gomytime();
break;
}
}
//系统时间
voidsystime(){
intk;
intyear,month,day,hour,min,sec;
time_tnowtime;
structtm*timeinfo;
while(1)
{
Sleep(1000);
system("cls");
time(&nowtime);
timeinfo=localtime(&nowtime);
year=timeinfo->tm_year+1900;
month=timeinfo->tm_mon+1;
day=timeinfo->tm_mday;
hour=timeinfo->tm_hour;
min=timeinfo->tm_min;
sec=timeinfo->tm_sec;
printf("电子时钟 ");
printf(" ");
printf("系统时间:%d年%d月%d日",year,month,day);
printf("%d时%d分%d秒 ",hour,min,sec);
printf(" ");
printf("1为返回,2为继续 ");
printf("选择:");
if(kbhit())
{
scanf("%d",&k);
break;
}
}
switch(k){
case1:
system("cls");
wel();
break;
case2:
systime();
break;
}
}
//修改个人时间
voidchange()
{
intk;
system("cls");
printf("电子时钟 ");
printf(" ");
printf("修改我的时间 ");
printf("1为修改年,2为修改月,3为修改日,4为修改时,5为修改分,6为修改秒,7我的时间,8返回");
printf(" ");
printf("选择:");
scanf("%d",&k);
switch(k)
{
case1:
printf("修改年:");
scanf("%d",&ye);
change();
break;
case2:
printf("修改月:");
scanf("%d",&mo);
change();
break;
case3:
printf("修改日:");
scanf("%d",&da);
change();
break;
case4:
printf("修改时:");
scanf("%d",&ho);
change();
break;
case5:
printf("修改分:");
scanf("%d",&mi);
change();
break;
case6:
printf("修改秒:");
scanf("%d",&se);
change();
break;
case7:
gomytime();
break;
case8:
system("cls");
wel();
break;
}
}
D. 单片机C语言该怎么编写时钟程序
这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟.显示控制年月日等等.#include
E. 怎么用C++编写带日期的电子时钟
#include <iostream>
#include <time.h>
using namespace std;
void delay(double seconds)
{
clock_t t = clock();
while((double)(clock()-t)/(double)CLOCKS_PER_SEC<seconds);
}
class Clock
{
private:
int year;
int month;
int day;
int hour;
int minute;
int second;
public:
Clock();
Clock(int y,int m,int d,int h,int mi,int s);
~Clock();
void secondadd();
void changetime();
void showtime();
void test();
};
Clock::Clock()
{
cout<<"please input current year:"<<endl;
cin>>year;
if((year/4==0&&year/100!=0)||(year/400==0))
cout<<"闰年"<<endl;
else
cout<<"不是闰年"<<endl;
month:
cout<<"please input current month:"<<endl;
cin>>month;
if(month<1||month>12)
{
month = 0;
cout<<"month is wrong!input again!"<<endl;
goto month;
}
day:
cout<<"please input current day:"<<endl;
cin>>day;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<1||day>31)
{
day = 0;
cout<<"day is wrong!input again!"<<endl;
goto day;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day<1||day>30)
{
day = 0;
cout<<"day is wrong!input again!"<<endl;
goto day;
}
}
if(month == 2)
{
if((year/4==0&&year/100!=0)||(year/400==0))
{
if(day<1||day>29)
{
cout<<"闰年"<<endl;
day = 0;
cout<<"day is wrong!input again!"<<endl;
goto day;
}
}
else
{
if(day<1||day>28)
{
cout<<"不是闰年"<<endl;
day = 0;
cout<<"day is wrong!input again!"<<endl;
goto day;
}
}
}
hour:
cout<<"please input current hour:"<<endl;
cin>>hour;
if(hour<0||hour>24)
{
hour = 0;
cout<<"hour is wrong!input again!"<<endl;
goto hour;
}
minute:
cout<<"please input current minute:"<<endl;
cin>>minute;
if(minute<0||minute>60)
{
minute = 0;
cout<<"minute is wrong!input again!"<<endl;
goto minute;
}
second:
cout<<"please input current second:"<<endl;
cin>>second;
if(second<0||second>60)
{
minute = 0;
cout<<"second is wrong!input again!"<<endl;
goto second;
}
}
Clock::Clock(int y,int m,int d,int h,int mi,int s)
{
year = y;
month = m;
day = d;
hour = h;
minute = mi;
second = s;
}
Clock::~Clock()
{
}
void Clock::changetime()
{
int y;int m;int d;int h;int mi;int s;
cout<<"input year:"<<endl;
cin>>y;
cout<<"input month:"<<endl;
cin>>m;
cout<<"input day:"<<endl;
cin>>d;
cout<<"input hour:"<<endl;
cin>>h;
cout<<"input minute:"<<endl;
cin>>mi;
cout<<"input second:"<<endl;
cin>>s;
year = y;
month = m;
day = d;
hour = h;
minute = mi;
second = s;
}
void Clock::secondadd()
{
second = second + 1;
test();
}
void Clock::test()
{
if(second>=60)
{
second = second-60;
minute++;
}
if(minute>=60)
{
minute = minute-60;
hour++;
}
if(hour>=24)
{
hour = hour-24;
day++;
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day>=32)
{
day=day-31;
month++;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day>=31)
{
day=day-30;
month++;
}
}
if((year/4==0&&year/100!=0)||(year/400==0))
{
if(month == 2)
{
if(day>=30)
{
day = day-29;
month++;
}
}
}
else
{
if(month == 2)
{
if(day>=29)
{
day = day-28;
month++;
}
}
}
if(month>=13)
{
month = month -12;
year++;
}
}
void Clock::showtime()
{
cout<<"date is "<<year<<"."<<month<<"."<<day<<endl;
cout<<"time is "<<hour<<":"<<minute<<":"<<second<<endl;
}
int main()
{
Clock c;
while(1)
{
delay(1);
c.secondadd();
c.showtime();
}
}
在判断年份上还有一些小BUG,(*^__^*),请自行解决
F. c语言编写数字时钟
#include<stdio.h>
#include<windows.h>
int main()
{
for(int i=0;i<24;i++)
for(int j=0;j<60;j++)
for(int k=0;k<5;k++)
{
system("cls");
printf("%0.2d:%0.2d:%0.2d",i,j,k);
Sleep(1000);
}
}
G. 怎样用C语言编写一个时钟,明天就要交了,急,求大神
#include <stdio.h>
#include <time.h>
int main()
{
int i=1;
for(i=0;i<20;i++)
{
shijian();//显示时间
printf("%d秒后退出",20-i);
sleep(1000);//等待
// printf("输入数字0结束");
system("cls");//清屏
// scanf("%d",i);
}
system("pause");
}
int shijian()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "\007当前时间: %s", asctime (timeinfo) );
}
H. 用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 procre 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 (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();
(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;
}
I. 求用单片机c语言做一个电子时钟,实现调时、显示、整点报时等功能。
(1)用数字逻辑集成块实现;
(2)时间以24小时为一个周期,显示时、分、秒;
(3)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;
(4)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。
c51单片机 晶振为11.0592MHz
#include<reg52.h>
#define HOUR1 1
#define HOUR0 0
#define MIN1 2
#define MIN0 8
#define SEC1 2
#define SEC0 0
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
int i;
ulint
sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒计数全局变量
uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code time[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(uint);//程序毫秒延时
void beeper(uchar);//开蜂鸣器毫秒
void init();//初始化函数
void display();//从数码管上显示
void counter();//计算进行过程中的时、分、秒值
void scan();//扫描键盘
void main()
{
init();
while(1)
{
scan();//扫描键盘看是否有键按下
for(i=6;i>0;i--)//动态扫描6位数码管
{
display();//显示时、分、秒
}
}
}
void init()
{
second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0;
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)//程序毫秒延时
{
uint x=0,y=0;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
count++;
if(count==20)//判断是否到1秒
{
counter();//计算进行过程中的时、分、秒值
if(sharp!=hour0) beeper(1000);//判断小时的值是否改变,变则启动蜂鸣器
}
}
void beeper(uchar tt)
{
uchar t=tt;
count=0;
beep=0;//开蜂鸣器
delay(t);
beep=1;//关蜂鸣器
}
void display()
{
P0=0xff;//位消影(低电平选择位)
//送位选信号
wela=1;
P0=segment[i-1];
wela=0;
P0=0x00;//段消影(高电平选择段)
//送段选信号
la=1;
switch(i)
{
case 6 : P0=time[sec0]; break;
case 5 : P0=time[sec1]; break;
case 4 : P0=time[min0]; break;
case 3 : P0=time[min1]; break;
case 2 : P0=time[hour0]; break;
case 1 : P0=time[hour1]; break;
}
delay(1);
P0=0x00; //配合上面用于消隐
la=0;
}
void counter()
{
second++;
if(second==86400) second=0;
count=0;
sharp=hour0;//设置报时检测KEY
sec0=second%10;
sec1=(second%60-sec0)/10;
min0=((second%3600-sec1*10-sec0)/60)%10;
min1=((second%3600-sec1*10-sec0)/60-min0)/10;
hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600;
hour1=second/36000;
}
void scan()
{
}
J. C语言电子时钟设计
#include<graphics.h> #include<math.h> #include<dos.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; }