c++模拟时钟实验报告
- 格式:docx
- 大小:143.91 KB
- 文档页数:38
单片机实验报告——数字钟设计班级:学号:姓名:时间:一.实验目的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语言程序设计》课程设计报告题目:模拟时钟转动程序班级:组别:组员:指导教师:目录第一章课程设计的题目 (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语言程序设计》课程设计报告题目:模拟时钟转动程序班级:组别:组员:指导教师:目录第一章课程设计的题目 (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语言课程设计的结果分析运行结果分析问题一:程序清单中某个符号添加错误,导致编译时出现错误,执行不出结果。
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目的意义在如今,单片机的使用领域已十分广泛,它在智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等均有很广泛的应用。
目录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做,我更不会。
不过参考了很多资料,到网上查,泡了几天图书馆,差不多能写出基本程序,虽然很多是借鉴别人的,不过能写成这样,我心里还是挺高兴的。
目录摘要: (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语言编写程序来实现实时时钟系统的功能。
同时,我们也发现了实时时钟系统的一些问题,并加以解决。
我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。
然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。
需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。
总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。
课程设计报告课程名称结构化程序设计课程设计院部名称专业班级学生姓名王蕾学号课程设计地点课程设计学时指导教师金陵科技学院教务处制目录第一章课程设计的目的和要求.............................................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语言课程设计的目的加深对讲授内容的理解,尤其是一些语法规定。
集中上机实习报告指导教师:王利姓名:赵蕊学号: 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); }。