📄 htd30v02.c
字号:
uchar code print19[]={0XCA,0XB1,0XBC,0XE4,0X20,0X20,0X20,0X20,0X20,0X20,0XCB,0XD9,0XB6,0XC8,0X20,0X20,0XD6,0XC6,0XB6,0XAF}; //时间 速度 制动
uchar code print20[]={0XCA,0XB1,0X3A,0XB7,0XD6,0X3A,0XC3,0XEB,0X20,0X20,0X20,0X6B,0X6D,0X2F,0X68}; //时:分:秒 km/h
uchar code print21[]={0XCA,0XC7}; //是
uchar code print22[]={0XB7,0XF1}; //否
uchar code print23[]={0XCD,0XA3,0XB3,0XB5,0XC7,0XB0,0X31,0X35,0XB7,0XD6,0XD6,0XD3,0XC4,0XDA,0XD4,0XDA,0XB1,0XBE,0XB3,0XB5}; //停车前15分钟内在本车
uchar code print24[]={0XB7,0XC7,0XB7,0XA8,0XBC,0XDD,0XCA,0XBB,0XD4,0XB1}; //非法驾驶员
uchar code print25[]={0XB5,0XB1,0XC7,0XB0,0XB1,0XBE,0XB3,0XB5,0XC0,0XDB,0XBC,0XC6,0XD0,0XD0,0XCA,0XBB,0XC0,0XEF,0XB3,0XCC}; //当前本车累计行驶里程
uchar code print26[]={0XB9,0XAB,0XC0,0XEF}; //公里
uchar code print27[]={0XB5,0XB1,0XC7,0XB0,0XB1,0XBE,0XC8,0XCB,0XC0,0XDB,0XBC,0XC6,0XD0,0XD0,0XCA,0XBB,0XC0,0XEF,0XB3,0XCC}; //当前本人累计行驶里程
uchar code print28[]={0XB1,0XBE,0XC8,0XCB,0XBC,0XDD,0XCA,0XBB,0XD6,0XA4,0XD3,0XD0,0XD0,0XA7,0XC6,0XDA,0XB5,0XBD,0X3A,0x20}; //本人驾驶证有效期到:
uchar code print29[]={0XB4,0XF2,0XD3,0XA1,0XBD,0XE1,0XCA,0XF8,0X21,0x20}; //打印结束!
uchar code print30[]={0XCE,0XB4,0XB5,0XC7,0XC2,0XBC}; //未登录
uchar code print31[]={0XB5,0XC4}; //的
uchar code print32[]={0xCE,0xDE,0xB1,0xBE,0xC8,0xCB,0xC6,0xA3,0xC0,0xCD,0xBC,0xDD,0xCA,0xBB,0xBC,0xC7,0xC2,0xBC,0xA3,0xA1}; //无本人疲劳驾驶记录!
uchar code print33[]={0xB7,0xC7,0xB7,0xA8,0xBC,0xDD,0xCA,0xBB,0xD4,0xB1,0xB5,0xC4,0xC6,0xA3,0xC0,0xCD,0xBC,0xDD,0xCA,0xBB}; // 非法驾驶员的疲劳驾驶
uchar code print34[]={0xB1,0xBE,0xB3,0xB5,0xD7,0xEE,0xBA,0xF3,0xD2,0xBB,0xB4,0xCE,0xCD,0xA3,0xB3,0xB5,0xC7,0xB0,0xCA,0xC7}; // 本车最后一次停车前是
uchar code print35[]={0xD3,0xC9}; //由
uchar code print36[]={0xBC,0xDD,0xCA,0xBB,0xB5,0xC4,0xA1,0xA3}; //驾驶的。
uchar code print37[]={0xC9,0xCF,0xBC,0xDD,0xCA,0xBB,0xB5,0xC4,0xBC,0xDD,0xCA,0xBB,0xD4,0xB1,0xC1,0xD0,0xB1,0xED,0x2A,0x20}; // 上驾驶的驾驶员列表:
//uchar code ini_data1[40]={};
uchar code creat_file1[32]={0x5A,0x59,0x46,0x5F,0x44,0x45,0x46,0x31,
0x44,0x41,0x54,
0x20,0x00,0x00,0xf0,0x50,0x92,0x32,0x92,0x32,0x00,0x00,0xf0,0x50,0x92,0x32,
0x00,0x00,0x00,0x00,0x02,0x00
}; //插入文件表项1;ZYF_DEF1.DAT;
uchar code print38[]={0XCE,0XB4,0XB5,0XC7,0XC2,0XBC,0xBC,0xDD,0xCA,0xBB,0xD4,0xB1,0xB5,0xC4,0xC6,0xA3,0xC0,0xCD,0xBC,0xDD,0xCA,0xBB};
// 0x5A 0x59 0x46 0x5F 0x44 0x45 0x46 0x32
// 0x44 0x41 0x54
// 0x20 0x18 0x67 0x7C 0x78 0x96 0x32 0x96 0x32 0x00 0x00 0x7D 0x78 0x96 0x32
// 0x00 0x00 0x00 0x00 0x00 0x00
uint code card_copy[9][3]={
{RECORD_NUM,_MIRROR_REC1,90},
{NOW_DATE,_DOWN_CARD_TIME,6},
{VEHI_PARA,_MIRROR_REC2,32},
{POWER_ON_TIME,_POWER_ON_TIME,128},
{LOG_ON_TIME,_LOG_ON_TIME,128},
{PARKING_VCC,_PARKING_VCC,2110},
{PERIOD_START_TIME,_PERIOD_START_TIME,128},
{OVERSP_START_TIME,_OVERSP_START_TIME,128},
{OVER_CONTROL_ID,_OVER_CONTROL_ID,128}
};
//p89c51rd2 new define
sfr AUXR1=0XA2;
sfr IPH=0xB7;
sfr CCOM=0xd8;
sfr CMOD=0xd9;
sfr AUXR=0x8e;
//sbit PPCH=IPH^6; //PPCH PCA中断优先级控制位高
//sbit PT2H=IPH^5; //PT2H 定时器2 中断优先级控制位高
//sbit PSH=IPH^4; //PSH 串行口中断优先级控制位高
//sbit PT1H=IPH^3; //PT1H 定时器1 中断优先级控制位高
//sbit PX1H=IPH^2; //PX1H 外部中断1 中断优先级控制位高
//sbit PT0H=IPH^1; //PT0H 定时器0 中断优先级控制位高
//sbit PX0H=IPH^0; //PX0H 外部中断0 中断优先级控制位高
sbit EC=IE^6; //PCA interrupt enable bit
sbit PPC=IP^6; //PCA interrupt priority bit
//sbit DPS=AUXR1^0;
extern uchar code decode[8];
extern bit slave_ready;
extern bit enum_done;
bit host_ready;
#define set_extram AUXR|=0x02
#define clr_dptr AUXR1&=0xfe
#define set_dptr1 AUXR1|=0x01 //切换双DPTR用的,采用SRC程序修改用以提高程序执行效率用的
#define clr_drtr1 AUXR1&=0xfe //切换双DPTR用的,采用SRC程序修改用以提高程序执行效率用的
#define PGM_MTP 0xFFF0; //IAP编程用的入口向量
//本程序使用的函数原型说明
void set_9600(void);
extern void write_page(void);
extern void read_page(void);
extern void host_initial(void);
extern void slave_initial(void);
extern bit usb_toggle(void);
void log_off(void);
void log_on(void);
void cal_second(char *source_arr,char *target_arr);
void nop5(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void speed(void) interrupt 0 using 1
{
// uchar temp;
//速度信号产生的中断,计算速度用
// temp=AUXR;
// clr_extram;
ext_ram=1;
pulse_period++;
speed_pulse++;
interval_pulse++;
minute_pulse++;
day_pulse++;
// AUXR=temp;
// EX0=0;
}
//*****************************************************************
void timer0(void) interrupt 1 using 2
//定时器0
{
TH0=0xdc; //25ms
TL0=0x14;
// temp=AUXR;
// clr_extram;
ext_ram=1;
// IT0=0;
time5ms++;
usb_link_time++;
if(time5ms%200==0)
{
if(old_second_pulse!=speed_pulse)
{
now_speed=((ulong)speed_pulse*7200+1)/km_pulse.km_word/2;
old_second_pulse=speed_pulse;
speed_flash=1;
}
time5ms=0;
// speed_down=1;
second_inc=1;
last_8second<<=1;
if(speed_pulse)
last_8second++;
speed_pulse=0;
}
if(time5ms%20==0)
{
time_100ms=1;
if(time5ms%40==0)
{
//200ms is reach will deal speed_status and others
// time_200ms=1;
// speed_status[(uint)(sp_st_ptr_fm+sp_st_ptr_ram)*3%180]=pulse_period; //得到的脉冲数
sp_st_ram.speed_status[sp_st_ram.now_ptr].speed_per=pulse_period;
//检查加速度或者减速度是否有超标现象
// if((pulse_period>old_pulse_period)&&(pulse_period-old_pulse_period)>parameter.para_arr.pos_acc_lmt)
// over_pos_acc=1;
// else if((pulse_period<old_pulse_period)&&(old_pulse_period-pulse_period)>parameter.para_arr.neg_acc_lmt)
// over_neg_acc=1;
old_pulse_period=pulse_period;
pulse_period=0;
//read_in_low();
SEL_OTHERS=0;
SEL_IN_HIGH=1;
SEL_IN_LOW=0;
P0=0xff;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
in_buffer1=P0;
SEL_IN_LOW=1;
SEL_OTHERS=1;
//in_buffer1^=parameter.para_arr.nullity_07;
in_buffer1=~in_buffer1;
// in_buffer1=now_time[3];
// speed_status[((uint)(sp_st_ptr_fm+sp_st_ptr_ram)*3+1)%180]=in_buffer1;
sp_st_ram.speed_status[sp_st_ram.now_ptr].status1_per=in_buffer1;
// interval_status1|=speed_status[((sp_st_ptr_fm+sp_st_ptr_ram)*3+1)%180]; //区间状态取决于每0.2秒的状态是否有效,是或的关系
interval_status1|=in_buffer1;
//read_in_high();
SEL_OTHERS=0;
SEL_IN_LOW=1;
SEL_IN_HIGH=0;
P0=0xff;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
in_buffer2=P0;
SEL_IN_HIGH=1;
SEL_OTHERS=1;
in_buffer2=~in_buffer2; //caine add
//in_buffer2=now_time[4];
if(parameter.para_arr.keel_detect_sw==0xaa) //要判断倾覆判断是否打开
{
last_keel<<=1;
//if(keelover)
if(in_buffer2&0x40)
last_keel++;
if((last_keel&0x1f)==0x1f) //当前收到的最后1秒的5个倾覆状态都表明倾覆已经确定,需要判断是刚开始还是在持续中
{
if(keel_start==0)
{
keel_over=1; //确定得到了倾覆
keel_start=1;
}
}
else if(last_keel==0)
{
keel_start=0;
}
}
old_user_triger=now_user_triger;
tempy=in_buffer1¶meter.para_arr.nullity_07;
tempy=(tempy>>6)%2;
if(tempy&&(parameter.para_arr.function_sw&0x01))
{
now_user_triger=1;
if(old_user_triger==0)
user_triger=1;
}
else
{
now_user_triger=0;
}
if(in_buffer1&0x80)
{
over_skid_time++;
if(over_skid_time>=parameter.para_arr.skid_remain_time&&over_skid==0&&no_skid==1)
over_skid=1;
no_skid=0;
}
else
no_skid=1;
// speed_status[((uint)(sp_st_ptr_fm+sp_st_ptr_ram)*3+2)%180]=in_buffer2;
// interval_status2|=speed_status[((uint)(sp_st_ptr_fm+sp_st_ptr_ram)*3+2)%180]; //区间状态取决于每0.2秒的状态是否有效,是或的关系
sp_st_ram.speed_status[sp_st_ram.now_ptr].status2_per=in_buffer2;
interval_status2|=in_buffer2;
sp_st_ram.now_ptr++;
if(sp_st_ram.now_ptr>=40)
sp_st_ram.now_ptr=0; //在主程序中动态判断是否要转移到铁电中去
}
}
if(time5ms%100==50) //如果500毫秒就要检查显示部分是否有请求
check_show=1;
// AUXR=temp;
}
//*****************************************************************
void usb_int(void) interrupt 2 using 1
//外部中断1,代表SL811HS发来的中断信号
{
// uchar temp;
// temp=AUXR;
// clr_extram;
ext_ram=1;
IT1=0;
EX1=0;
SL811Write(IntStatus,INT_CLEAR);
// AUXR=temp;
}
void timer1(void) interrupt 3 using 2
//定时器1
{
// uchar temp;
// temp=AUXR;
// clr_extram;
TH1=0x70; //set time1 cycle is 20ms
TL1=0x00;
// r_read=1;
ext_ram=1;
if(modechanged&&(enum_done==0)) //如果当前在从结构等待状态下(未枚举)
if(toggle_time<250)
toggle_time++;
else
toggle_time=0;
time20ms--;
if(now_bps&&now_in_order==0)
{
time_uart++;
if(time_uart>200)
{
in_touch=0;
lost_touch=1;
time_uart=0;
}
}
else
{
time_uart=0;
show_trans=0;
if(USBIN) //caine add
jly_dkq=0; //恢复为记录仪状态
}
if(time20ms==0)
{
// TR1=0; //TR1=0;
dingshi=1;
}
// AUXR=temp;
}
//void uart_int(void) interrupt 4 using 3
// //PCA中断
// {
// }
void uart_int(void) interrupt 4 using 3
//串行口中断
{
// uchar temp;
// temp=AUXR;
// clr_extram;
ext_ram=1;
//judge witch channle will be operate
if(sel_ir)
{
}
else
{
//receive data
if(RI&&receive_ok==0)
{
RI=0;
if(!uart_in_dbuf)
com1_rece_buf[uart_recehead++]=SBUF;
ACC=SBUF;
if(RB8==P) //verify is error
return;
if(start_rece1) //find uart buffer1[0]=aa&&buffer1[1]=75
{
/* if(com1_rece_buf[2]==0x8a||DBUF[2]==0x8a)
{
if(uart_recehead1<2)uart_recehead1=2 ;
uart_in_dbuf=1;
DBUF[0]=com1_rece_buf[0];
DBUF[1]=com1_rece_buf[1];
DBUF[uart_recehead1++]=SBUF;
ACC=SBUF;
if(uart_recehead1>=522)
{
com1_rece_buf[0]=0;
com1_rece_buf[1]=0;
uart_recehead1=0;
receive_ok=1;
uart_in_dbuf=0;
//重新开始计时,超过3秒自动使得now_bps=0;
if(now_bps) //如果已经在115200下得到正确的通讯命令可以维持
time_uart=0;
start_rece1=0;
}
}
else*/
if((uart_recehead==com1_rece_buf[4]+7)||(uart_recehead>=64)||(com1_rece_buf[4]>=57))
{
receive_ok=1;
//重新开始计时,超过3秒自动使得now_bps=0;
if(now_bps) //如果已经在115200下得到正确的通讯命令可以维持
time_uart=0;
start_rece1=0;
}
}
else
{
if(com1_rece_buf[0]==0xaa)
{
if(uart_recehead==2&&com1_rece_buf[1]==0x75)
start_rece1=1;
else if(uart_recehead!=1)
uart_recehead=0;
}
else
uart_recehead=0;
}
}
//发送数据从串口
if(TI)
{
TI=0;
if(uart_sendhead==uart_sendtail||uart_sendtail==64) //如果发送完毕或一直发送超过了64个就要关闭发送中断
{
uart_sendhead=uart_sendtail=0;
send_ok=1;
time_uart=0; //发送的时候也会对通讯计时清零
}
else
{
ACC=com1_send_buf[uart_sendtail];
TB8=(~P); //清时间,定时发送数据
SBUF=com1_send_buf[uart_sendtail];
uart_sendtail++;
send_ok=0;
while(TI==0)
{}
}
}
}
}
void copy_ram_same(uchar *source,uchar *target,uchar number_of)
{
SEL_OTHERS=1;
while(number_of--)
*target++=*source++;
}
void initial_port(void)
{
//initial sfr
P1=0xff;
P3=0xff;
IE=0x3f; //暂时关闭所有中断,但中断源除PCA中断外全部打开
// IPH=0x04; //uart=01,time1=01,ext1=11,time0=01,ext0=10
// IP=0x1e; //uart=11,time1=10,ext1=00,time0=10,ext0=01
IPH=0x15; //uart=10,time1=01,ext1=11,time0=01,ext0=10
IP=0x0e; //uart=11,time1=10,ext1=00,time0=10,ext0=01
TH0=0xdc; //set time0 cycle is 5ms
TL0=0x00;
SCON=0xd0;
// SM1=1;
// SM0=1;
// REN=1;
// TCON=
TR0=1;
TR1=1;
IT0=1;
IT1=1;
TMOD=0x11; //T0 in mode1,T1 in mode1
// T2CON=0x;
RCLK=1;
TCLK=1;
TR2=1;
// RCAP2H=0xff; //115200 bps define 0xfffa,9600 bps define 0xffb8
// RCAP2L=0xb8;
// TH2=0xff; //115200 bps define 0xfffa,9600 bps define 0xffb8
// TL2=0xb8;
// now_bps=0;
}
void initial_reg(void)
{
//initial flag
flag1=0;
//initial ram
uart_sendhead=0;
uart_sendtail=0;
uart_recehead=0;
uart_recetail=0;
uart_recehead1=0;
uart_recetail1=0;
time5ms=0;
speed_pulse=0;
}
void delay_10ms(void)
{
uchar j;
for(j=0;j<200;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -