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

📄 htd30v02.c

📁 利用单片机实现的USB1.1通信。通过液晶屏的显示驱动代码
💻 C
📖 第 1 页 / 共 5 页
字号:
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&parameter.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 + -