基于超声波倒车雷达系统
电子0601郑灵光
电子0602潘建标,陈永根
摘要
伴随科技发展,大家生活水平提升,城市发展建设加紧,城市给交通系统也有较大发展,其情况不停改善。不过,因为多个原因合成时间住很多不可预见原因, 看不到后方而造成大量交通事故。城市还是常常出现大量交通事故,
尤其是倒车时,所以,设计出好倒车雷达系统,对于降低城市交通事故将有一个很好控制作用。当然这要求倒车雷达系统,含有精度高,抗干扰强,价格应该低,适宜推广等特点,这么基于超声波测距系统,完全能够胜任此任务。
本设计采取以ATC51单片机为关键低成本、高精度、微型化数字显示超声波测距仪硬件电路和软件设计方法。整个电路采取模块化设计,由主程序、发射子程序、接收子程序、显示子程序等模块组成。各探头信号经单片机综合分析处理,实现超声波测距仪多种功效。在此基础上设计了系统总体方案,最终经过硬件和软
本系统在倒车时不停测量汽车尾部和其后面障碍物距离,并随时显示其距离,并用语音立即提醒。在不一样距离范围内,不一样温度下测出距离,发出报警
信号,以提升汽车倒车时安全性仪器。
目录 |
|
第一章 绪论 …………………………………………3
1.1 课题背景,目标和意义 ………………………………………3
1.2两种常见超声波测距方案 …………………………………3
第2章 超声波测距系统设计 …………………………………3
2.1超声波测距原理 ………………………………4
2.2 超声波测距系统电路设计…………………………4
2.2.1 总体设计方案……………………………………4
2.2.2 发射电路设计………………………………4
2.2.3 接收电路设计……………………4
2.2.4 显示模块设计………………………………………5
2.2.5 温度赔偿模块设计………………………………5
3.1 总体步骤图 ……………………………..5
3.2 程序及分析……………………………..6
第四章电路调试及误差分析……………………………..7
4.1 电路调试……………………………..7
4.2 系统误差分析……………………………..7
第5章功效扩展………………………………………7参考文件 ……………………………..7
附录:………………………………………8-22
第1 章绪论
1.1课题背景,目标和意义
因为社会进步,经济发展和生活水平不停提升,汽。
车数量逐年增加,造成道路交通拥挤不堪,交通事故频繁发生
汽车倒车报警器:在倒车时不停测量汽车尾部和其后面障碍物距离,并随时显示其距离,并用语音立即提醒。在不一样距离范围内,不一样温度下测出距离,发出报警信号,以提升汽车倒车时安全性仪器。
2.2两种常见超声波测距方案
2.2.1 基于CPLD超声波测距系统
CPLD模块关键由发射模块,16位计时计数器模块,接收模块,次序实施计数器模块和六选一数据选择器模块五部分组成。其总体框图图1所表示。
CPLD 模块关键完成超声波发射、接收和时间测量。超声波发射模块开启40KHz超声波发射,当发射脉冲串达成设定值后,关闭超声波发射,同时开启六路计
时计数器模块开始计时;信号经过障碍物反射回来,
行整形,开启单片机开始接收数据,经过次序实施计数器计数值、数据选择器选择端和计时计数器控制端分别读取六路不一样计数值。全部数据读取完后,清除计时计数器计数值,准备下一次循环计数。
2.2.1基于单片机超声波测距系统
本警器由单片机来控制。整个控制系统由超声波发射电路、超声波接收电路、
报警电路、复位电路、显示电路组成。实施实时数字显示测得距离,在不一样距离
范围内发出不一样报警信号,驾驶员可依据个人需要调整设置报警距离,以降低事
故发生。本作品将采取此种方法。
第二章超声波测距系统设计
2.1超声波测距原理
超声波发射器向某一方向发射超声波,在发射时刻同时开始计时,超声波
在空气中传输,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立
即停止计时。超声波在空气中传输速度为c,依据计时器统计时间t,就能够
计算出发射点距障碍物距离(s),即:s=ct/2。这就是所谓时间差测距法。
2.2 超声波测距系统电路设计
度赔偿模块。由发射电路发射超声波,51计数器从0开始计时,当超声波反射回来,
接收电路接收,51停止计时,将所计得得数转化成十进制n,因为使用12MHz晶
体作时钟基准C51单片机定时器能方便计数到1μs精度,所以系统采取C51定
时器能确保时间误差在1mm测量范围内。,则将n和1us相乘即能够得到时间,从
而利用超声波测距原理就能够判定距离以是否利用利用凌阳61版语音处理功效,进
行报警及播放目前距离,温度和超声波传输速度。再者显示器也将显示距离,温度,
及超声波传输速度。
2.2.2 发射电路设计
用单片机直接产生40khz信号经过74ls04放大后直接驱动超声波发射探头。2.2.3接收电路设计
将超声波接收探头接收信号经cx6红外线专用芯片处理接收,然后送给单片机。
2.2.4显示模块设计
使用1602液晶屏,和单片机连接,将单片机距离,温度,超声波数度(声速)传送给液晶屏显示出来。
2.2.5温度赔偿模块设计
因为声速在不一样温度下传输速度是不一样,依据赔偿公式C=C0+0.607×T℃C0为零度时声波速度332m/s;T为实际温度(℃)。采取18b20温度传感器测
温,依据测得温度,来确定具体声速。
2.2.6 语音处理模块
依据手中现有材料,利用凌阳61 版语音处理功效,播放出:“倒车请注意”
并经过51单片机和凌阳串口通讯,将51测得距离,温度,声速数据传给凌阳,然后经过凌阳语音处理将其播报出来。
第三章超声波测距系统软件设计
3.1总体步骤图
3.1.1凌阳模块步骤图
初始化
发射
否
播报
3.1.2 51单片机模块
开始
初始化
发射
接收
延时中断
处理(关中断,定
时器)数据
是否有键按下 | 是 | 串口发送数据,凌 |
阳接收处理 |
否
3.2 程序及分析
(见附录)
第4 章电路调试及误差分析
5.1电路调试(盲区问题)
因为超声波发射探头在发射超声波时,接收探头也会接收到超声波,所以在发射超声波时,必需先关外部中止,延时一段时间,进而消除回波干扰,所以在测量中会有盲区出现,所以硬件调试中关键就是调整延时时间,使盲区达成最小,进而跳高测量精度。
经过硬件调试,来控制发射脉冲波个数和延时时间,并在实际测量中测出三种不一样测距模式下盲区,分别约为5cm,20cm及45cm。
、5.2系统误差分析28
依据超声波测距公式L=C×T,可知测距误差是由超声波传输速度误差和测量距离传输时间误差引发。
1.时间误差
在超声波传输速度是正确前提下,测量距离传输时间差值精度只要在达成微秒级,就能确保测距误差小于1mm误差。使用12MHz 晶体作时钟基准C51单片机定时器能方便计数到1μs精度,所以系统采取C51定时器能确保时间误差在1mm测量范围内。
2.超声波传输速度误差
超声波传输速度受空气密度所影响,空气密度越高则超声波传输速度就越快.
第5 章功效扩展
经过串口和PC 机进行通讯,并利用所学知识,用VB 写了了一个接收模块,
将 51 单 片 机 中 数 据 经 串
口传到电脑上显示。
参考文件33
单片机原理和控制技术机械工业出版社
数字电子技术教程 清华大学出版社
模拟电子技术教程 清华大学出版社
时德刚,刘哗.超声波测距研究.计算机测量和控制胡萍.超声波测距仪研制.计算机和现代化
附录:
//////////////主文件程序main////////////////////////////////////////////// 3.2.1超声波测距
#include<reg52.h>
#include<stdio.h>
#include"18B20.h"
#include"intrins.h"
#include"LCD1602.H"
#include"Delay1.h"
#define uchar unsigned char
#define uint unsigned int
ucharucHigh_time,ucLow_time; //超声波传输时间
ucharucFlag; //中止标志位
ucharfrq; //音乐频率节拍问题
floatc; //不一样温度下超声波传输速度
/*************************针脚定义********************************/sbit Hz40k_out=P3^6; //40k信号输出端
sbit Mod_short=P1^4;
sbit Mod_long=P1^5;
sbit | Mod_out = P1^7; | // 判定数据是发给电脑机还是凌阳版 |
sbit Key_tran=P1^6; //发送数据,开始通讯
/*****************************************************************/
voidTmr0_int(void);
/**********************函数申明***********************************/
void Send_40khz_medium(void) ;
void Send_40khz_short(void) ;
int Distance_count(); //距离转换函数
floatCompensate_c(); //温度赔偿函数
voidDisplay_dis(void) ;
//距离显示函数 voidDisplay_tem(void); //温度显示函数
voidDisplay_c(void) ; //声速显示函数
voiddelayms(unsigned char ms);
voidTmr1_int(void);
/***********************子程序********************************/
voidTmr0_int(void)
{TMOD|=0x01; //tmr0 方法1,16位计数
EA=0; //关总中止
ET0=0; //关T0中止
TR0=0; //停止计时器0
TH0=0X00;
TL0=0X00;
}
//////////////////////////////////////////////////////////////
voidInt0_int(void)
{IT0=0;//低电平沿触发
EA=0; //关总中止
EX0=0; //屏蔽中止
/////////////////////////////////////////////////////////////}
TMOD|= 0x20; //定时器1定时方法2
//TCON = 0x40; //设定时器1开始计数
TH1= 0xF3;//12MHz 2400波特率
TL1= 0xF3;
TR1= 0; //关闭定时器
}
///////////////////////////////////////////////////////////
voidUstart_send_lingyang(void)
{ uchar send[3];
uint Voice_v;
send[0]=Distance_count();
send[1]=Distance_count()>>8;
TR1= 1; //开启定时器
TI=0;
SBUF=send[1]; //先发高位再发低位
while(!TI); //等候发送完成
TI=0;
while(!RI); //等候接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
while(!TI);
TI=0;
send[1]=(Read_Temperature()/10)>>8;//发送为实际温度十倍37.2C则发送372
send[0]=Read_Temperature()/10;
//delay_ms(200);
SBUF=send[1];
while(!TI);
TI=0;
while(!RI); //等候接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
while(!TI);
TI=0;
Voice_v=Compensate_c(); send[0]=Voice_v;
//将浮点型转换为整型
send[1]=Voice_v>>8;
while(!RI); //等候接收完成
RI=0;
//delay_ms(200);
SBUF=send[1];
while(!TI);
TI=0;
while(!RI); //等候接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
TI=0; while(!TI);
TR1=0;//关闭定时器
}
//////////////////////////////////////////////////////////////////////////
void Ustart_send_pc(void)
{
uchar send[4];
uint Voice_v;
send[0]=Distance_count()/1000+0x30;
send[1]=Distance_count()%1000/100+0x30; send[2]=Distance_count()%100/10+0x30; send[3]=Distance_count()%10+0x30;
TR1 = 1; //开启定时器
TI=0;
SBUF=send[0];
while(!TI);
TI=0;
SBUF=send[1];
while(!TI);
TI=0;
SBUF=send[2];
while(!TI);
TI=0;
SBUF=send[3];
TI=0; while(!TI);
37.2C 则发送372
send[2]=(Read_Temperature()/10)%10+0x30;
SBUF=send[0];
while(!TI);
TI=0;
SBUF=send[1];
while(!TI);
TI=0;
SBUF=send[2];
while(!TI);
TI=0;
Voice_v=Compensate_c();
//将浮点型转换为整型
send[0]=Voice_v/100+0x30;
send[1]=Voice_v%100/10+0x30;
send[2]=Voice_v%10+0x30;
SBUF=send[0];
while(!TI);
TI=0;
SBUF=send[1];
while(!TI);
TI=0;
SBUF=send[2];
while(!TI);
TR1=0;//关闭定时器 TI=0;
{Key_tran=1;//写1 准备开始读
if(Key_tran==0)
{ delay_ms(10);
while(!Key_tran);//等候按键放开
if(Mod_out==1)
Ustart_send_lingyang();
else
Ustart_send_pc();
}
}
////////////////////////////////////////////////////////////////////////////////////////
void Send_40khz_short(void) //从P1.0 发出40KHz 脉冲短波测量短距离
{ucharn,p;
for(n=0;n<1;n++) //输出1个脉冲
{Hz40k_out=1;
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
/////////////////////////////////////////////////////////////
voidSend_40khz_medium(void)//从P1.0发出40KHz脉冲 中波测
{uchar n,p; 量中距离
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
////////////////////////////////////////////////////////////
void Send_40khz_long(void)//从P1.0发出40KHz 脉冲长波测量长距离
{uchar n,p; | //输出40 个脉冲 |
|
for(n=0;n<40;n++) | ||
| ||
{Hz40k_out=1; |
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
//////////////////////////////////////////////////////////
float Compensate_c() //温度赔偿公式
{c= 331.45+0.607*Read_Temperature()/100;
return c;
}
/////////////////////////////////////////////////////////
{float Temp; int Distance_count()//距离计算函数
Temp*=Compensate_c(); //毫米
return Temp;
}
///////////////////////////////////////////////////////
voidDisplay_dis(void)
//显示距离 {switch(ucFlag)
{case 1: { LCD_gotoxy(0, 0);
write_string_LCD1602("Distance:");
if(Distance_count()/1000>0) //判读显示位数
write_number(Distance_count(),4);
elseif (Distance_count()/100>0)
write_number(Distance_count(),3);
elseif (Distance_count()/10>0)
{write_number(Distance_count(),2);write_string_LCD1602(" ");}
else
{write_number(Distance_count(),1);write_string_LCD1602(" ");} write_string_LCD1602("mm");
break;
}
case2: { LCD_gotoxy(0, 0);
write_string_LCD1602("Distance:wrong ") ;
}
break;
break;
}
}
}
///////////////////////////////////////////////////////////////////
void Display_tem(void) //显示温度
{LCD_gotoxy(1, 0);
write_string_LCD1602("T:");
if (Read_Temperature()/100>=100)
write_number(Read_Temperature()/100,3); else
write_number(Read_Temperature()/100,2);
write_string_LCD1602(".");
write_number(Read_Temperature()%100/10,1); write_string_LCD1602("C");
}
///////////////////////////////////////////////////////////////
voidDisplay_c(void) //显示声速
{LCD_gotoxy(1,8);
write_string_LCD1602("c:");
write_number(Compensate_c(),3);
write_string_LCD1602("m/s");
}
void INT0_Ultrasonic() interrupt 0 /*****************中止处理***********************/
TR0=0;//关定时器0
ET0=0;//屏蔽定时器0中止
EX0=0;//关外部中止
ucTemp_time1=TL0;
ucTemp_time2=TH0;
if((ucTemp_time1!=0)&&(ucTemp_time2!=0))
{ucHigh_time=TH0;
ucLow_time=TL0;
}
}
////////////////////////////////////////////////
void over()interrupt 1 //T0 溢出为无效测量FFF;
{ucFlag=2;//溢出标志位
TR0=0;//关定时器0
ET0=0;//屏蔽定时器0中止
EX0=0;//屏蔽外部中止
}
/**************************主程序************************/ voidmain(void)
{Tmr0_int();
Int0_int();
Ustart_int(); //串口通讯初始化
init_LCD1602();
while(1) EA=1; //开总中止
TL0=0;//清定时0
TR0=1;//开定时0
ET0=1;//开启定时器0中止
if(Mod_long==0)
{ | Send_40khz_long();//发射40khz 脉冲 | 测量长距离 | |
delay_ms(1); | //1ms | ||
delay_us(80); // 0.724ms 防回波干扰总延时25*40/1000+1+0.724=2.724ms //盲区:2.724*170=463mm
}
if (Mod_long==1& Mod_short==1)
{Send_40khz_medium();//发射40khz脉冲测量中距离
delay_us(127);// 防回波干扰
1.157ms延时
//总延时1.157+0.05=1.207ms
//盲
区:1.207*170=205.19mm
}
if(Mod_short==0)
{Send_40khz_short();//发射40khz脉冲 测量短距离
}
EX0=1; //开启int0中止
Display_dis(); //距离显示
Display_tem(); //温度显示
Display_c(); //声速显示
delay_ms(200);/* Tmr1_int();
ET1=0; //关tmr1中止关闭音乐,避免开音乐是中止太频繁,引发测温
和测距离全部不正确
*/
//delay_ms(200);
delay_ms(200);
Key_scan(); //扫描按键判定是否要发送数据和凌阳版通讯
}
}
(2)显示模块
#ifndef _RZ_LCD1602_ #define _RZ_LCD1602_ |
|
#ifndef uchar
#defineuchar unsigned char
#endif
#ifndefuint
#defineuint unsigned int
#endif
ucharcode number[10]={""};//用来显示数据
#definePort P2
sbitRS_LCD1602=P1^1;
sbitRW_LCD1602=P1^2;
sbitEN_LCD1602=P1^3;
voidDelay_Ms_LCD1602(uint ms)
uchar y,z; {//延时程序(以毫秒为单位)。
for(z=0;z<25;z++);
}
bit get_status_LCD1602() //读状态。
{Port=0xff;
EN_LCD1602=0;
RS_LCD1602=0;
RW_LCD1602=1;
EN_LCD1602=1;
return((bit)(Port&0x80));
}
voidwrite_command_LCD1602(uchar com) //写命令。
{while(get_status_LCD1602());
EN_LCD1602=0;
RS_LCD1602=0;
RW_LCD1602=0;
Delay_Ms_LCD1602(5);
Port=com;
EN_LCD1602=1;
Delay_Ms_LCD1602(20);
EN_LCD1602=0;
}
voidset_cursor_LCD1602(uchar line,uchar add) //设置光标行(line),列(add)位置。
{write_command_LCD1602(0x80+line*0x40+add);
void write_char_LCD1602(uchar indata) }
RS_LCD1602=1;
RW_LCD1602=0;
Delay_Ms_LCD1602(5);
P2=indata;
EN_LCD1602=1;
Delay_Ms_LCD1602(20);
EN_LCD1602=0;
}
void Write_CGA_LCD1602(uchar*CGA_Data,uchar CGA_Index) //写自定义字符
{ uchar index;
CGA_Index&=0x07;//最多8个字符。
CGA_Index=CGA_Index<<3;//决定CGARAM相对地址。
for(index=0;index<8;index++)
{//设置CGARAM地址。
write_command_LCD1602(CGA_Index|index|0x40);//写入字模数据。
write_char_LCD1602(*CGA_Data);
CGA_Data++;
}
}
voidwrite_char_add_LCD1602(uchar indata,uchar line,uchar add){//在指定行(line),列(add)位置写入字符(indata)。
set_cursor_LCD1602(line,add);
} write_char_LCD1602(indata);
//一次最多写入255 个。
ucharindex=0;
while(indata[index]!=0&&index<255)//直到碰到字符串结束标志。
{write_char_LCD1602(indata[index]);
index++;
}
}
void cursor_show_LCD1602() //打开显示器并显示闪烁光标。
{write_command_LCD1602(0x0f);
}
void cursor_hide_LCD1602() //隐藏光标{write_command_LCD1602(0x0c);
}
voidclear_LCD1602() //清屏。
{while(get_status_LCD1602()&0x80);//等候空闲状态。
write_command_LCD1602(0x01);
Delay_Ms_LCD1602(50);
}
voidinit_LCD1602() //初始化液晶
{write_command_LCD1602(0x38);//设置显示模式。
write_command_LCD1602(0x80);//光标初始位置。
write_command_LCD1602(0x0f);//打开显示器并显示闪烁光标。write_command_LCD1602(0x06);//输入数据后光标自动向后移。
} cursor_hide_LCD1602(); //隐藏光标。
{ x &= 0x1; //x不能大于1,y不能大于15
y &=0xF;
if(!x) write_command_LCD1602(0x80|y);
elsewrite_command_LCD1602(0xC0|y);
}
/************************************************************
**************************************************************/
void write_number(uint num,uchar n)
{ uchar a; | //个位 |
|
uchar b; | //十位 | |
| ||
uchar c; | //百位 | |
uchar d; | //千位 |
uchare; //万位
switch(n)
{case 1:write_char_LCD1602(number[num]);
break;
case 2:b=num/10;
a=num%10;
write_char_LCD1602(number[b]);
write_char_LCD1602(number[a]);
break;
case 3:c=num/100;
b=num%100/10;
write_char_LCD1602(number[c]); a=num%10;
break;
case 4:d=num/1000;
c=num%1000/100;
b=num%1000%100/10;
a=num%10;
write_char_LCD1602(number[d]);
write_char_LCD1602(number[c]);
write_char_LCD1602(number[b]);
write_char_LCD1602(number[a]); break;
case 5:e=num/10000 ;
d=num%10000/1000;
c=num%1000/100;
b=num%1000%100/10;
a=num%10;
write_char_LCD1602(number[e]);
write_char_LCD1602(number[d]);
write_char_LCD1602(number[c]);
write_char_LCD1602(number[b]);
write_char_LCD1602(number[a]);
break;
}}
#endif
/***********************************************(3)温度传感器模块
*版本:V1.0 测试经过(负温度未测试) *
*By Andy -5-23 copyright: *
***********************************************/
#ifndef DS18B20_H
#define DS18B20_H
#include <string.h>
#include <intrins.h>
#include <math.h>
typedef unsigned char byte;
typedef unsigned int word;
/**************DS18B20 温度定义部分×**************/
sbit DQ=P1^0; //18B20 接口
bit flag_minus=0;
wordtemp_data[3];
/********************函数列表********************/
voidadjust_res(char res); //res 分别等于0x1f,0x3f, 0x5f 温度读数分辨率分别对应
byteow_reset(void);
byteread_byte(void);
voidwrite_byte(char val);
wordRead_Temperature(void);
/************************************************
voidDS18B20_delay(word useconds)
} { for(;useconds>0;useconds--);
DQ = 0; //拉低总线
DS18B20_delay(29); // 保持 480us 29
DQ = 1; // 释放总线
DS18B20_delay(3);
// 等候回复 presence = DQ; // 读取信号
DS18B20_delay(25); // 等候结束信号
return(presence); // 返回 0:正常1:不存在
}
/************************************************
byteread_byte(void)
{byte i;
bytevalue = 0;
for (i=8;i>0;i--)
{value>>=1;
DQ= 0;
DQ= 1;
DS18B20_delay(1);
if(DQ)value|=0x80;
DS18B20_delay(6);
}
return(value);
}
/************************************************
{DQ = 0;//
DQ = val&0x01;
DS18B20_delay(5); //
DQ= 1;
val=val/2; //向右移1位
}
DS18B20_delay(5);
}
/************************************************
voidadjust_res(char res)
{ow_reset(); //复位
write_byte(0xcc); //跳过Rom
write_byte(0x4e); //写暂存器
write_byte(0x02); //写TH
write_byte(0x01); //写TL
//write_byte(0x5f); //写结构寄存器
write_byte(res);
ow_reset(); //复位
write_byte(0xcc); //跳过Rom
write_byte(0x48); //把暂存器内容写到EPRam中
}
/************************************************
{ow_reset(); word Read_Temperature(void)
write_byte(0x44); //发转换命令
ow_reset();
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte();
//读温度值第字节 temp_data[1]=read_byte(); //读温度值高字节
if((temp_data[1]&0xf8)!=0x00)
{flag_minus=1; //零下标志位置1
temp_data[0]=~temp_data[0]; //低8 位取反temp_data[1]=~temp_data[1]; //高8 位取反temp_data[2]=temp_data[1];
temp_data[2]<<=8;
temp_data[2]=((temp_data[2]|temp_data[0])+1)*6.25;// 两字节合成一个整型变量后加1,结果扩大100倍用于显示
}
else
{ flag_minus=0;
temp_data[2]=temp_data[1];
temp_data[2]<<=8;
temp_data[2]=(temp_data[2]|temp_data[0])*6.25; // 两字节合成一个整型变量。
}
return temp_data[2]; //返回温度值}
(4)延时模块 #endif
for(i=0;i<time;i++)
{nop_();
}
}
void delay_ms(uchar time) | //正确延时1ms | 12M 晶振 |
{ucharb;
for(;time>0;time--)
for(b=250;b>0;b--);
for(b=241;b>0;b--);
} |
|
Copyright © 2019- qianxingmanyou.cn 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务