c++模拟时钟实验报告

合集下载

单片机设计数字钟实验报告

单片机设计数字钟实验报告

单片机实验报告——数字钟设计班级:学号:姓名:时间:一.实验目的1、进一步熟悉C的语法知识和keil环境;2、熟练掌握一些常用算法;3、熟悉keil的编写、下载、调试过程;4、了解单片机的工作原理和电路图;5、熟悉单片机的外围电路功能模块、LED灯、数码管模块以及键盘;6、熟练焊接技术。

二.实验器件三.数字钟设计原理数字钟实际是对标准频率计数的电路,由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的时间信号必须做到准确稳定。

通常使用石英晶体振荡电路构成数字钟。

数字钟电子钟由以下几部分组成:按键开关部分,振荡电路部分,89c51单片机控制器,4位数码管显示部分,7407数码管驱动部分。

按键开关振荡电路89C51单片机控制器4位数码管显示7407列驱动四.流程图主程序流程图如图2.3所示,定时器T0中断服务程序流程图如2.4所示。

返回五.51单片机系统的硬件连接1、STC单片机最小系统硬件电路图如下2、硬件电路的设计该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P2.4~P2.7口作为列扫描输出,P0口输出段码数据,P1.2,P1.1口接2个按钮开关,用于调时及功能误差,采用12Mhz晶振,可提高秒计时的精确度。

六.程序设计HOUR EQU 3AH ;赋值伪指令MIN EQU 3BHSEC EQU 3CHBUFF EQU 3DHORG 0000HAJMP MAINORG 000BH ;主程序入口AJMP PTF0ORG 0033H ;跳转到标号PTF0执行;**************************************************************;主程序MAIN: MOV HOUR, #00H ;时,分,秒,标记清零MOV MIN, #00HMOV SEC, #00HMOV BUFF, #00HMOV SP, #0EFH ;设堆栈指针MOV TH0, #0ECH ;定时器赋初值MOV TL0, #78HMOV 40H, #100 ;设循环次数MOV 41H, #2MOV TMOD , #1 ;写TMODMOV IP, #2 ;写IPMOV IE, #82HMOV R5,#0;开中断SETB TR0 ;启动定时器PTF0: SETB P1.2MOV TH0, #0ECHMOV TL0, #78HINC R5MOV R6,BUFFCJNE R6,#00H,BBMOV DPTR,#TAB1LJMP LOOP0BB:MOV DPTR,#TABLOOP0: CJNE R5,#1,LOOP1ACALL LOP0AJMP JKLOOP1:CJNE R5,#2,LOOP2ACALL LOP1AJMP JKLOOP2:CJNE R5,#3,LOOP3ACALL LOP2AJMP JKLOOP3:ACALL LOP3MOV R5,#0JK: DJNZ 40H, PTFORXRL BUFF, #0FFHMOV 40H, #100JNB P1.1, JFJNB P1.2, JSMOV R7, 41HCJNE R7, #1, AAAA: DJNZ 41H, PTFORMOV 41H,#2MOV A, SEC ;秒加1ADD A, #1DA AMOV SEC, ACJNE A, #60H, PTFORMOV SEC, #0 ;秒清零JF: MOV A, MIN ;分加1ADD A, #1DA AMOV MIN, ACJNE A, #60H,PTFORMOV MIN, #0 ; 分清零ACALL LEDJS: MOV A,HOURADD A,#1DA AMOV HOUR,A ;时加1CJNE A, #24H,PTFOR ;时加到24时否?是,清零MOV HOUR, #0PTFOR:RETILOP0: MOV A, MIN ;显示分钟的个位ANL A, #0FHMOVC A, @A+DPTRMOV P0,AMOV P2,#0F0HCLR P2.4CLR P0.4RETLOP1:MOV A, MIN ;显示分钟的十位SWAP AANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.5CLR P0.4RETLOP2: MOV A, HOUR ;显示时钟的个位ANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.6RETLOP3:MOV A, HOUR ;显示时钟的十位SWAP AANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.7CLR P0.4RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不带小数点的字型码TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;带小数点的字型码END七.系统调试及结果分析硬件调试硬件电路板中器件连接好后,先用万用表测试电路中有无虚焊短接之处,测试无误后,将板子通电,进行静态调试。

C语言模拟时钟转动课程设计报告

C语言模拟时钟转动课程设计报告

《C语言程序设计》课程设计报告题目:模拟时钟转动程序班级:组别:组员:指导教师:目录第一章课程设计的题目 (2)1.1 C语言课程设计的题目 (2)第二章课程设计的要求 (2)2.1 C语言课程设计的要求 (2)第三章课程设计的目的 (2)3.1 C语言课程设计的目的 (2)第四章课程设计的内容 (3)4.1 C语言课程设计的程序清单和注释 (3)第五章课程设计的运行结果 (7)5.1 C语言课程设计的运行结果 (7)第六章课程设计的结果分析 (8)6.1 C语言课程设计的结果分析 (8)第七章课程设计的心得体会 (9)7.1 C语言课程设计的心得体会 (9)模拟时钟转动程序第一章课程设计的题目1.1 C语言课程设计的题目本次为期两周的课程设计的题目为设计一个模拟时钟转动的程序。

第二章课程设计的要求2.1 C语言课程设计的要求能模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。

第三章课程设计的目的3.1 C语言课程设计的目的加深对讲授内容的理解,尤其是一些语法规定。

通过课程设计,自然地、熟练地掌握。

熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。

学会上机调试程序。

第四章课程设计的内容4.1 C语言课程设计的程序清单和注释模拟时钟转动程序清单+注释#include<windows.h> //包含窗口头文件#include<math.h> //头文件,包含了一些数学计算的函数#define TWOPI (2*3.14159)#define IDTIMER 1 //计时器ID#define ANGLE TWOPI/360 //2PILRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ); //回调函数Int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow ) // 应用启动函数mian {TCHAR szClassName[] = TEXT("analogCloc");MSG msg; //定义消息HWND hwnd; //窗口句柄WNDCLASS wndclass; //系统支持结构,定义并初始化窗口结构 wndclass.cbClsExtra = 0; //窗口类无扩展wndclass.cbWndExtra = 0; //窗口势力无扩展wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//窗口背景为白色wndclass.hCursor = NULL;wndclass.hIcon = NULL;wndclass.hInstance = hInstance; //当前实例句柄 wndclass.lpfnWndProc = WindowProc; //关联到消息回调函数wndclass.lpszClassName = szClassName;wndclass.lpszMenuName = NULL; //窗口中无菜单wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口重绘风格RegisterClass(&wndclass);hwndCreateWindow(szClassName,TEXT("Clock"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, hInstance, NULL); //创建窗口ShowWindow(hwnd,nCmdShow); //显示窗口UpdateWindow(hwnd); //更新窗口,强制显示while(GetMessage(&msg,NULL,0,0)) //函数GetMessage 是从调用线程的消息队列里取得一个消息并将其放于指定的结构{TranslateMessage(&msg); //消息处理DispatchMessage(&msg); //消息派遣}return msg.wParam; //windows应用程序的消息循环形式}void setISOTROPIC(HDC hdc,int cxClient,int cyClient)//设置映射模式,使之成为笛卡尔坐标系的映射模式{SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,1000,1000,NULL); // 逻辑单位与设备单位比1/2SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); //竖坐标向上为正,下为负}void drawClock(HDC hdc) // 画时钟圆盘{int x, y, radius; //以逻辑单位表示的窗口原点坐标SelectObject(hdc,CreateSolidBrush(RGB(1,148,138)));//设置整个窗口线条颜色for(int i=0;i<360;i+=6){x = (int)(cos(TWOPI/360*i)*900); //cos函数,包含在math.h头文件利的函数y = (int)(sin(TWOPI/360*i)*900);radius = !(i%5)?40:10;Ellipse(hdc,x-radius,y-radius,x+radius,y+radius);// 把弧度制转换成坐标形式,Ellipse函数用来画圆}}void drawHands(HDC hdc,SYSTEMTIME *pst,BOOL hChange)// draw hands函数负责绘制时钟的时针、分针和秒针的轮廓{int radius[3] = {500,700,850};int angle[3];angle[0] = pst->wHour*30+pst->wMinute/12*6;angle[1] = pst->wMinute*6;angle[2] = pst->wSecond*6;for(int i=hChange?0:2;i<3;i++){MoveToEx(hdc,0,0,NULL);LineTo(hdc,(int)(radius[i]*cos(ANGLE*(90-angle[i]))),(int)(radius[i]*sin(ANGLE*(90-angle[i]))));}}LRESULT CALLBACK WindowProc(HWND hwnd,UINT message, // 消息标识符,标识某个特定的消息WPARAM wParam,LPARAM lParam) //消息处理函数{TCHAR time[40];PAINTSTRUCT ps;HDC hdc;static int cxClient, cyClient;SYSTEMTIME st; //定义结构体变量static SYSTEMTIME preSt;BOOL hChange;switch(message) //switch 语句一个case代表一种情况 {case WM_CREATE: // 窗口创建事件SetTimer(hwnd,IDTIMER,1000,NULL); //创建一个1000ms定时器GetLocalTime(&st); //得到当前系统时间wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); // 设置当前时间为窗口titlepreSt = st;return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_TIMER: //定时器到时,即是每隔一秒要重画下界面GetLocalTime(&st); //每次都要获取当前时间hChange = st.wHour!=preSt.wHour||st.wMinute!=preSt.wMinute;hdc = GetDC(hwnd);setISOTROPIC(hdc,cxClient,cyClient);SelectObject(hdc,GetStockObject(WHITE_PEN));drawHands(hdc,&preSt,hChange);SelectObject(hdc,GetStockObject(BLACK_PEN));drawHands(hdc,&st,TRUE);ReleaseDC(hwnd,hdc);wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); //setwindowText函数:系统里的函数preSt = st; // 更新完毕后记录前一次的状态return 0;case WM_KEYDOWN:case WM_CHAR:DestroyWindow(hwnd); // 关闭窗口return 0;case WM_PAINT: //窗口绘制消息hdc = BeginPaint(hwnd,&ps); //开始绘制setISOTROPIC(hdc,cxClient,cyClient);drawClock(hdc);drawHands(hdc,&preSt,TRUE);EndPaint(hwnd,&ps); //结束绘制 return 0;case WM_DESTROY: //程序退出消息PostQuitMessage(0);return 0;}returnDefWindowProc(hwnd,message,wParam,lParam);//其他消息有系统默认处理}第五章课程设计的运行结果5.1 C语言课程设计的运行结果第六章课程设计的结果分析6.1 C语言课程设计的结果分析运行结果分析问题一:程序清单中某个符号添加错误,导致编译时出现错误,执行不出结果。

C语言模拟时钟转动课程设计报告

C语言模拟时钟转动课程设计报告

《C语言程序设计》课程设计报告题目:模拟时钟转动程序班级:组别:组员:指导教师:目录第一章课程设计的题目 (2)1.1 C语言课程设计的题目 (2)第二章课程设计的要求 (2)2.1 C语言课程设计的要求 (2)第三章课程设计的目的 (2)3.1 C语言课程设计的目的 (2)第四章课程设计的内容 (3)4.1 C语言课程设计的程序清单和注释 (3)第五章课程设计的运行结果 (7)5.1 C语言课程设计的运行结果 (7)第六章课程设计的结果分析 (8)6.1 C语言课程设计的结果分析 (8)第七章课程设计的心得体会 (9)7.1 C语言课程设计的心得体会 (9)模拟时钟转动程序第一章课程设计的题目1.1 C语言课程设计的题目本次为期两周的课程设计的题目为设计一个模拟时钟转动的程序。

第二章课程设计的要求2.1 C语言课程设计的要求能模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。

第三章课程设计的目的3.1 C语言课程设计的目的加深对讲授内容的理解,尤其是一些语法规定。

通过课程设计,自然地、熟练地掌握。

熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。

学会上机调试程序。

第四章课程设计的内容4.1 C语言课程设计的程序清单和注释模拟时钟转动程序清单+注释#include<windows.h> //包含窗口头文件#include<math.h> //头文件,包含了一些数学计算的函数#define TWOPI (2*3.14159)#define IDTIMER 1 //计时器ID#define ANGLE TWOPI/360 //2PILRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ); //回调函数Int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow ) // 应用启动函数mian{TCHAR szClassName[] = TEXT("analogCloc");MSG msg; //定义消息HWND hwnd; //窗口句柄WNDCLASS wndclass; //系统支持结构,定义并初始化窗口结构wndclass.cbClsExtra = 0; //窗口类无扩展wndclass.cbWndExtra = 0; //窗口势力无扩展wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//窗口背景为白色wndclass.hCursor = NULL;wndclass.hIcon = NULL;wndclass.hInstance = hInstance; //当前实例句柄wndclass.lpfnWndProc = WindowProc; //关联到消息回调函数wndclass.lpszClassName = szClassName;wndclass.lpszMenuName = NULL; //窗口中无菜单wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口重绘风格RegisterClass(&wndclass);hwndCreateWindow(szClassName,TEXT("Clock"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, hInstance, NULL); //创建窗口ShowWindow(hwnd,nCmdShow); //显示窗口UpdateWindow(hwnd); //更新窗口,强制显示while(GetMessage(&msg,NULL,0,0)) //函数GetMessage 是从调用线程的消息队列里取得一个消息并将其放于指定的结构{TranslateMessage(&msg); //消息处理DispatchMessage(&msg); //消息派遣}return msg.wParam; //windows应用程序的消息循环形式}void setISOTROPIC(HDC hdc,int cxClient,int cyClient)//设置映射模式,使之成为笛卡尔坐标系的映射模式{SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,1000,1000,NULL); // 逻辑单位与设备单位比1/2 SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); //竖坐标向上为正,下为负}void drawClock(HDC hdc) // 画时钟圆盘{int x, y, radius; //以逻辑单位表示的窗口原点坐标SelectObject(hdc,CreateSolidBrush(RGB(1,148,138)));//设置整个窗口线条颜色for(int i=0;i<360;i+=6){x = (int)(cos(TWOPI/360*i)*900); //cos函数,包含在math.h头文件利的函数y = (int)(sin(TWOPI/360*i)*900);radius = !(i%5)?40:10;Ellipse(hdc,x-radius,y-radius,x+radius,y+radius);// 把弧度制转换成坐标形式,Ellipse函数用来画圆}}void drawHands(HDC hdc,SYSTEMTIME *pst,BOOL hChange)// draw hands函数负责绘制时钟的时针、分针和秒针的轮廓{int radius[3] = {500,700,850};int angle[3];angle[0] = pst->wHour*30+pst->wMinute/12*6;angle[1] = pst->wMinute*6;angle[2] = pst->wSecond*6;for(int i=hChange?0:2;i<3;i++){MoveToEx(hdc,0,0,NULL);LineTo(hdc,(int)(radius[i]*cos(ANGLE*(90-angle[i]))),(int)(radius[i]*sin(ANGLE*(90-angle[i]))));}}LRESULT CALLBACK WindowProc(HWND hwnd,UINT message, // 消息标识符,标识某个特定的消息WPARAM wParam,LPARAM lParam) //消息处理函数{TCHAR time[40];PAINTSTRUCT ps;HDC hdc;static int cxClient, cyClient;SYSTEMTIME st; //定义结构体变量static SYSTEMTIME preSt;BOOL hChange;switch(message) //switch 语句一个case代表一种情况{case WM_CREATE: // 窗口创建事件SetTimer(hwnd,IDTIMER,1000,NULL); //创建一个1000ms定时器GetLocalTime(&st); //得到当前系统时间wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); // 设置当前时间为窗口title preSt = st;return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_TIMER: //定时器到时,即是每隔一秒要重画下界面GetLocalTime(&st); //每次都要获取当前时间hChange = st.wHour!=preSt.wHour||st.wMinute!=preSt.wMinute;hdc = GetDC(hwnd);setISOTROPIC(hdc,cxClient,cyClient);SelectObject(hdc,GetStockObject(WHITE_PEN));drawHands(hdc,&preSt,hChange);SelectObject(hdc,GetStockObject(BLACK_PEN));drawHands(hdc,&st,TRUE);ReleaseDC(hwnd,hdc);wsprintf(time,TEXT("%d年%d月%d日%d时%d分%d秒"),//记录系统时间,包括年、月、日、时、分、秒st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);SetWindowText(hwnd,time); //setwindowText函数:系统里的函数preSt = st; // 更新完毕后记录前一次的状态return 0;case WM_KEYDOWN:case WM_CHAR:DestroyWindow(hwnd); // 关闭窗口return 0;case WM_PAINT: //窗口绘制消息hdc = BeginPaint(hwnd,&ps); //开始绘制setISOTROPIC(hdc,cxClient,cyClient);drawClock(hdc);drawHands(hdc,&preSt,TRUE);EndPaint(hwnd,&ps); //结束绘制return 0;case WM_DESTROY: //程序退出消息PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);//其他消息有系统默认处理}5.1 C语言课程设计的运行结果6.1 C语言课程设计的结果分析运行结果分析问题一:程序清单中某个符号添加错误,导致编译时出现错误,执行不出结果。

98分C语言编写多功能电脑时钟设计报告C语言编写98分

98分C语言编写多功能电脑时钟设计报告C语言编写98分

XXXXX大学学生实习(实训)总结报告学院:_电气与信息工程学院_ 专业班级:_XXXXXXXX_学生姓名:____XXXX _学号:_XXXXXXXX_实习(实训)地点:______XXXXXXXXX_ _报告题目:_ 单片机万年历系统设报告__ _报告日期: 201X年 X月 XX日指导教师评语:_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ _____成绩(五级记分制):___________________指导教师(签字):_____________________目录一、实训目的意义及任务要求 (1)1.1目的意义 (1)2.2任务要求 (1)二.实习任务的方案 (2)2.1 任务进度 (2)2.2 系统分析 (2)2.3 器件选择 (2)三、系统硬件设计 (4)3.1 单片机的最小系统 (4)3.2 数码管、独立按键及DS1302时钟芯片电路的设计 (4)3.3 其他附属电路设计 (5)四、软件设计 (7)4.1 主程序设计 (7)4.2 系统操作功能设计 (7)4.3主程序void main () (9)4.4主程序设计 (9)4.5 DS1302子程序设计 (10)4.6时间调整子程序 (12)4.7 按键切换子程序 (14)五、调试及性能分析 (15)5.1软件测试 (15)5.2测试结果分析与结论 (15)5.3 测试结论 (16)六、心得体会 (17)参考文献 (18)附录一 (19)附录二 (20)多功能电脑时钟设计报告一、实训目的意义及任务要求1.1目的意义在如今,单片机的使用领域已十分广泛,它在智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等均有很广泛的应用。

C语言图形时钟课程设计实验报告.

C语言图形时钟课程设计实验报告.

目录1.系统功能要求。

2. 数据结构设计及说明。

3.程序结构(画流程图)。

4.各模块的功能。

5.试验结果(包括输入数据和输出结果)。

6.体会。

7.参考文献。

8.附录:程序清单及源程序。

●系统功能要求:在屏幕上显示一个图形时钟(用程序绘制一个与时钟样式相似即可),时间与系统时间一致,且要随着时间的走动准确的走动。

●数据结构设计及说明(1)图形时钟要用TC来编译,学C语言时主要用VC,用TC对我有一定的挑战性,不熟悉编译,对图形函数也没有太多接触,做这个有一定难度。

(2)先画出时钟基本组成,(时针分针秒针,中心点,表盘及其分隔点)。

(3)时钟表设计思想:第一步,确定秒钟的走时。

将圆等分成60份每过一秒,秒钟要转1/60个圆,亦即一等份。

第二步,确定分钟的走时。

将圆等分成60份每过一分,分钟要转1/60个圆,亦即一等份。

分钟自己走的再加秒钟的,才是分钟此时的位置。

第三步,确定时钟的走时。

将圆等分成12等分。

每过一时,时钟走一等份。

和分钟一样,得加上分钟,秒钟的走时,才是此刻时钟的位置。

(4)时钟走动与系统时间联系:每过一秒画出秒针,并除去前一秒的秒针,分针秒针同样可用。

画线函数与时间联系使用变量。

(5) 设置横纵坐标x=a*cos(b*c*pi/180-pi/2)+300;y=a*sin(b*c*pi/180-pi/2)+240;设置表针的动态坐标点x1=200*sin(i*6*pi/180)+300;y1=200*cos(i*6*pi/180)+240;x2=(200-l)*sin(i*6*pi/180)+300;y2=(200-l)*cos(i*6*pi/180)+240;程序结构(画流程图)总流程图:指针转动流程图:●各模块的功能●试验结果(包括输入数据和输出结果)体会:刚开始做时基本上什么都不懂,用TC做,我更不会。

不过参考了很多资料,到网上查,泡了几天图书馆,差不多能写出基本程序,虽然很多是借鉴别人的,不过能写成这样,我心里还是挺高兴的。

C#实例——钟表模拟

C#实例——钟表模拟

目录摘要: (1)1.C#语言简介 (2)2.实现目标 (2)3.主要方法 (3)4.实验过程中的难点 (3)5.实验过程 (4)6.总结 (6)附录(源程序): (7)用C#实现时钟模拟用C#实现时钟模拟摘要:我们日常生活中有各种各样的时钟。

随着计算机的普及和计算机科学的飞速发展人们开始越来越多的利用计算机解决实际问题,开发一个易于查看的时钟有较大的现实意义。

VisualStudiio 2008是面向Windows Vista、Office 2007、Web 2.0的下一代开发工具,其强大的兼容性以及高速处理能力帮助程序人员轻松应对研究、测试、开发过程中的各种问题。

对于Web,ASP NET AJAX 及其他新技术使开发人员能够迅速创建更高效、交互式更强和更个性化的新一代Web 体验。

本文基于VisualStudiio 2008采用C#语言,应用GDI+应用程序编程借口(API)实现时钟模拟。

关键词:C#开发时钟模拟GDI+ VisualStudio20081.C#语言简介C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。

它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。

C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言,此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种自动内存释放技术)。

软件必须做到强大、持久,并具有较强的编程生产力。

此种语言为在分布式环境中的开发提供适用的组件开发应用。

为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。

模拟时钟程序报告书

模拟时钟程序报告书

目录1. 基本功能描述 (1)2. 设计思路 (2)3. 软件设计 (3)3.1 设计步骤 (3)3.2 界面设计 (6)3.3 关键功能的实现 (7)3.3.1 指针式时钟的实现 (7)3.3.2 数字式时钟的实现 (8)3.3.3 设置部分的实现 (8)4 结论与心得体会 (8)5 参考文献 (9)6 思考题 (9)7 附录 (10)7.1 调试报告 (10)7.2 测试结果 (11)7.3 关键源代码 (12)模拟时钟程序1. 基本功能描述计时器是程序中最常用的后台任务机制之一,其时间间隔最低约55毫秒,被广泛用于时钟、磁盘备份程序或需要在某一时刻运行的程序等。

而模拟时钟是一种集计时器和时钟显示于一体的程序。

以实例为背景学习基于MFC的WINDOWS程序设计,编写一个指针式时钟程序.界面上包括数字式时钟、指针式时钟,可以实现对系统时间的修改与再定义。

具体要求包括以下三点:1)指针式时钟包含均匀分布的十二个刻度点、时/分/秒三指针,具体表盘形式可自由设计,要求时钟样式得体、易于辨认。

同理,要求指针位置随系统时间变化运动且与数字式时钟同步。

2)数字钟的钟面为一个规则的矩形,其显示时间的格式是时:分:秒,小时为24进制,分钟和秒是60进制,显示时间随系统时间变化跳变且与指针式时钟同步。

3)包含修改系统时间菜单项,可在弹出对话框中修改并再定义系统时间。

该对话框弹出时,数字式时钟与指针式时钟不停止跳变(与WINDOWS系统自带时钟程序一致)。

4)程序界面设计合理,色彩得体大方,显示正确。

效果图如图1所示:图1 时钟效果显示图2. 设计思路图2CView类OnDraw( )函数中。

下面对上页程序流程图中关键步骤作出简要分析说明:1)要实现时钟程序的显示及同步跳变,实质上是在实现每隔一秒定时刷新屏幕重新绘图。

OnCreate( )函数创建计时器并定义计时间隔为一秒,OnTimer( )函数作计时器的消息处理函数用于通知OnDraw( )函数重新绘图。

模拟时钟转动程序

模拟时钟转动程序

C语言集中上机实验报告题目五: 模拟时钟转动程序院系:班级:姓名:学号:指导教师:2011 年12 月08日目录一课程设计的地位、作用与目的 (2)二课程的基本要求 (2)三课程设计的主要设计思路与流程图 (2)1.设计思路2.流程图3.使用的主要函数4.程序各功能模块四程序的运行结果 (7)1.调试过程出现的问题2.运行结果五心得体会 (7)一课程设计的地位、作用与目的为综合应用C语言程序设计理论知识、进一步提高学生综合解决问题、协调工作的能力和良好的软件开发习惯,特安排本实验内容。

希望通过该实习能够进一步激发学生的学习热情,培养学生初步编程的能力,为后续的学习和发展奠定基础。

二课程的基本要求能模拟机械钟表行走,还要准确地利用数字显示日期和时间,在屏幕上显示一个活动时钟,按任意键时程序退出。

三课程设计的主要设计思路与流程图设计思路:在绘图窗口中先画出表盘后获取系统的时间,利用得到的系统时间计算表针的位置,并将时间在屏幕上输出。

每隔一秒读取一次时间,直到键盘有输入为止。

流程图开始使用的主要函数:setlinestyle 设置画线setcolor 设置颜色line(int x1,int y1,int x2,int y2)画直线circle(int x,int y,int r)画圆outtextxy(int x,int y,char *textstring)在指定位置输出字符initgraph(int x, int y); 初始化绘图窗口setwritemode( ); 设置绘图模式kbhit() 检查是否有键盘输入GetLocalTime(&ti); 获取当前时间sleep() 程序暂停若干时间程序各功能模块:1.计算表针的位置并画出表针void Drawzhizhen(int hour, int minute, int second){double a_hour, a_min, a_sec; // 时、分、秒针的弧度值int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的位置a_sec = second * 2 * PI / 60; // 计算时、分、秒针的弧度值a_min = minute * 2 * PI / 60 + a_sec / 60;a_hour= hour * 2 * PI / 12 + a_min / 12;x_sec = int(120 * sin(a_sec)); y_sec = int(120 * cos(a_sec)); ///计算时、分、秒针的位置x_min = int(100 * sin(a_min)); y_min = int(100 * cos(a_min));x_hour= int(70 * sin(a_hour)); y_hour= int(70 * cos(a_hour));setlinestyle(PS_SOLID, NULL, 10); // 画时针setcolor(WHITE);line(300 + x_hour, 240 - y_hour, 300 - x_hour / 7, 240 + y_hour / 7);setlinestyle(PS_SOLID, NULL, 5);// 画分针setcolor(YELLOW);line(300 + x_min, 240 - y_min, 300 - x_min / 5, 240 + y_min / 5);setlinestyle(PS_SOLID, NULL, 2); // 画秒针setcolor(RED);line(300 + x_sec, 240 - y_sec, 300 - x_sec / 3, 240 + y_sec / 3);}2.画表盘void Drawbiaopan(){int i,l,x1,x2,y1,y2;setbkcolor(1);circle(300,240,180);circle(300,240,185);circle(300,240,20);for(i=0;i<60;i++) /*划钟点上的短线*/ {if(i%5==0)l=15;elsel=5;x1=180*sin(i*6*PI/180)+300;y1=180*cos(i*6*PI/180)+240;x2=(180-l)*sin(i*6*PI/180)+300;y2=(180-l)*cos(i*6*PI/180)+240;line(x1,y1,x2,y2);}outtextxy(300,80,"12") ;outtextxy(300,390,"6");outtextxy(140,230,"9");outtextxy(460,230,"3");outtextxy(380,100,"1");outtextxy(220,100,"11");outtextxy(430,160,"2");outtextxy(430,310,"4");outtextxy(380,370,"5");outtextxy(220,370,"7");outtextxy(160,160,"10");outtextxy(160,310,"8");}3.将获取的整数型时间变量转换成字符型void ch1(int a,int x) //将年转换成字符型并输出{char b,c,d,e;b=(char)(a/1000+48);c=(char)((a%1000)/100+48);d=(char)((a%100)/10+48);e=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);outtextxy(x+20,10,d);outtextxy(x+30,10,e);}void ch2(int a,int x) //其他时间转换成字符型并输出{char b,c;b=(char)(a/10+48);c=(char)(a%10+48);outtextxy(x,10,b);outtextxy(x+10,10,c);}主函数:void main(){initgraph(640, 480); // 初始化绘图窗口Drawbiaopan(); // 绘制表盘setwritemode(R2_XORPEN); // 设置绘图模式SYSTEMTIME ti; // 定义ti保存当前时间while(!kbhit()) // 按任意键退出钟表程序{GetLocalTime(&ti); // 获取当前时间ch1(ti.wYear,10);outtextxy(50,10,"年"); //输出时间ch2(ti.wMonth,65);outtextxy(85,10,"月");ch2(ti.wDay,100);outtextxy(120,10,"日");ch2(ti.wHour,135);outtextxy(155,10,":");ch2(ti.wMinute,165);outtextxy(185,10,":");ch2(ti.wSecond,195);Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针Sleep(1000); // 延时1 秒Drawzhizhen(ti.wHour, ti.wMinute, ti.wSecond); // 画表针}closegraph(); // 关闭绘图窗口}四程序的调试与运行结果调试过程出现的问题:1.Vc++6.0中没有“graphics.h”解决办法:安装turboc.2.0中的函数库EasyX2.无法获取系统时间解决办法:使用函数GetLocalTime( );并使用#include <time.h>声明3.Outtextxy()函数无法显示整数型时间解决办法:将整数型时间变量转换为字符型再输出运行结果:五心得体会由于C语言没有学过图形方面的知识,很多东西都要去查资料。

实时时钟设计试验报告

实时时钟设计试验报告

实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。

通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。

二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。

时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。

三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。

将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。

2.编写程序。

使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。

同时,设置按键模块的功能,使其可以进行时间和日期的设置。

3.烧录程序。

使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。

4.运行实验。

接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。

五、实验结果经过实验,我们成功设计出了一个实时时钟系统。

系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。

在设置新的时间和日期后,系统能够正确地更新并显示。

六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。

我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。

同时,我们也发现了实时时钟系统的一些问题,并加以解决。

我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。

然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。

需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。

总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。

C语言课程设计报告-模拟时钟转动程序

C语言课程设计报告-模拟时钟转动程序

课程设计报告课程名称结构化程序设计课程设计院部名称专业班级学生姓名王蕾学号课程设计地点课程设计学时指导教师金陵科技学院教务处制目录第一章课程设计的目的和要求.............................................1.1 C语言课程设计的目的............................................1.2 C语言课程设计实现的要求........................................ 第二章课程设计的任务内容............................................... 第三章详细设计说明.....................................................3.1 程序系统的结构..................................................3.1.1 实验设备及环境:(软、硬件环境)3.2 模块描述........................................................3.2.1 指针式时钟................................................3.2.2 数字式时钟................................................3.3 输出项..........................................................3.4 算法............................................................3.5 流程图..........................................................3.6 函数说明........................................................3.7 接口............................................................3.8 调试结果........................................................ 第四章软件使用说明.....................................................4.1 软件使用说明及出现的问题........................................4.2 运行结果........................................................ 第五章课程设计心得与体会............................................... 附录1:参考文献......................................................... 附录2:修改后的源代码……………………………………………………………………模拟时钟转动程序第一章课程设计的目的和要求1.1 C语言课程设计的目的加深对讲授内容的理解,尤其是一些语法规定。

时、分、秒计时器实验报告

时、分、秒计时器实验报告

实验六时、分、秒计时器的设计班级物联0901 姓名李王张学号200908888888 指导老师袁文澹一、实验目的掌握数码管动态显示的基本方法;掌握键盘按键控制的实现方法;根据已知电路和设计要求在实验板上实现时、分、秒计时器。

二、实验内容1、在STC89C52实验平台上实现时、分、秒时钟,4位数码管上显示分、秒或者时、分。

2、应用键盘控制时间的显示。

键盘按键控制“切换时分、分秒显示”、“启动停止”、“加秒显示内容”、“加分显示内容”、“加时显示内容”。

3、根据已知电路和设计要求在PROTEUS平台仿真实现时钟系统。

三、实验原理三、程序代码汇集:/*时钟及显示程序,适用于寻迹小车实验板*/#include<reg51.h>//头文件#define uchar unsigned char#define uint unsigned intuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳七段编码uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uchar miao=00; //定义时钟变量,当temp计数加20(20x50ms=1s)时,miao加1uchar fen=00; //定义时钟变量,当miao计数加60(60x20x50ms=60s)时,fen加1uchar shi=00; //定义时钟变量,当fen计数加60时,shi加1 sbit P0_6=P0^6 ;//定义P0端口/*--定时计数器T0及其中断初始化函数--*/void timer0init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0}/*----------延时函数---------------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=124;j>0;j--);}/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==20){temp=0;if(miao==59){miao=0;if(fen==59){fen=0;if(shi==23) shi=0;else shi++;}else fen++;}else miao++;}else temp++;}/*--------------显示函数------------*/void display(void){/*P1=0xfe;*/P1=0x7f;//输出秒的个位的位码 P0=table[miao%10]; //输出秒的个位的段码 delay(5); //亮5ms/*P1=0xfd;*/P1=0xbf;//输出秒的十位的位码 P0=table[miao/10]; //输出秒的十位的段码 delay(5); //亮5ms/*P1=0xfb;*/P1=0xdf;P0=0xbf;delay(5);/*P1=0xf7;*/ P1=0xef; //输出分的个位的位码P0=table[fen%10]; //输出分的个位的段码delay(5);/*P1=0xef;*/P1=0xf7; //输出分的十位的位码P0=table[fen/10]; //输出分的十位的段码delay(5);/*P1=0xdf;*/P1=0xfb;P0=0xbf;delay(5);/*P1=0xbf;*/P1=0xfd; //输出时的个位的位码P0=table[shi%10]; //输出时的个位的段码delay(5);/*P1=0x7f;*/P1=0xfe; //输出时的十位的位码P0=table[shi/10]; //输出时的十位的段码delay(5);}/*----------主函数-----------------*/void main(void){timer0init();//调用初始化函数对定时计数器进行初始化while(1){display();//调用显示函数显示时间}四、仿真调试:在完成程序仿真调试过程中,出现了很多小问题,这些问题虽然简单,但真正解决起来还是比较棘手的。

c语言图形模拟时钟

c语言图形模拟时钟

2014-2015学年第二学期《高级语言程序设计》课程设计报告题目:图形模拟时钟专业:计算机科学与技术班级:14级(2)班姓名:王欣指导教师:陈广宏成绩:计算机学院2015年5月20日目录1 设计内容及要求 (2)1.1设计要求 (2)1.2程序结构流程图 (2)2 概要设计 (4)2.1概要分析 (4)2.2数据结构设计 (6)2.3用法说明 (6)2.4实验结果要求 (7)3 设计结果与分析 (7)3.1实验结果 (7)3.2实验结果与分析 (7)4 小结 (8)致谢 (8)参考文献 (8)源代码 (9)1 设计内容及要求1.1设计要求模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。

在屏幕上显示一个图形时钟(用程序绘制一个班于时钟样式相似即可),时间与系统时间一致,且要随着时间的走到准确的走动。

1.2程序结构流程图图1:总程序流程图2:指针转动流程图2 概要设计2.1概要分析(1) void Drawclock函数void DrawClock(int x,int y,int color){ int r=150;float th;setcolor(color);circle(x,y,r);circle(x,y,2);}作用:画表盘(r为表盘的半径, x,y为圆心的坐标。

)(2) void DrawHand 函数void DrawHand(int x,int y,float th,int l,int color) {int x1,y1;x1=x+l*sin(th);y1=y-l*cos(th);setcolor(color);line(x,y,x1,y1);}作用:画指针x:直线起点的横坐标 y:直线起点的纵坐标x1:直线终点的横坐标 y1:直线终点的纵坐标(3) void main() 函数Part ①:int gdriver=DETECT,gmode;struct time curtime; ..............类型和最高分辨率float th_hour,th_min,th_sec;initgraph(&gdriver,&gmode,"");Graphdriver - - -配适器graphmode - - - 显示模式Part ②:setbkcolor(0); ....................背景色Part ③:while(! kbhit()){DrawClock(x0,y0,14); ..................函数gettime(&curtime); .........得到当前系统时间gotoxy(35,20); ...............定位输出位置Part ④:if((float)curtime.ti_hour<=12) .............上午的时间处理 {printf("AM ");if((float)curtime.ti_hour<10) printf("0");.... 十点之前在小时数前加零printf("%.0f:",(float)curtime.ti_hour); }...........输出小时else ............下午的时间处理{printf("PM ");if((float)curtime.ti_hour-12<10) printf("0");.........如果时间减去12小时小于10printf("%.0f:",(float)curtime.ti_hour-12); }.......... 输出小时Part ⑤:if((float)curtime.ti_min<10) printf("0");......... 相当于小时的计算方法printf("%.0f:",(float)curtime.ti_min); ....... 输出分钟(同part ④)if((float)curtime.ti_sec<10) printf("0");printf("%.0f",(float)curtime.ti_sec);Part ⑥:以下三行计算表针转动角度,以竖直向上为起点,顺时针为正th_sec=(float)curtime.ti_sec*0.1047197551;- - - - - - - - - - - - - *(2π/60=0.1047197551)th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0;th_hour=(float)curtime.ti_hour*0.523598775+th_min/12.0;- - - - *(2π/12=0.5235987755)Part ⑦:画指针DrawHand(x0,y0,th_hour,70,2); ...................画时针DrawHand(x0,y0,th_min,110,3); ...................画秒针Part ⑧:settextstyle(2,0,3); ..............设置字体2:文字的字体;0:文字的方向;3:文字的大小outtextxy(270,160,"MADE BY:SDW"); .............输出字体(270,160)为字体的坐标Part ⑨:sleep(1); ...........延时一秒后刷新cleardevice(); ............. 清除图形屏幕closegraph() ... ....关闭图形系统,退出图形方式2.2数据结构设计1) 是对时钟程序做全面的分析,即对程序要使用的编写方法功能,运行方式进行分析,并做出正确的解决方案。

电子钟实验报告.c

电子钟实验报告.c

2011-2012学年上半年工程实训实验报告------电子钟制作姓名:付攀学号:8000609066班级:计软092班实验目的:通过编程与仿真,制作电子钟实物。

电子钟实现时钟功能、时钟调整功能、秒表功能、闹钟功能。

同时体会制作实物的过程,包括编程、仿真、和焊接。

实验器材:按键说明:一个用于小时加,一个用于分钟加,一个用于功能切换,一个用于复位。

实验流程:总体步骤:1.编程与仿真2.焊接制作实物。

流程说明:在protues仿真平台上画出仿真图,在keil平台上编写程序,编译运行生成hex文件,把hex文件灌入仿真图中,进行电子钟仿真。

仿真截图如下:时钟显示时间调整秒表计时闹钟设置所编写的程序如下:#include <reg51.h>sbit thour=P1^0;sbit tmin=P1^1;sbit light=P1^2;sbit rst=P1^4;#define uchar unsigned char#define uint unsigned intint flag;uint count1,count2;uchar hour=0,min=0,sec=0;uchar msec=0,se=0,mi=0;uchar h=7,m=10,s=0;uchar table[30]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极数码管,分别表示0~9void delay(uint k) //延时函数{uint i,j;for(i=0;i<120;i++)for(j=0;j<k;j++);}void display() //时钟显示函数{delay(1);P2=0xdf;P0=table[hour/10];delay(1);P2=0xef;P0=table[hour%10];delay(1);P2=0xf7;P0=table[min/10];delay(1);P2=0xfb;P0=table[min%10];delay(1);P2=0xfd;P0=table[sec/10];delay(1);P2=0xfe;P0=table[sec%10];}void settime() //时间调整函数,小时加和分加{if (tmin==0){delay(1);if (tmin==0){min++;if(min>=60) min=0;while(tmin==0) display();}if (thour==0){delay(1);if (thour==0){hour++;if(hour>=24) hour=0;}while(thour==0) display();}}void init1() //定时计数器0的初始化{//TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}void display2() //秒表显示函数{delay(1);P2=0xdf;P0=table[mi/10];delay(1);P2=0xef;P0=table[mi%10];delay(1);P2=0xf7;P0=table[se/10];delay(1);P2=0xfb;P0=table[se%10];delay(1);P2=0xfd;P0=table[msec/10];delay(1);P2=0xfe;P0=table[msec%10];}void init2() //定时计数器1的初始化{//TMOD=0x11;TH1=(65536-10000)/256;TL1=(65536-10000)%256;TR1=1;ET1=1;EA=1;msec=0;mi=0;}void display3() //闹钟显示函数{delay(1);P2=0xdf;P0=table[h/10];delay(1);P2=0xef;P0=table[h%10];delay(1);P2=0xf7;P0=table[m/10];delay(1);P2=0xfb;P0=table[m%10];delay(1);P2=0xfd;P0=table[s/10];delay(1);P2=0xfe;P0=table[s%10];}void setalarm() //闹钟设置函数{if (tmin==0){delay(1);if (tmin==0){m++;if(m>=60) m=0;}while(tmin==0) display3();}if (thour==0){delay(1);if (thour==0){h++;if(h>=24) h=0;}while(thour==0) display3();}}extern void rest(void); //实际并不存在,实现复位不需要,因为复位系统,但是仿真的时候复位系统那个没起作用,所以重新弄了一个按键用于复位void main(){TMOD=0x11;count1=0;count2=0;init1();init2();EX0=1;IT0=1;flag=0;light=1;while(1){if(flag%6==0) //①开始时钟{init2();display();}if(flag%6==2) //③调整之后显示时钟{TR0=1;display();}if(flag%6==1) //②时钟暂停,可调整时钟{TR0=0;TR1=0;settime();delay(10);display();}if(flag%6==3) //④秒表开始{TR1=1;display2();}if(flag%6==4) //⑤秒表暂停,计时{TR1=0;display2();}if(flag%6==5) /⑥/闹钟时间设置{setalarm();delay(10);display3();}if(rst==0){delay(1);if(rst==0){reset();flag=0;}}if( hour==h&&min==m) light=0;else light=1;}}void t0(void) interrupt 1 //T0中断程序定时50毫秒{count1++;if(count1==20){count1=0;sec++;if(sec==60){min++;sec=0;if(min==60){hour++;min=0;if(hour==24){hour=0;}}}}TH0=(65536-50000)/256;TL0=(65536-50000)%256;}void t1(void) interrupt 3 //T1中断程序定时10ms{count2++;if(count2==1){count2=0;msec++;if(msec==100){se++;msec=0;if(se==60){mi++;se=0;}}}TH1=(65536-10000)/256;TL1=(65536-10000)%256;}void int0(void) interrupt 0 //外部中断0中断程序{flag++;}编程与仿真时遇到的问题及解决如下:1.程序暑假自己写了,也一直弄,就是弄不好,所以实训第二天晚上就是参考的网上的和同学的,然后根据自己的仿真图加工成自己的,也增加了一些功能..就是加减和秒表没法按出来,秒表单独写程序可以。

VC++课程设计--基于MFC的模拟时钟

VC++课程设计--基于MFC的模拟时钟

VC++课程设计--基于MFC的模拟时钟计科2011级VC++课程设计实验报告题目:基于MFC的模拟时钟班级:计科1104班学号:1108030429姓名:张宝龙日期:2014/1/7课程设计实验报告1、题目:基于MFC的模拟时钟2、编程要点:制作时钟的过程中,首先给时钟创建一个基类CClockElement,还需要派生类CClockBackground,CClockHourHand,CClockMin Hand,CClockSecHand分别控制时钟的背景,时钟的时针,分针,秒针。

3、实现过程:(1)工程、风格、控件与变量表本时钟是基本对话框的时钟,界面简约,便于使用。

控件控件名控件类型Clock 静态文本变量表变量名类型m_crMain COLORREF m_crOther COLORREFm_tmCur CTimem_rcRegion CRectm_nRadius intm_clockBK CClockBackground m_clockHour CClockHourHandm_clockMin CClockMinHandm_clockSec CClockSecHandm_rcClient CRectm_Clock CClockEX(2)主要功能程序代码CClockBackground::CClockBackground() {//为时钟背景定义默认的颜色设置m_crMain=RGB(0,0,255);m_crOther=RGB(0,255,0);}void CClockBackground::Draw(CDC *pDC) {//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS _SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther);CBrush*pOldBrush=pDC->SelectObject(&brMain);CPointptCenter=m_rcRegion.CenterPoint();int nRadius=m_nRadius-8;for(int i=0;i<60;i++){CPoint ptEnd=ptCenter;ptEnd.Offset((int)(nRadius*sin(2*PI*(i% 60)/60)),(int)(-nRadius*cos(2*PI*(i%60)/60)));CRect rcDot(-2,-2,2,2);rcDot.OffsetRect(ptEnd);pDC->Ellipse(rcDot);}//绘制12个小方框,表示12个正点pDC->SelectObject(&penMain);pOldBrush=pDC->SelectObject(&brOth er);for(i=0;i<12;i++){CPoint ptEnd=ptCenter;double fRadian=2*PI*(i%12)/12;ptEnd.Offset((int)(nRadius*sin(fRadian) ),(int)(-nRadius*cos(fRadian)));CRect rcDot(-3,-3,3,3);rcDot.OffsetRect(ptEnd);pDC->Rectangle(rcDot);}//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockHourHand::CClockHourHand(){//定义默认颜色m_crMain=RGB(0,0,128);m_crOther=RGB(128,128,0);}void CClockHourHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain);//确定当前指针的弧度intnTime=(m_tmCur.GetHour()%12)*3600;nTime+=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();doublefRadian=2*PI*nTime/3600/12;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/2;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockMinHand::CClockMinHand(){//定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);}void CClockMinHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain );//确定分针所在位置的弧度intnTime=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();double fRadian=2*PI*nTime/3600;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/4;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockSecHand::CClockSecHand(){//设定秒针的默认颜色m_crMain=RGB(0,200,200);m_crOther=RGB(0,200,200);}void CClockSecHand::Draw(CDC *pDC){int nTime=m_tmCur.GetSecond();CPointptStart=m_rcRegion.CenterPoint();CPoint ptEnd=ptStart;int nRadius=m_nRadius-10;ptEnd.Offset((int)(nRadius*sin (2*PI*nTime/60)),(int)(-nRadius*cos( 2*PI*nTime/60)));CPenpenMain(PS_SOLID,1,m_crMain);CPen*pOldPen=pDC->SelectObject (&penMain);pDC->MoveTo(ptStart);pDC->LineTo(ptEnd);pDC->SelectObject(pOldPen);}void CClockEX::OnTimer(UINT nIDEvent){Invalidate(FALSE);CStatic::OnTimer(nIDEvent);}void CClockEX::OnSize(UINT nType, int cx, int cy){CStatic::OnSize(nType, cx, cy);GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);}void CClockEX::OnPaint(){CPaintDC dc(this); // device context for painting//实现双缓冲绘图---防止屏幕闪烁CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmp;bmp.CreateCompatibleBitmap(&dc ,m_rcClient.Width(),m_rcClient.Heigh t());dcMem.SelectObject(&bmp);DrawClock(&dcMem); //绘制时钟dc.BitBlt(0,0,m_rcClient.Width (),m_rcClient.Height(),&dcMem,0,0,SR CCOPY);}voidCClockEX::PreSubclassWindow(){GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);SetTimer(1,100,NULL);CStatic::PreSubclassWindow();}void CClockEX::DrawClock(CDC *pDC){CTimetmCur=CTime::GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockHour.Draw(pDC);m_clockMin.Draw(pDC);m_clockSec.Draw(pDC);}CClockElement::CClockElement(){m_nRadius=0;m_crMain=RGB(255,0,0);m_crOther=RGB(128,128,0);}voidCClockElement::SetRegion(LPRECT lprcRect){m_rcRegion=lprcRect;m_nRadius=m_rcRegion.Width()/2;if(m_rcRegion.Width()>m_rcRegion.Hei ght()){m_nRadius=m_rcRegion.Height()/2;}}void CClockElement::SetTime(const CTime &tmCur){m_tmCur=tmCur;}voidCClockElement::SetColor(COLORREF crMain,COLORREF crOther){m_crMain=crMain;m_crOther=crOther;}4、运行效果展示:5、自我总结:该小程序是基于MFC中的对话框的,主要针对画笔和画刷的用法,没有涉及连接数据库和算法,完全是为了本学期所学知识的运用,由于时间紧,所以没能深入的探索MFC的奥妙,不过通过本次设计,我对老师课堂上所讲述的关于该类型的知识,有了进一步的了解和掌握,初步的熟悉了画笔和画刷的简单用法,还巩固了MFC类中的基本操作,例如,添加新类,新变量,创建新的对话框,添加控件等方面的知识。

c++模拟时钟实验报告

c++模拟时钟实验报告

集中上机实习报告指导教师:王利姓名:赵蕊学号: 2010211864班级: 0411003时间: 2012.5模拟时钟程序一.需求分析1.题目内容:编写一个模拟时钟程序,此程序在屏幕左方有一指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。

用菜单选项或按钮设置时间和秒表。

时间不必与机器系统时间相同,只要可任意设置即可。

2.题目分析:(1)模拟时钟是一种集计时器和时钟显示于一体的程序。

编写一个指针式时钟程序,此程序在屏幕左方有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期、星期和时间。

指针式的时钟表盘为圆形,并且圆周上有分布均匀的60个刻度,刻度要求显示清楚,钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规律性,且为顺时针。

数字钟显示时间的格式是年月日星期时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步。

按下时钟控制设置时间菜单项可弹出一对话框,用于设置当前的时间、日期和星期;按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

(2)本实验主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

3.最终效果如下图:二.概要设计1.程序系统模块划分2.程序算法分析本程序不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)指针长度是指自圆心至指针一个端点的长度,由于指针要跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针每转12格引起时针运动一格,而因此应该使用一个定时器消息来处理指针的运动。

北工大C时钟系统课程设计报告培训

北工大C时钟系统课程设计报告培训

C#综合设计报告课题名称:时钟系统班级:xxx姓名:xxx学号:xxxx组员:xxxxxxxxxx一、实验要求时钟系统设计出现指针时钟实时更新时间,包括时、分、秒三个指针,显示12个钟点,可以设置不同的时区(东一区到东八区),出现日历,更改表盘,表针的的颜色设置。

可以实现闹钟,秒表功能。

二、时钟系统分析时钟系统模块:三、系统实现1. 主窗体:显示指针时钟(12个钟点、三个指针),日历,实现时区设置,表盘颜色更改设置,表盘颜色更改设置。

流程图:主窗体设计:主窗体源程序代码:using System;usingSystem.Collections.Generic; ponentModel; usingSystem.Data;usingSystem.Drawing; usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespace _0{publicpartialclassForm1 : Form {public Form1(){InitializeComponent();}publicvoid timer1_Tick(object sender, EventArgs e){string hour;//定义hour字符串DateTime time = DateTime.Now;//定义time为现在系统的时间int h = time.Hour; //定义h为系统时间的小时int date = time.Day ;//定义date为系统时间的日期hour = (comboBox1.Text).Trim();//hour为选择的时区if (hour == "东1区") h =h- 7;//东一区比东八区晚7个小时,现在所处地点为北京为东八区,以此类推得到东一区到东八区时间的小时数if (hour == "东2区") h =h- 6;if (hour == "东3区") h =h- 5;if (hour == "东4区") h =h- 4;if (hour == "东5区") h =h- 3;if (hour == "东6区") h =h- 2;if (hour == "东7区") h =h- 1;if (hour == "东8区") h =h- 0;if (h < 0)//如何算出的h<0了,证明还没到这天,对应的日期也要减一天,小时加24。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

集中上机实习报告指导教师:王利姓名:赵蕊学号: 2010211864班级: 0411003时间: 2012.5模拟时钟程序一.需求分析1.题目内容:编写一个模拟时钟程序,此程序在屏幕左方有一指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。

用菜单选项或按钮设置时间和秒表。

时间不必与机器系统时间相同,只要可任意设置即可。

2.题目分析:(1)模拟时钟是一种集计时器和时钟显示于一体的程序。

编写一个指针式时钟程序,此程序在屏幕左方有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期、星期和时间。

指针式的时钟表盘为圆形,并且圆周上有分布均匀的60个刻度,刻度要求显示清楚,钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规律性,且为顺时针。

数字钟显示时间的格式是年月日星期时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步。

按下时钟控制设置时间菜单项可弹出一对话框,用于设置当前的时间、日期和星期;按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

(2)本实验主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

3.最终效果如下图:二.概要设计1.程序系统模块划分2.程序算法分析本程序不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)指针长度是指自圆心至指针一个端点的长度,由于指针要跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针每转12格引起时针运动一格,而因此应该使用一个定时器消息来处理指针的运动。

若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。

采用一个定时器消息可以很容易实现指针联动算法。

由于屏幕的重绘速度快,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。

本程序采用非删除式重绘,假定指针将要移动一格,则先采用表盘背景色(这里为浅绿色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。

另外,秒表需要采用单独的定时器消息控制,秒表重绘速度很快,屏幕闪烁明显,故本程序采用了双缓冲绘图。

3.系统流程图置时间三.详细设计1.模块描述(1)指针式时钟指针式的时钟表盘为圆形,并且圆周上有分布均匀的12个数字刻度和48个较小的原点刻度,刻度显示清楚,用来表示小时、分钟和秒数。

钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动具有规律性,为顺时针。

(2)数字式时钟数字钟显示时间的格式是时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且俩时钟可以同时设置。

(3)秒表按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。

再次按下秒表控制按钮后计时停止,该窗口显示累计时间。

2.函数描述(1)CPoint p;double angle = nvalue *PI/30 ;p.x = m_Center.x + (int)(nlenth*sin(angle));p.y = m_Center.y - (int)(nlenth*cos(angle));return p;用来得到时钟刻度点和时针、分针、秒针的端点(2)h our = hour*5;hour = hour + minute/12;m_OldHour[0] = m_Hour[0];m_OldHour[1] = m_Hour[1];m_Hour[0] = GetPoint(int(m_Radious/2),hour);m_Hour[1] = GetPoint(7,hour + 30);m_OldMin[0] = m_Minute[0];m_OldMin[1] = m_Minute[1];m_Minute[0] = GetPoint(int(m_Radious*7/10),minute);m_Minute[1] = GetPoint(10,minute + 30);m_OldSec[0] = m_Second[0];m_OldSec[1] = m_Second[1];m_Second[0] = GetPoint(int(m_Radious*8/10),second);m_Second[1] = GetPoint(30, second + 30);用来得到时针、分针、秒针的当前位置和上一时刻位置并将其保存(3)CRect rc;CDC dcMem;GetClientRect(&rc);CBitmap bmp;dcMem.CreateCompatibleDC(pDC);bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());CBitmap *pOldBit=dcMem.SelectObject(&bmp);dcMem.FillSolidRect(rc,RGB(255,255,255));………….//画图代码pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);dcMem.DeleteDC();bmp.DeleteObject();利用双缓冲防止屏幕画面闪烁四.实现环境及工具Win7 环境下VC++ 6.0 MFC五.程序测试1.对时间设置测试按下确定后测试其设置为需要设置的时间,并正常运行。

2.对秒表测试点下启动后它正常运行;点下停止后它停止运行并记录当前累积时间。

再次按下启动按钮时它计时清零并重新开始计时。

3.整体3部分测试同时运行时三部分均正常运行,并且屏幕也不闪烁。

六.心得体会通过本次实验,对c++编程有了进一步的了解和能够更加熟练的编程,还学习了MFC的一些画图处理函数,以及一些运行机理,能够基本掌握用MFC画图,且能够实现一些基本的功能。

在本次设计的初期,只实现了小部分功能,对画图及其不了解,且对窗口设置的不合理倒是画面相当丑陋,后来通过请教同学、老师、上网查资料,最终设计出比较满意的画面。

还有,本次设计的秒表设计,由于它的刷新频率太高,导致屏幕闪烁严重,画面看起来很不舒畅,后面经查资料发现双缓冲技术能够解决这一问题,也将这个问题成功解决。

觉得本次设计中的采用不同的计时器来控制不同的模块效果比较好,对每一模块进行独立的控制很短单,而且思路清晰。

总之在本次实验中我学到了很多知识,而且培养了自己的自学能力,逼着自己进行查阅大量的资料。

在本次实验中自己对程序一直修改,一直增加功能和改善画面,大大的提高了自己的动手能力。

附:源代码及详细注释(由于使用的MFC向导形成工程只附部分核心代码)在中加public:int year;int month;int day;int hour;int second;int minute;int watch;int wday;CPenm_HouPen,m_NoHouPen,m_MinPen,m_NoMinPen,m_SecPen,m_NoSecPen,m _circle,m_RectPen;HBRUSHm_HurkBrush,m_CircleBrush,m_RecBrush,m_RectBrush,m_RectBrush1 ,m_RectBrush2;CPoint m_Center;double m_Radious;CPoint m_Hour[2],m_OldHour[2];CPoint m_Minute[2],m_OldMin[2];CPoint m_Second[2],m_OldSec[2];CRect m_WatchStart;CRect m_WatchStop;void SetClock(int hour,int minute,int second);CPoint GetPoint(int nlenth,int nvalue);#include "stdafx.h"#include "Clock.h"#define PI 3.14159265#include<cmath>#include"SetTimeDlg.h"#include "ClockDoc.h"#include "ClockView.h"#include<ctime>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif中初始化设置变量///////////////////////////////////////////////////////// ////////////////////// CSetTimeDlg dialogCSetTimeDlg::CSetTimeDlg(CWnd* pParent /*=NULL*/): CDialog(CSetTimeDlg::IDD, pParent){//{{AFX_DATA_INIT(CSetTimeDlg)long now = time(NULL);tm local = *localtime(&now);m_Day = local.tm_mday;;m_Hour = local.tm_hour;m_Minute = local.tm_min;m_Month = local.tm_mon + 1;m_Second = local.tm_sec;m_Year = local.tm_year+1900;m_Wday = local.tm_wday;//}}AFX_DATA_INIT}void CSetTimeDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSetTimeDlg)DDX_Text(pDX, ID_DAY, m_Day);DDV_MinMaxInt(pDX, m_Day, 1, 31);DDX_Text(pDX, ID_HOUR, m_Hour);DDV_MinMaxInt(pDX, m_Hour, 0, 23);DDX_Text(pDX, ID_MINUTE, m_Minute);DDV_MinMaxInt(pDX, m_Minute, 0, 59);DDX_Text(pDX, ID_MONTH, m_Month);DDV_MinMaxInt(pDX, m_Month, 1, 12);DDX_Text(pDX, ID_SECOND, m_Second);DDV_MinMaxInt(pDX, m_Second, 0, 59);DDX_Text(pDX, ID_YEAR, m_Year);DDV_MinMaxInt(pDX, m_Year, 0, 3000);DDX_Text(pDX, ID_WDAY, m_Wday);DDV_MinMaxInt(pDX, m_Wday, 0, 6);//}}AFX_DATA_MAP}///////////////////////////////////////////////////////// ////////////////////// CClockViewIMPLEMENT_DYNCREATE(CClockView, CView)BEGIN_MESSAGE_MAP(CClockView, CView)//{{AFX_MSG_MAP(CClockView)ON_COMMAND(ID_START, OnStart)ON_COMMAND(ID_STOP, OnStop)ON_COMMAND(ID_STETIME, OnStetime)ON_WM_TIMER()ON_WM_LBUTTONDOWN()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////// ////////////////////// CClockView construction/destructionCClockView::CClockView(){ //初始化时间为系统时间long now = time(NULL);tm local = *localtime(&now);year = local.tm_year+1900;month = local.tm_mon + 1;day = local.tm_mday;minute = local.tm_min;hour = local.tm_hour;second = local.tm_sec;wday = local.tm_wday;//创建画笔、画刷m_HouPen.CreatePen(PS_SOLID,5 ,RGB(255,50,0));m_NoHouPen.CreatePen(PS_SOLID,5 ,RGB( 204,255, 102 )); m_MinPen.CreatePen(PS_SOLID,3 ,RGB(0,0,255));m_NoMinPen.CreatePen(PS_SOLID,3 ,RGB( 204,255, 102 )); m_SecPen.CreatePen(PS_SOLID,1 ,RGB(0,0,0));m_NoSecPen.CreatePen(PS_SOLID,1 ,RGB( 204,255, 102 )); m_circle.CreatePen(PS_SOLID,2 ,RGB(0,0,0));m_RectPen.CreatePen(PS_SOLID,3 ,RGB(204,102,0));m_HurkBrush = CreateSolidBrush( RGB( 255,0, 0 ));m_CircleBrush = CreateSolidBrush( RGB( 204,255, 102 )); m_RecBrush = CreateSolidBrush( RGB( 255,255, 51 ));m_RectBrush = CreateSolidBrush( RGB( 102,51, 0 ));m_RectBrush1 = CreateSolidBrush( RGB( 255,51, 0));m_RectBrush2 = CreateSolidBrush( RGB( 0,102, 204));m_Center.x = 200;m_Center.y = 200;m_Radious = 185;SetClock(hour,minute,second);watch = 0;m_WatchStart =CRect(480,310,560,340);m_WatchStop= CRect(590,310,670,340);// TODO: add construction code here}CClockView::~CClockView(){}void CClockView::SetClock(int hour,int minute,int second) {hour = hour*5;//时针每过1小时转5*PI/3hour = hour + minute/12; //时针每过12分钟转PI/3//保存时钟原位置m_OldHour[0] = m_Hour[0];m_OldHour[1] = m_Hour[1];//计算时针当前位置m_Hour[0] = GetPoint(int(m_Radious/2),hour);m_Hour[1] = GetPoint(7,hour + 30);//保存分针位置m_OldMin[0] = m_Minute[0];m_OldMin[1] = m_Minute[1];//计算分针位置m_Minute[0] = GetPoint(int(m_Radious*7/10),minute); m_Minute[1] = GetPoint(10,minute + 30);//保存秒针位置m_OldSec[0] = m_Second[0];m_OldSec[1] = m_Second[1];//计算秒针位置m_Second[0] = GetPoint(int(m_Radious*8/10),second); m_Second[1] = GetPoint(30, second + 30);}CPoint CClockView::GetPoint(int nlenth,int nvalue) { // 用来计算指针的俩端点的位置和表盘上刻度的位置CPoint p;double angle = nvalue *PI/30 ;p.x = m_Center.x + (int)(nlenth*sin(angle));p.y = m_Center.y - (int)(nlenth*cos(angle));return p;}BOOL CClockView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////// ////////////////////// CClockView drawing//*********画表***********//void CClockView::OnDraw(CDC* pDC){SetTimer(1,1000,NULL);CClockDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect rc;CDC dcMem;GetClientRect(&rc);CBitmap bmp; //内存中承载临时图象的位图dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC//创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());CBitmap *pOldBit=dcMem.SelectObject(&bmp); //按原来背景填充客户区,不然会是黑色dcMem.FillSolidRect(rc,RGB(255,255,255));//画图,添加你要画图的代码,不过用dcMem画,而不是pDc//画表盘最外面的大圆并填充颜色dcMem.SelectObject(m_circle);dcMem.Ellipse(m_Center.x - 195,m_Center.y-195,m_Center.x + 195,m_Center.y + 195);dcMem.SelectObject(m_CircleBrush);dcMem.Ellipse(m_Center.x - 195,m_Center.y -195,m_Center.x + 195,m_Center.y + 195);//画60个刻度for(int i = 0; i < 60 ; i++){CPoint pt = GetPoint(m_Radious,i);dcMem.SelectObject(m_SecPen);//画小时刻度if(i%5 ==0){CString m_Number;dcMem.SetBkMode(TRANSPARENT); //将textout背景透明m_Number.Format("%2d",(i/5==0 ? 12 : i/5));dcMem.TextOut(pt.x-7,pt.y-7,m_Number);}//画小时之间的刻度else{dcMem.SelectObject(m_HurkBrush);dcMem.Ellipse(pt.x - 2,pt.y -2,pt.x + 2,pt.y + 2);}}//画时针if(m_OldHour[0] != m_Hour[0]){ //用表盘背景色覆盖原来的时针dcMem.SelectObject(m_NoHouPen);dcMem. MoveTo(m_OldHour[0]);dcMem.LineTo(m_OldHour[1]);//时针绘制dcMem.SelectObject(m_HouPen);dcMem. MoveTo(m_Hour[0]);dcMem.LineTo(m_Hour[1]);}else{dcMem.SelectObject(m_HouPen); dcMem. MoveTo(m_Hour[0]); dcMem.LineTo(m_Hour[1]);}//画分针if(m_OldMin[0] != m_Minute[0]) { //用表盘背景覆盖原来的分针dcMem.SelectObject(m_NoMinPen); dcMem. MoveTo(m_OldMin[0]);dcMem.LineTo(m_OldMin[1]);//分针绘制dcMem.SelectObject(m_MinPen);dcMem. MoveTo(m_Minute[0]);dcMem.LineTo(m_Minute[1]);}else{ dcMem.SelectObject(m_MinPen); dcMem. MoveTo(m_Minute[0]);dcMem.LineTo(m_Minute[1]);}//画秒针if(m_OldSec[0] != m_Second[0]) {//用表盘背景覆盖原来的秒针dcMem.SelectObject(m_NoSecPen); dcMem. MoveTo(m_OldSec[0]); dcMem.LineTo(m_OldSec[1]);//秒针绘制dcMem.SelectObject(m_SecPen); dcMem. MoveTo(m_Second[0]); dcMem.LineTo(m_Second[1]);}else{ dcMem.SelectObject(m_SecPen); dcMem. MoveTo(m_Second[0]);dcMem.LineTo(m_Second[1]);}//数字时钟显示//画一个矩形框然后将其用颜色填充dcMem.SelectObject(m_RectPen);dcMem.Rectangle(450,30,700,180);dcMem.SelectObject(m_RectBrush);dcMem.Rectangle(450,30,700,180);//显示“当前时间”以及日期、星期、时间dcMem.TextOut(530,10,"当前时间");CString m_Date, m_Time,m_Wday;m_Date.Format("%4d年%2d月%2d日",year,month,day); dcMem.TextOut(510,70,m_Date);switch(wday){ case 0:m_Wday.Format("星期日");dcMem.TextOut(540,88,m_Wday);break;case 1:m_Wday.Format("星期一");dcMem.TextOut(540,88,m_Wday); break;case 2:m_Wday.Format("星期二");dcMem.TextOut(540,88,m_Wday); break;case 3:m_Wday.Format("星期三");dcMem.TextOut(540,88,m_Wday); break;case 4:m_Wday.Format("星期四");dcMem.TextOut(540,88,m_Wday); break;case 5:m_Wday.Format("星期五");dcMem.TextOut(540,88,m_Wday); break;}m_Time.Format("%4d时%2d分%2d秒",hour,minute,second);dcMem.TextOut(510,118,m_Time);//秒表显示//画一个矩形框然后将其用颜色填充dcMem.SelectObject(m_RecBrush);dcMem.Rectangle(450,220,700,370);//输出秒表、计时dcMem.TextOut(545,200,"秒表");int minSec = watch%100;int Sec = (watch/100)%60;int Min = (watch/100)/60;m_Time.Format("%02d:%02d:%02d",Min,Sec,minSec);dcMem.TextOut(535,260,m_Time);//画俩个不同颜色的矩形框dcMem.SelectObject(m_RectBrush1);dcMem.Rectangle(&m_WatchStart);dcMem.SelectObject(m_RectBrush2);dcMem.Rectangle(&m_WatchStop);//在俩矩形框内写"启动"停止"dcMem.TextOut(m_WatchStart.left + 18,m_WatchStart.top + 5,"启动");dcMem.TextOut(m_WatchStop.left + 18,m_WatchStop.top + 5,"停止");pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCO PY); //将内存DC上的图象拷贝到前台//绘图完成后的清理dcMem.DeleteDC(); //删除DCbmp.DeleteObject(); //删除位图}///////////////////////////////////////////////////////// ////////////////////// CClockView printingBOOL CClockView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CClockView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CClockView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////// ////////////////////// CClockView diagnostics#ifdef _DEBUGvoid CClockView::AssertValid() const{CView::AssertValid();}void CClockView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CClockDoc* CClockView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClockDoc))) ;return (CClockDoc*)m_pDocument;}#endif //_DEBUG///////////////////////////////////////////////////////// ////////////////////// CClockView message handlers//菜单系统时间void CClockView::OnStart(){long now = time(NULL);tm local = *localtime(&now);year = local.tm_year+1900;month = local.tm_mon + 1;day = local.tm_mday;minute = local.tm_min;hour = local.tm_hour;second = local.tm_sec;wday = local.tm_wday;SetTimer(1,1000,NULL);}//菜单时间停止void CClockView::OnStop(){// TODO: Add your command handler code here KillTimer(1);}//菜单时间设置void CClockView::OnStetime(){CSetTimeDlg SetDlg;if(SetDlg.DoModal()==IDOK){ day = SetDlg.m_Day ;hour = SetDlg.m_Hour ;minute = SetDlg.m_Minute;month = SetDlg.m_Month;second = SetDlg.m_Second ;year = SetDlg.m_Year ;wday = SetDlg.m_Wday;}SetClock(hour,minute,second);Invalidate(TRUE);}void CClockView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default//时钟定时器消息处理if(nIDEvent == 1||nIDEvent == 3){second++;if(second > 59) {second = 0;minute++; }if(minute > 59) {minute = 0; hour++;}if(hour > 23) {hour = 0;day++;wday++;}if(wday > 6) {wday = 0;}switch(month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day > 31){day = 1;month++;}break;case 4:case 6:case 9:case 11:if(day > 30){day = 1;month++;}break;case 2:if(year%4 == 0&&day > 29){day = 1;month++;}if(year%4 != 0&&day > 28) {day = 1;month++;}break;}if(month > 12){ month = 1;year++;}SetClock(hour,minute,second); Invalidate(FALSE);}//秒表定时器消息处理if(nIDEvent== 2){watch++;Invalidate(FALSE);CView::OnTimer(nIDEvent);}}// 按钮时间定时器void CClockView::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultif(m_WatchStart.PtInRect(point)){watch = 0;SetTimer(2,10,NULL);SetTimer(3,1000,NULL);}if(m_WatchStop.PtInRect(point)){KillTimer(2);KillTimer(3);}CView::OnLButtonDown(nFlags, point); }。

相关文档
最新文档