📄 testtime.c
字号:
#include <unistd.h>
#include <sys/time.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <time.h>
//gpio81
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/file.h>
#include <fcntl.h>
#include <sys/wait.h>
#define GPIOBASE 0xc8004000 //物理基地址
#define REG_SIZE 32
#define DMZ_LED 0 //0管脚
//gpio81 end
#define IRIG_BASE_YEAR 2000
unsigned char sec[10]="8000000008";//秒的个位和十位8-xxxx-0-xxx-8格式
unsigned char min[10]="0000000008";//分钟的个位和十位xxxx-0-xxx-08格式
unsigned char hour[10]="0000000008";//小时的个位和十位xxxx-0-xx-008格式
unsigned char lyday[10]="0000000008";//0~365 or 366天的个位和十位 xxxx-0-xxxx-8格式
unsigned char hyday[10]="0000000008";//0~365 or 366天的百位 xx-0000000-8格式
unsigned char syear[10]="0000000008";//以2000位基准,现在的年时间,2位表示,xxxx-0-Xxxx-8格式
unsigned char contrl1[10]="0000000008";//0000000008-000000008格式
unsigned char contrl2[10]="0000000008";
unsigned char binary1[10]="0000000008";//0000000008-000000008格式
unsigned char binary2[10]="0000000008";
static int len;
struct tm *time_now;
int *gpoer, *gpoutr;//gpio 操作寄存器
char *sec2=sec;//sec2指针用来表示秒的真实值8-xxxx-0-xxx-8
char *lyday2=lyday;//lyday2指针用来指向天的十位的真实值置xxxx-0-Xxx-8格式X处
char *syear2=syear;//指针用来指向年的十位的真实值置xxxx-0-Xxxx-8格式X处
char *lhms[60]={"00000000","10000000","01000000","11000000","00100000","10100000","01100000","11100000","00010000","10010000",
"00000100","10000100","01000100","11000100","00100100","10100100","01100100","11100100","00010100","10010100",
"00000010","10000010","01000010","11000010","00100010","10100010","01100010","11100010","00010010","10010010",
"00000110","10000110","01000110","11000110","00100110","10100110","01100110","11100110","00010110","10010110",
"00000001","10000001","01000001","11000001","00100001","10100001","01100001","11100001","00010001","10010001",
"00000101","10000101","01000101","11000101","00100101","10100101","01100101","11100101","00010101","10010101"
};//0~59秒或分的BCD码xxxx-0-xxx//0~23点的BCD码xxxx-0-xx
int ms[10]={88740,222010,1000,1000,1000,1000,1000,1000,354600,1};//44370-1ms,88740-2ms,88740*4=354960-8ms,44370*5=221850-5ms
int ms2[10]={354500,222000,1000,1000,1000,1000,1000,1000,88700,2};
void delaytime10ms(char *pulse)
{
int i=0,k=0,delay=0;
k=0;
while(k<10)
{
*(unsigned long *)gpoutr|=(1<<DMZ_LED);//输出0管脚置高
//延时高电平时间
i=0;
delay=ms[pulse[k]-48];//0-48,1-49,8-56
while(i<delay){i++;}
*(unsigned long *)gpoutr&=~(1<<DMZ_LED);//输出0管脚置低
//延时低电平时间
i=0;
delay=ms2[pulse[k]-48];
while(i<delay){i++;}
k++;
}
}
int main()
{
len = 10;
short int dayg;//天个位
short int days;//天十位
short int dayb;//天百位
short int year;//年2位表示,如03年,08年,最大99年
short int years;//年2位表示的十位
short int yearg;//年2位表示的个位
sec2++;//sec2指针用来表示秒的真实值8-Xxxx-0-xxx-8
lyday2+=5;//lyday2指针用来指向天的十位的真实值置xxxx-0-Xxx-8格式X处
syear2+=5;//指针用来指向年的十位的真实值置xxxx-0-Xxxx-8格式X处
//用于查看时间误差
unsigned int nTimeTest = 0;
unsigned int nReduce = 0;
unsigned int nDelay=0;
struct timeval tv1,tv2;
time_t nowtime;
static time_t lasttime;
//gpio 物理地址转内存地址
int fd;
fd=open("/dev/mem",O_RDWR);
gpoutr=mmap((void *)0x0,REG_SIZE,PROT_READ+PROT_WRITE,MAP_SHARED,fd,GPIOBASE);
gpoer=gpoutr+1;
*(unsigned long *)gpoer&=~(1<<DMZ_LED);//gpio 设置0管脚输出
*(unsigned long *)gpoer|=(1<<1);//gpio 设置1管脚输入
*(unsigned long *)gpoer|=(1<<12);//gpio 设置12管脚输入
//gpio81end
time(&lasttime);
while ( 1 )
{
time(&nowtime); //获取当前时间
if (nowtime - lasttime >= 1) //和上一次的时间做比较,如果大于等于1秒,则修改时间
{
lasttime = nowtime;
printf(" now :%d ",nowtime);
time_now=localtime(&nowtime);
//printf("\nThe time is:%4d/%d/%d:%d:%d\n", time_now->tm_year+1900, time_now->tm_yday,time_now->tm_hour, time_now->tm_min, time_now->tm_sec);
printf("\ntime:%d:%d:%d\n", time_now->tm_hour, time_now->tm_min, time_now->tm_sec);
dayb=time_now->tm_yday*0.01;
days=(time_now->tm_yday-dayb*100)*0.1;
dayg=time_now->tm_yday-dayb*100-days*10;
year=time_now->tm_year+1900 - IRIG_BASE_YEAR;
years=year*0.1;
yearg=year-years*10;
//printf("tm_yday is:%d %d %d %d%d 年\n",dayb,days,dayg,years,yearg);
strncpy(sec2,lhms[time_now->tm_sec],8);//考取秒8-xxxx-0-xxx-8格式有效位7+一个中间0位=8
gettimeofday (&tv1,NULL);
delaytime10ms(&sec); //开始发送秒
strncpy(min,lhms[time_now->tm_min],8);//考取分钟xxxx-0-xxx-08格式有效位7+一个中间0位=8
delaytime10ms(&min);//开始发分钟
strncpy(hour,lhms[time_now->tm_hour],7);//考取小时xxxx-0-xx-008格式有效位6+一个中间0位=7
delaytime10ms(&hour); //开始发小时
strncpy(lyday,lhms[dayg],4);//考取0~365 or 366天的个位xxxx-0-xxxx-8格式有效位前4
strncpy(lyday2,lhms[days],4);//考取0~365 or 366天的十位xxxx-0-xxxx-8格式有效位中间4
delaytime10ms(&lyday); //开始发0~365 or 366天的个位十位
strncpy(hyday,lhms[dayb],2);//考取0~365 or 366天的百位xx-0000000-8格式有效位前2
delaytime10ms(&hyday); //开始发0~365 or 366天的百位
strncpy(syear,lhms[yearg],4);//考取年的个位的真实值置Xxxx-0-xxxx-8格式X处
strncpy(syear2,lhms[years],4);//考取年的十位的真实值置xxxx-0-Xxxx-8格式X处
delaytime10ms(&syear); //开始发年的个位十位
delaytime10ms(&contrl1); //开始发控制位第一段//0000000008格式
delaytime10ms(&contrl2); //开始发控制位第二段//0000000008格式
delaytime10ms(&binary1);//开始发二进制位第一段//0000000008格式
delaytime10ms(&binary2);//开始发发二进制位第二段//0000000008格式
gettimeofday (&tv2,NULL);
printf("1 tv_sec:%ld tv_usec:%ld ", tv1.tv_sec,tv1.tv_usec);
printf("2 tv_sec:%ld tv_usec:%ld\n", tv2.tv_sec,tv2.tv_usec);
nTimeTest =(tv2.tv_sec - tv1.tv_sec) * 1000000 +tv2.tv_usec - tv1.tv_usec;//任务完成总耗时
nDelay=1000000;//1秒时间
nReduce = nTimeTest - nDelay;//误差时间
printf("\t select %8u %8u %8d\n", nDelay, nTimeTest, nReduce);
time(&nowtime);
printf("end :%d \n",nowtime);
}
}
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -