⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testtime.c

📁 通过GPIO高低电频获取响应的时间例子
💻 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 + -