📄 main.c
字号:
Status1=131;
j=j-250;
Staut0|=(1<<3);
}
send_data();
break;
case 131:
if((Staut0&0x08)!=0x08)
Status1=132;
break;
case 132:
if(j==0)
Status1=Status2;
else
{ if(j<=250)
{ get_send(j);
Status1=Status2;
j=0;
}
else
{ get_send(250);
Status1=131;
j=j-250;
Staut0|=(1<<3);
}
send_data();
}
break;
case 0xc2: //
break;
case 0xc3: //
break;
default: //无此命令
break;
}
}
}
}
SIGNAL(SIG_UART0_RECV) //串行口0接收数据中断
{ uchar i;
i=UCSR0A;
if( ( i &= 0X04 )==0)
{ Receive0[Receive0_lp]=UDR0;
Receive0_lp++;
if(Receive0_lp==2)
if((Receive0[0]!=0xaa)||(Receive0[1]!=0x75))
{ Receive0_lp=1;
Receive0[0]=Receive0[1];
}
if(Receive0_lp==5)
Receive0_num=Receive0[3]*256+Receive0[4];
if((Receive0_lp>=7)&&(Receive0_lp==Receive0_num+7))
{ Staut0|=(1<<0);
UCSR0B =0X00;
}
else
{ UCSR0B =0X90;
Staut0&=~(1<<0);
}
}
else
{Staut0&=~(1<<0);
UCSR0B =0X48;
Send0[0]=0x05;
Send0[1]=0x55;
Send0[2]=0x7a;
Send0[3]=0xfa;
Send0[4]=0x00;
Send0[5]=0xd5;
Send0_lp=2;
UDR0=Send0[1];
}
}
SIGNAL(SIG_INPUT_CAPTURE1) //捕捉输入1中断
{ uint i;
TCCR1B=0X80;
if(speed_cap==1)
{tmp=(UINT32)ICR1;
tmp+=speed_cn*65536;
tmp=tmp*tzxs;
i=(UINT16)(Total_t/(UINT64)tmp);
speed=(UINT8)(i/10);
// speed_dot=(UINT16)(Total_t*10/(UINT64)tmp);
speed_dot=(UINT8)(i%10);
}
TCNT1=0x0000;
TCCR1B=0X81;
speed_cap=1;
speed_cn=0;
TCCR1A=0;
TCCR1C=0;
TIMSK=0X24;
ETIMSK=0X00;
TIFR=0X00;
ETIFR=0X00;
}
SIGNAL(SIG_OVERFLOW1) //定时器1中断
{
if(speed_cn<175)
speed_cn++;
else
{speed=0;
speed_cap=0;}
}
SIGNAL(SIG_UART0_TRANS) //串行口0发送数据中断
{//uchar *p1;
//uint i;
// if(Status2==0)
if(Send0_lp<=Send0[0])
{ UDR0=Send0[Send0_lp];
Send0_lp++;
}
else
{ UCSR0B =0X90;
Receive0_lp=0;
Staut0&=~(1<<0);
Staut0&=~(1<<3);
}
}
SIGNAL (SIG_INTERRUPT6) //INT6中断SIGNAL
/*{ uchar i;
i=PIND&0XE0;
sei();
FM_CS;
CLOCK_RTIME();
DelayMs(30);
PORTD=PORTD&0X1F;
PORTD!=i;
}*/
{ uchar *p1,*p2,*p4;
// uint *p5;
uchar i,i1;
uint j;
i1=PORTD; // PIND&0XE0;
sei();
jsq1++;
jsq2++;
FM_CS;
if(jsq1==4)
{jsq1=0;
// p3=;
// p1=;
if(rt_index_buf1==0)
{ CLOCK_RTIME();
p4=&SYS_Time[0];
// j=;
p2=Now_Buf+rt_index_buf*24;//
for(i=0;i<6;i++)
{ *p2=*p4;
p2++;
p4++;}
}
p2= Now_Buf+6+rt_index_buf*24+rt_index_buf1*2;
// j=+j;
// pk=pk+j;
*p2=speed;
*(p2+1)=io_v;
rt_index_buf1++;
if(rt_index_buf1>=8)
rt_index_buf1=0;
}
if(jsq2==32)
{ jsq2=0;
// p1=rt_index_buf;
p2=Now_Buf+rt_index_buf*24+22;
*p2=acc_x;
*(p2+1)=acc_y;
rt_index_buf++;
if(rt_index_buf>=20)
rt_index_buf=0;
//p5=;
minmileage+=speed;
if(speed>3)
{Status_run|=0x01; //置目前运行状态=1
}
else
{Status_run&=0xfe; //清目前运行状态=0
}
if((Status_run&0x03)==0x01) //汽车刚起步
{if(startmon==0x01)
{if(((Status_run&0x04)==0x04)||(judgestoptime() == 0x01)) //驾驶员改变或停车时间超过20分钟
{if (judgedrvtime() == 0x01) //若行车超过3小时
{
storecondrvdata();
}
startmon=0x01;
Status_run&=0xfb;
p1=Begin_time;
p2=&SYS_Time[0];
for (i=0; i<5; i++)
{
*p1=*p2;
p1++;
p2++;
}
}
}
else
{startmon=0x01;
p1=Begin_time;
p2=&SYS_Time[0];
for (i=0; i<5; i++)
{
*p1=*p2;
p1++;
p2++;
}
}
}
else if((Status_run&0x03)==0x02) //汽车刚停车
{ storestopdata();
p1=Stop_time;
p2=&SYS_Time[0];
for (i=0; i<5; i++)
{
*p1=*p2;
p1++;
p2++;
}
}
if((Status_run&0x01)==0x01)
Status_run|=0x02;
else
Status_run&=0xfd;
if(SYS_Time[5]==0x59)
{ minspeed = minmileage / 60;
minmileage = minmileage / 360;
p1 = D360_Buf1 + d360_index_buf1 * 25;
p2=Driver_now__Buf + 1;
for(i=0;i<3;i++)
{*p1 = *p2;
p1++;
p2++;
}
p2=&SYS_Time[0];
for (i=0; i<5; i++)
{
*p1=*p2;
p1++;
p2++;
}
*p1=minspeed;
*(p1+1)=minmileage;
*(p1+2)=io_v;
*(p1+3)=acc_x;
*(p1+4)=acc_y;
p2=&GPS_I[0];
p1=p1+5;
for (i=0; i<8; i++)
{
*p1=*p2;
p1++;
p2++;
}
d360_index_buf1++;
if(d360_index_buf1>=20)
{d360_index_buf1=0;
d360_save_flag1= NEEDSAVE;
minproc();
minmileage = 0;
}
//每分钟数据处理,里程时速刷新
// if (fmileageacc == TRUE)
// {
// denmileage += minmileage; //计算累加里程,单位0.1km
// }
minmileage = 0;
}
}
// PORTD=PORTD&0X1F;
PORTD=i1;
}
void Usb_Read()
{
uchar i,j;
uchar *DP;
uint TotalCount;
DP = Driver_now__Buf;
Usb_InitZX();
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
mStopIfError( i );
while (1){
//------------------------------------------------
// if ( CH375DiskStatus != DISK_CONNECT )
// {
// Disp_pwm();
// LCD_INT();
// CLEAR();
// DelayMs(2000);
// Dis_Pin = 52;
// Xs();
// }
// Usb_InitZX();
// i = CH375LibInit( );
while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
mDelaymS(5);//100 );
}
mDelaymS(10); //200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
// for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */
// mDelaymS(5); //100 );
// printf( "Ready ?\n" );
// if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
// }
strcpy( (char *)mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C" ); /* 文件名,该文件在C51子目录下 */
i = CH375FileOpen( ); /* 打开文件 */
if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到文件 */
/* 列出文件 */
if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*"; /* C51子目录不存在则列出根目录下的文件 */
else pCodeStr = (UINT8 *)"/C51/CH375*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */
// printf( "List file %s\n", pCodeStr );
for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254个文件 */
strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */
i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */
mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */
i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
// printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */
continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */
}
else { /* 出错 */
mStopIfError( i );
break;
}
}
}
else
{ /* 找到文件或者出错 */
mStopIfError( i );
TotalCount = 100; /* 准备读取总长度 */
while ( TotalCount )
{ /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */
if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */
else c = TotalCount; /* 最后剩余的字节数 */
mCmdParam.ByteRead.mByteCount = c; /* 请求读出几十字节数据 */
i = CH375ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
mStopIfError( i );
TotalCount -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */
for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ )
{
//FIRST[i] = mCmdParam.ByteRead.mByteBuffer[i];
FM_CS;
*(DP+i) = mCmdParam.ByteRead.mByteBuffer[i];
}
if ( mCmdParam.ByteRead.mByteCount < c ) { /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
// printf( "\n" );
// printf( "文件已经结束\n" );
break;
}
}
i = CH375FileClose( ); /* 关闭文件 */
mStopIfError( i );
j = i;
}
if(j == 0)break;
}
}
//---------------------------------------------
void Usb_Write()
{
uchar i,j,c,flg;
uint a,b,sum = 2;//1080 ;
Usb_InitZX();
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
//------------------------------------------------
// while ( CH375DiskStatus != DISK_CONNECT )
// {
// Dis_Pin = 52;
// Xs();
// }
while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
mDelaymS(5);//100 );
}
mDelaymS(10); //200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */
mDelaymS(5); //100 );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
}
//--------------------------------------------------------------------
strcpy( (char *)mCmdParam.Create.mPathName, "\\SUZHOU.TXT" ); /* 新文件名,在根目录下,中文文件名 */
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
mStopIfError( i );
pCodeStr = com1subbuf;//(UINT8 *)"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa";
while( 1 ) { /* 分多次写入文件数据 */
for(a = 0;a<sum;a++)
{
pCodeStr = com1subbuf;
FM_CS;
LoadPage(a,pCodeStr,500);
for(b = 0;b<10;b++)
{
for ( i=0; i<50; i++ )
{
c = *pCodeStr;
mCmdParam.ByteWrite.mByteBuffer[i] = c;
pCodeStr++;
}
Usb_InitZX();
mCmdParam.ByteWrite.mByteCount = 50;//i; /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */
flg = CH375ByteWrite( ); /* 向文件写入数据 */
mStopIfError( flg );
}
}
break;
}
mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
i = CH375FileClose( );
mStopIfError( i );
// while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */
while ( CH375DiskStatus >= DISK_CONNECT )
{ /* 查询CH375中断并更新中断状态,等待U盘拔出 */
Dis_Pin = 53;
Xs();
if ( CH375DiskConnect( ) != ERR_SUCCESS ) break;
mDelaymS( 100 );
}
mDelaymS( 200 );
/* i = FILE_DATA_BUF[0]; 因为是以字节为单位读写文件,未用到文件数据缓冲区,为了防止编译器优化掉该缓冲区而用一下缓冲区 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -