Tc2.0时钟程序
- 格式:doc
- 大小:26.50 KB
- 文档页数:4
C语言中如何获取时间?精度如何?1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精确到毫秒5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒6 要获取高精度时间,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值然后用两次计数器的差除以Frequency就得到时间。
7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime//*********************************************************************//用标准C实现获取当前系统时间的函数一.time()函数time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。
#include "time.h"void main (){time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( "\007The current date/time is: %s", asctime (timeinfo) );exit(0);}=================#include -- 必须的时间函数头文件time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)struct tm -- 时间结构,time.h 定义如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); -- 获取时间,以秒计,从1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); -- 转为当地时间,tm 时间结构asctime ()-- 转为标准ASCII时间格式:星期月日时:分:秒年-----------------------------------------------------------------------------二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
完美的模拟时钟程序-/*开发环境:turbo c 2.0模拟时钟转动程序代码*/#include"graphics.h"#include"math.h"#include"dos.h"#define pi 3.1415926#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(2);circle(300,240,200);circle(300,240,205);circle(300,240,5);for(i=0;i<60;i++) /*划钟点上的短线*/ {if(i%5==0)l=15;elsel=5;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;line(x1,y1,x2,y2);}}main(){int x,y,i,k=1;int gdriver=9,gmode=2;unsigned char h,m,s;int o,p,q;float n;struct time t[1];struct date d[1];initgraph(&gdriver,&gmode,"c:\\tc");initgraph(&gdriver,&gmode,"c:\\tc");for(i=0;i<=6;i++){settextstyle(TRIPLEX_FONT,HORIZ_DIR,i); /*控制输出字符的字体,方向,大小*/cleardevice();settextjustify(1,1); /*在指定坐标上输出字符串*/outtextxy(300,80,"12") ;outtextxy(300,400,"6");outtextxy(140,240,"9");outtextxy(460,240,"3");outtextxy(380,100,"1");outtextxy(220,100,"11");outtextxy(435,160,"2");outtextxy(440,320,"4");outtextxy(380,370,"5");outtextxy(220,370,"7");outtextxy(160,160,"10");outtextxy(160,320,"8");}init();setwritemode(1); /*设置画线的输出模式*/if(k!=0){getdate(d); /*获得系统日期函数*/o=d[0].da_year;p=d[0].da_mon;q=d[0].da_day;gettime(t); /*获得系统时间函数*/h=t[0].ti_hour;m=t[0].ti_min;s=t[0].ti_sec;}setcolor(7); /*设置时针颜色*/n=(float)h+(float)m/60;d(150,n,30); /*画出时针*/setcolor(14); /*设置分针颜色*/d(170,m,6); /*画出分针*/setcolor(4); /*设置秒针颜色*/d(190,s,6); /*画出秒针*/while(!kbhit()) /*控制程序按下任意键退出*/{while(t[0].ti_sec==s)gettime(t);gotoxy(44,18); /*使光标移动到指定坐标*/printf("\b\b\b\b\b\b\b\b\b"); /*退格,使表示时间的字符串不断变化*/sound(400); /*按给定的频率打开PC扬声器*/delay(70); /*中断程序的执行,时间为70毫秒*/ sound(200);delay(30);nosound(); /*按给定的频率关闭PC扬声器*/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();}if(s<10) /*用字符的形式输出时间*/ { if(m<10)printf("%u:0%u:0%u",h,m,s);elseprintf("%u:%u:0%u",h,m,s);}else{ if(m<10)printf("%u:0%u:%u",h,m,s);elseprintf("%u:%u:%u",h,m,s);}gotoxy(34,19); /*在指定坐标上输出日期*/printf("%02d?02d-%02d\n\n\n\n\n\n\n\n\n\n Made by zhong chuanqi",o,p,q);printf("\b\b\b\b\b\b\b\b\b");}getch();closegraph();}。
对于初学程序设计的人来说Turbo C 2.0无疑是最简单最理想的入门语言环境之一,但也常由于环境变量设置的不正确导致程序无法编译运行,严重打击了初学者来之不易的自信心。
为了迅速解决此类问题,使大家能把精力集中到程序设计上来,我们特地编写本文以帮助有心涉足编程领域的初学者。
1.准备TC2.0这里下载TC 2.0:TurboC.2.0.zip (968.23 KB, 下载次数: 6165)下载之后的工作就是解压缩了,解压缩可以使用WinZip或WinRar。
在此我们假设将TC解压到"x:\TC20"目录(x表示盘符),当然您也可以将它解压到任意目录,例如"D:\Programing\C\TC20",此时请使用"D:\Programing\C\TC20"替换以下设置过程中出现的"x:\TC20"。
2.建立Output目录Output目录用来存放使用TC编写的执行文件和编译过程中使用的临时文件,虽然该目录不一定要有,但为了使您今后可能编写的大量应用程序便于管理,我们强烈建议您建立此目录。
下面将分别介绍DOS模式和Windows窗口模式下的操作方法。
2.1、DOS模式下的操作方法:首先进入TC所在目录,示例如下:C:\>x:x:\>cd TC20然后创建目录:x:\TC20\>md Output2.2、Windows下的操作方法:使用资源管理器或我的电脑打开TC所在目录,右键点击空白空间,在弹出的右键菜单中选择"新建(W)->文件夹(F)"(该操作表示先选择"新建(W)",再在弹出的子菜单中选择"文件夹(F)"),再将文件夹名称改为Output。
当然您可以用任何名称的目录作为Output目录,但请切记要在后面的几步中作相应的变动才能使设置生效。
使用T2定时器实现1秒精确定时使用T2定时器实现1秒精确定时2009-10-02 16:22[小雨的成长]中断精确定时1S 作者小雨日期2009-4-17 8:12:00这一课,我们将告诉大家如何精确定时1S。
要精确定时,就需要用到中断方式,并工作在自动重装载方式。
这里我们用到了T2定时器,它具有16位的自动重装载功能。
我们知道,T0,T1的自动重装载功能都是8位的,用它们将会带来很大的误差。
T2定时器,它有一个专门的自动重装载寄存器,当计数满了以后,它将我们预置进去的数自动的载入TH2,TL2这样就都很好的保证精确定时。
我们用的是12MHZ的晶振。
就算是计满也只有几十毫秒。
要定时一秒,就需要一个变量来保存溢出的次数,积累到了多少次之后,才执行一次操作。
这样就可以累加到1秒或者更长的时间才做一次操作了。
T2寄存器还有一个和其他寄存器不一样的地方,就是它的中断标志位TF2要软件清零。
现在我们来计算一下,要精确定时,那么,进去中断的次数是越少越好,这样,数据更精确,还能很好的防止对主函数的影响。
T2定时器预装载值的计算:设晶振为12MHz,每秒钟可以执行1000000(12000000/12)个机器周期。
而T2每次溢出时最多经过了65536个机器周期。
我们应该尽量让T2定时器的溢出中断的次数最少。
选择每秒中断14次,每次溢出1000000/14=71428.57个机器周期,不为整数且超出65536。
选择每秒中断16次,每次溢出1000000/16=62500个机器周期,小于65536,有效。
选择每秒中断20次,每次溢出1000000/20=50000个机器周期,小于65536,有效。
其他的就不再算了,我们通过上面的计算,我们可以发现,我们可以选择的方式有很多,但是最佳的是每秒中断16次,每次溢出62500个机器周期。
下面看程序:#i nclude <reg52.h>#define uchar unsigned char#define uint unsigned intsbit Led=P0^0; //定义LED位void Timer2() interrupt 5 //调用定时器2,自动重装载模式{static uchar i=0; //定义静态变量iTF2=0; //定时器2的中断标志要软件清0i++; //计数标志自加1if(i==16) //判断是否到1s{i=0; //将静态变量清0Led=~Led; //LED位求反}}void main(){RCAP2H=(65536-62500)/256; //重装载计数器赋初值RCAP2L=(65536-62500)%256;ET2=1; //开定时器2中断EA=1; //开总中断TR2=1; //开启定时器,并设置为自动重装载模式while(1);}这里我们看到我们在中断中用到了static uchar i=0;定义i为静态函数。
综合研究一这是我第一次综合研究,我觉得还是对tc2.0 集成环境的再次探索和了解,在王爽老师的教材上给我们提示了要用的程序和文件:1.编译器tcc.exe2.连接器tlink.exe3.相关文件:c0s.obj cs.lib emu.lib maths.lib我将这些文件都放在c:\c 文件夹中,然后写了个简单的c程序也是教材上有的Main(){Printf(“hello word!\n”);}然后按照书上的步骤在命令行command里面键入c:\c>tcc a.c这时候在c文件夹里面立马出现了a.exe文件。
而且经过验证程序运行时没有错的,程序也如实输出了我们的结果,可是编译连接的过程是怎么完成的呢,这些文件又是干什么的呢?我们无从知晓,那么怎么办呢?我是这么干的,我百度百了下tlink的用法然后查到了tc2.0 软件集成的程序有如下:INSTALL.EXE 安装程序文件TC.EXE 集成编译TCINST.EXE 集成开发环境的配置设置程序TCHELP.TCH 帮助文件 读取TCHELP.TCH的驻留程序README 关于Turbo C的信息文件TCCONFIG.EXE 配置文件转换程序MAKE.EXE 项目管理工具TCC.EXE 命令行编译TLINK.EXE Turbo C系列连接器TLIB.EXE Turbo C系列库管理工具C0?.OBJ 不同模式启动代码C?.LIB 不同模式运行库GRAPHICS.LIB 图形库EMU.LIB 8087仿真库FP87.LIB 8087库*.H Turbo C头文件*.BGI 不同显示器图形驱动程序*.C Turbo C例行程序(源文件)其中: 上面的?分别为:T Tiny(微型模式)S Small(小模式)C Compact(紧凑模式)M Medium(中型模式)L Large(大模式)H Huge(巨大模式Turbo C 2.0编译连接程序TCC.EXE的用法简介Tcc 全部语法如下,图(1)⒈首先要确保名为turboc.CFG的文件与TCC.EXE 位于同一目录下如同在C:\TC目录下。
C语言中如何获取时间?精度如何?1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精确到毫秒5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒6 要获取高精度时间,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值然后用两次计数器的差除以Frequency就得到时间。
7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime//*********************************************************************//用标准C实现获取当前系统时间的函数一.time()函数time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。
#include "time.h"void main (){time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( "\007The current date/time is: %s", asctime (timeinfo) );exit(0);}=================#include -- 必须的时间函数头文件time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)struct tm -- 时间结构,time.h 定义如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); -- 获取时间,以秒计,从1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); -- 转为当地时间,tm 时间结构asctime ()-- 转为标准ASCII时间格式:星期月日时:分:秒年-----------------------------------------------------------------------------二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
TC模式分两种,E2E-TC和P2P-TC1)E2E-TC可以转发所有PTP报文,但是只针对SYNC、Delay_Req做补偿,补偿只包括报文在设备内的驻留时间。
2)P2P-TC 只对SYNC做补偿,但是在E2E-TC基础上补偿增加了线路时延,而线路时延通过Pdelay报文计算;在设计中,E2E-TC的线路补偿可以由CPU支持补偿,因此FPGA只需要完成驻留时间补偿方案。
在入方向减去入时间戳,在出方向加上出时间戳。
停留时间将累加到消息报文中的“修正”(correction field)字段中。
数值=纳秒*2^16。
例如:2.5ns = 0x 0000 0000 0002 8000详细设计:1、FPGA应提供一个寄存器作为TC模式设置(需要区分TC模式与普通模式,可暂不区分E2E-TC与P2P-TC,TC与普通模式区别主要在于报文发送处理,在接收上处理一致)2、E2E-TC模式下,对以下报文分别进行如下处理:1)SYNC报文:接收报文时,将时间戳T1打到MAC地址处,SYNC报文上CPU后直接转发出来,发送时FPGA从该报文MAC地址处获取T1,同时获取发送时间T2,将T2-T1的差值累加到报文的correctionField,再将MAC地址恢复正常。
2)Delay_Req报文:与SYNC报文处理方案一样,因此要将现有的Delay_Req方案修改到与SYNC一致,即要将收的时间戳打到MAC地址处。
发送处理也一样。
3)其他报文对时间戳无要求,直接交CPU,由CPU进行转发处理。
3、P2P-TC模式下,对SYNC和Delay_Req处理与E2E-TC模式一模一样,只是需要补偿线路时延,由于线路时延是先计算好的,因此可以由CPU转发报文前,由CPU补偿到correction field,FPGA不需要另外补偿,这种模式下需要Pdelay_Req/PDelay_Resp交互,因此FPGA要支持第4点。
4、PDelay_Req发送:将发送时间保存到FPGA寄存器,软件获取发送时间T1,PDealy_Req接收:将接收时间戳T2打到MAC地址处,上CPU;PDelay_Resp 发送:一步法时从报文MAC地址处获取T2,获取发送时间T3,将T3-T2时间差补偿到correctionField;两步法时Fpga不用对报文处理,CPU获取发送时间T3,由CPU 计算T3-T2,将时间差通过PDelay_Resp_Followup发送出去;PDelay_Resp接收:将接收时间打到MAC地址处5、支持TC方案,需要将原来Delay_Req接收时间戳从FPGA寄存器读的方案改到将时间戳打到MAC地址处;这样TC模式和普通模式下FPGA对Delay_Req处理是一致的,免区分多种处理方式。
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include<math.h>
#include<time.h>
#define pi 3.1415926
#define r 200
int main()
{
int h,m,s,s0,year,mon,mday,time1[80],time0[80],time_t1[60],time_t0[60]; time_t t1;
struct tm *t2;
int gdriver=DETECT, gmode;
int i,n;
initgraph(&gdriver, &gmode, ".");
setbkcolor(0);
setcolor(2);
setfillstyle(1,2);
pieslice(319, 239, 0, 360,200);
floodfill(319,239,2);
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(400, 70, "1");
setcolor(15);
settextstyle(1,0, 5);
outtextxy(455, 130, "2");
setcolor(0);
settextstyle(1, 0, 7);
outtextxy(473,205,"3");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(455,300,"4");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(400,360,"5");
setcolor(4);
settextstyle(1, 0, 7);
outtextxy(305, 360, "6");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(220, 360, "7");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(160, 300, "8");
setcolor(0);
settextstyle(1, 0, 7);
outtextxy(136,205,"9");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(160,130,"10");
setcolor(15);
settextstyle(1, 0, 5);
outtextxy(220,70,"11");
setcolor(4);
settextstyle(1, 0, 7);
outtextxy(289, 40, "12");
setcolor(6);
settextstyle(1, 0, 6);
outtextxy(280,310,"JGY");
time(&t1);
t2=localtime(&t1);
h=t2->tm_hour;
m=t2->tm_min;
s=t2->tm_sec;
year=t2->tm_year+1900;
mon=t2->tm_mon+1;
mday=t2->tm_mday;
while(!kbhit())
{
time(&t1);
t2=localtime(&t1);
h=t2->tm_hour;
m=t2->tm_min;
s=t2->tm_sec;
year=t2->tm_year+1900;
mon=t2->tm_mon+1;
mday=t2->tm_mday;
if(s0!=s)
{
setcolor(2);
settextstyle(2,0,6);
outtextxy(285,110,time_t0);
sprintf(time_t1,"%02d:%02d:%02d\n",h,m,s); setcolor(15);
outtextxy(285,110,time_t1);
strcpy(time_t0,time_t1);
setcolor(2);
outtextxy(274,125,time0);
sprintf(time1,"%04d/%02d/%02d\n",year,mon,mday);
setcolor(15);
outtextxy(274,125,time0);
strcpy(time0,time1);
setcolor(4);
setlinestyle(0, 0, 3);
circle(319, 239, 1);
setcolor(15);
setlinestyle(1, 1, 1);
circle(319, 239, r);
setcolor(3);
setlinestyle(1, 1, 3);
circle(319, 239,210);
for(i=0;i<12;i++)
{
setcolor(15);
setlinestyle(0, 0, 1);
line(319+r*0.95*cos(i*pi/6),239+r*0.95*sin(i*pi/6),319+r*cos(i*pi/6),239+ r*sin(i*pi/6));
}
for(n=0;n<60;n++)
{
setcolor(15);
line(319+r*0.985*cos(n*pi/30),239+r*0.985*sin(n*pi/30),319+r*cos(n*pi/3 0),239+r*sin(n*pi/30));
}
setcolor(4);
setlinestyle(1, 0, 1);
line(319, 239, 319+160*cos(s*pi/30-pi/2),239+160*sin(s*pi/30-pi/2)); setcolor(2);
setlinestyle(1, 0, 1);
line(319, 239,
319+160*cos((s-1)*pi/30-pi/2),239+160*sin((s-1)*pi/30-pi/2));
m=s/60+m;
setcolor(9);
setlinestyle(0,0,3);
line(319, 239, 319+110*cos(m*pi/30-pi/2),239+110*sin(m*pi/30-pi/2)); setlinestyle(0,0,3);
setcolor(2);
line(319, 239,
319+110*cos((m-1)*pi/30-pi/2),239+110*sin((m-1)*pi/30-pi/2));
h=m/60+h;
setcolor(0);
setlinestyle(0,0,3);
line(319, 239,
319+70*cos((h+m/60.0)*pi/6-pi/2),239+70*sin((h+m/60.0)*pi/6-pi/2)); setcolor(2);
setlinestyle(0,0,3);
line(319, 239,
319+70*cos(h+m/60.0-1/60.0*pi/6-pi/2),239+70*sin(h+m/60.0-1/60.0*pi/ 6-pi/2));
s0=s;
sound(4000);
delay(70);
sound(500);
delay(30);
nosound();
}
}
getch();
closegraph();
return 0;
}。