☰
基于8254/8255的智慧交通车辆测速与显示实现
2026/10/28 5:05:10 网站建设 项目流程

简介:面向微机原理与接口技术课程学习者与物联网入门实践者的智慧交通车辆测速实验报告,围绕定距测时思路,借助8254/8253定时计数与8255数码管显示等接口芯片,完成车辆速度采集、计算及DOS屏幕与实验箱LED同步显示。文档共1个docx文件,压缩包约769KB,内容涵盖实验目的与设备环境、设计要求与性能指标、硬件电路图、程序流程图、方案设计讨论、实验结果分析、心得体会和团队分工,并给出测速精度±5%、响应时间与稳定性等指标参考。已有644人学习,适合课程实验复现、课程设计参考和接口技术复习。读者可据此梳理传感器选型、中断与定时器配置、数值计算和显示驱动之间的衔接,对照误差分析排查测量偏差,也能借鉴报告结构完成实验记录与结果讨论。

1. 智慧交通车辆测速:一套没有传感器的测速方案

“智慧交通车辆测速”这题目拿到手,十有八九第一反应是找传感器,红外对管、霍尔、地磁,哪个听着都像正经方案。等真蹲在实验箱前面拨跳线才明白,这套硬件压根没打算让你测速,它只给了时钟源、一片 8254、一片 8255 和两个拨码开关。测速的活儿被拆成了“固定距离下测时间”:1MHz 时钟经三级分频降到 1Hz,8254 通道 2 当秒表数秒,8255 驱动两位 LED 数码管,拨码开关兼职 GATE 门控和启停。这份微机原理与接口技术的实验报告写的就是这条链路,从端口地址一直落到能跑的汇编。做接口课设的、读回 8254 计数值老是不稳的、数码管只会亮一位的,都能拿它对照着改。物联网、IoT 那些上层词先搁着,底下的计数器和引脚没搞明白,上层再花也没用。

2. 硬件链路拆解:从片选信号到两位数码管的完整走线

这套实验的硬件其实就三块:地址译码给两片芯片分地盘,8254 的三个通道串成一条分频链,8255 的三个端口分别管段码、位选和开关。看起来是教科书上的标准接法,但每一根线接错,现象都不是报错,而是数码管乱跳或者干脆不亮,排查起来全靠对照端口地址一个个试。先把这张地图画清楚,后面写代码才有落脚点。

2.1 端口地图:Y0 给 8254,Y1 给 8255

实验箱上的地址译码器把 I/O 空间切成了若干块,Y0 有效时选中 8254,落在 280H~283H;Y1 有效时选中 8255,落在 288H~28BH。两片芯片各占四个连续地址,片内用 A1、A0 区分寄存器,所以 8254 的计数器 0/1/2 和控制口正好是 280H、281H、282H、283H 四个,8255 的 PA、PB、PC、控制口是 288H、289H、28AH、28BH。地址不连续(284H~287H 空着)不是笔误,是译码器一个输出管脚对应一片芯片,中间那段没接东西。

地址所属芯片端口/寄存器本文用途
280H8254计数器 01MHz 分频到 1kHz
281H8254计数器 11kHz 分频到 1Hz
282H8254计数器 21Hz 计时,当秒表读
283H8254控制寄存器写控制字、发锁存命令
288H8255PA 口数码管段选(a~g、dp)
289H8255PB 口数码管位选(PB0、PB1)
28AH8255PC 口PC0 读拨码开关状态
28BH8255控制寄存器设置三个端口的方向

提示:地址写错一位,最典型的症状是“写进去没反应也不报错”。8254 的控制字写到 280H 上,芯片会把 36H 当成计数初值低字节收下,计数器行为完全乱套,但程序照样往下跑。调试时先把每个OUT的 DX 值打印在纸上核一遍,比盯着示波器快。

这套地址分配决定了程序的初始化顺序:先给 8255 写控制字定方向,再给 8254 三个通道写控制字和初值。顺序反了不会崩,但 8255 上电默认全是输入,你往 PA 写段码等于往空气里写,数码管当然不亮。

2.2 三级分频链:为什么非得把三个通道串起来

8254 是 16 位减法计数器,单个通道最大计数值 65536。假设直接拿 1MHz 当计数时钟,计满只要 65.5 毫秒,一辆玩具车还没走过测速点,计数器已经溢出好几轮了,读回来的值毫无意义。所以必须先把高频时钟降下来,让“一个脉冲”代表一个对人友好的时间单位。

实验箱给的 1MHz 经通道 0 做 1000 分频,输出 1kHz;1kHz 再进通道 1 做 1000 分频,输出 1Hz。这条链走完,通道 2 的输入时钟就是每秒一个脉冲,通道 2 每收到一个脉冲计数值减一,读出来的差值直接就是“过了几秒”。硬件上就是把 OUT0 用跳线接到 CLK1,OUT1 接到 CLK2,三根线一插,一条 10^6 分频链就成立了。

1MHz ──► CLK0 [计数器0 ÷1000] OUT0 ──► CLK1 [计数器1 ÷1000] OUT1 ──► CLK2 [计数器2 计时] ▲ GATE2 ───┘(拨码开关控制)

通道 2 的 GATE 引脚接拨码开关,这就是整套装置的“启动/停止”键。方式 2 下 GATE 为高电平时计数器才工作,拨到低电平停止计数并把输出置高,再拨回高电平会从初值重新装载。所以操作流程是:先拨低复位,再拨高开始计时,车辆模型走过测速点的瞬间拨低,锁存读数。听着土,但这确实是实验箱上唯一能人为制造“起止沿”的手段。

2.3 显示与输入分家:PA 送段码、PB 选位、PC0 读开关

8255 这边是典型的三端口分工。PA 口八根线全给数码管的段选,共阴极数码管的 a~g 加小数点正好八位;PB 口只用低两位做位选,PB0 选右边那一位,PB1 选左边那一位;PC 口只留 PC0 当输入,接拨码开关的另一路(另一路直接接 GATE2)。控制字 81H 就是照这个分工算出来的:D7=1 表示方式设置,D6D5=00 让 A 组工作方式 0,D4=0 让 PA 输出,D3=0 让 PC 高四位输出,D2=0 让 B 组方式 0,D1=0 让 PB 输出,D0=1 让 PC 低四位输入。

控制字位值含义
D71方式设置标志
D6 D500A 组方式 0(基本 I/O)
D40PA 输出(段码)
D30PC7~PC4 输出
D20B 组方式 0
D10PB 输出(位选)
D01PC3~PC0 输入(读开关)

这里有个容易被忽略的细节:PC 口高四位和低四位方向是分开设的,D3 管高四位、D0 管低四位。你要读 PC0,D0 必须是 1;但 PC7 想拿来读东西就得把 D3 也置 1。原文另一套方案用 89H 却去读 PC7,方向就反了,读回来永远是 0——这个坑后面单独说。

2.4 上电前的飞线核对表

硬件连完别急着烧程序,按下面这张表逐根对一遍,能省掉后面一半的调试时间。每一行对不上,对应的现象都写在右边,方便倒查。

连线起点终点接错的典型现象
时钟源1MHz 输出8254 CLK0全无反应,读数恒为 0
分频链 18254 OUT08254 CLK1通道 2 时钟变成 1kHz,一秒跳一千下
分频链 28254 OUT18254 CLK2同上,数码管飞闪
门控拨码开关8254 GATE2拨上去不计数,或一直计不停
段码8255 PA0~PA7数码管 a~dp笔画缺段、乱码
位选8255 PB0、PB1数码管位选端只亮一位,或两位同时亮糊成一团
开关读回8255 PC0拨码开关程序认为开关永远在低电平
共地实验箱 GND数码管/开关 GND数码管微亮、读数随机跳

3. 8254 初始化:三个控制字把 1MHz 压到秒级

8254 的初始化是这套程序里最容易写错的一段,因为它没有“配置成功”的反馈,写错了芯片照单全收,只是行为不对。三个通道的控制字要连着写,中间不能插别的 I/O 操作打断节奏,每个通道写完控制字紧接着写初值,顺序颠倒芯片就不认这个初值。

3.1 控制字逐位拆:36H、76H、B4H 各写了什么

36H 是二进制 0011 0110,D7D6=00 选通道 0,D5D4=11 表示“先读写低字节、再读写高字节”,D3D2D1=011 指定方式 3,D0=0 表示二进制计数。76H 是 0111 0110,只有 D7D6 变成 01 选通道 1,其余一样。B4H 是 1011 0100,D7D6=10 选通道 2,方式位 D3D2D1=010 指定方式 2。把这三个字节并排看,规律很清楚:通道号在最高两位,方式号在中三位,读写格式在 D5D4。

; 8254 初始化:1MHz -> 1kHz -> 1Hz 三级链路 MOV DX, 283H ; 8254 控制寄存器 MOV AL, 36H ; 通道0:先低后高、方式3、二进制 OUT DX, AL MOV DX, 280H MOV AX, 1000 ; 分频系数 1000,1MHz / 1000 = 1kHz OUT DX, AL ; 先写低字节 MOV AL, AH OUT DX, AL ; 再写高字节 MOV DX, 283H MOV AL, 76H ; 通道1:先低后高、方式3、二进制 OUT DX, AL MOV DX, 281H MOV AX, 1000 ; 1kHz / 1000 = 1Hz OUT DX, AL MOV AL, AH OUT DX, AL MOV DX, 283H MOV AL, 0B4H ; 通道2:先低后高、方式2、二进制 OUT DX, AL MOV DX, 282H MOV AX, 0 ; 初值 0 即 65536,够计 18 小时 OUT DX, AL MOV AL, AH OUT DX, AL

代码里每个通道都是“控制字→低字节→高字节”三步,中间不插入其他端口的读写。参数改动点只有两个:AX里的初值决定分频系数,AL里的控制字决定方式和读写格式。想把分频改成 500,就把通道 0 的AX改成 500,输出频率变成 2kHz,后面通道 1 若是 2000 分频,最终仍是 1Hz,两边要配平,这条链上任何一级改了都得重算。

3.2 计数初值与分频系数的对应关系

8254 的计数初值和分频系数在方式 2、方式 3 下是同一个数:写 N,输出就是输入时钟的 N 分频。写 1000 得 1kHz,写 100 得 10kHz,写 0 被解释成 65536。这里有个新手常见的误解,以为写进去的是“要数多少个数”,其实对方式 2/3 来说,它就是分频比,计数器自己会循环重装,不用程序去管。

初值的下限受输入时钟限制。假设输入 1MHz,写 100 得 10kHz,通道本身没问题;但你要是写 10,输出 100kHz,下一级如果还是 1000 分频,出来是 100Hz,秒表就变成每 10 毫秒跳一次了。整条链的乘积决定最终频率,1MHz ÷ (N0 × N1) = 最终 Hz 数,N0、N1 都要落在 1~65536 之间,否则芯片按 65536 处理,算出来的时间和预期差一大截。

提示:先算好分频比再动手接线。纸上写一行1000000 / N0 / N1 = 目标频率,把 N0、N1 代进去验算,比在实验箱上一边改代码一边看数码管快得多。

3.3 方式 2 和方式 3 别写反

方式 3 是方波发生器,输出占空比 50% 的连续方波,适合放在分频链的前两级,因为方波的上升沿和下降沿都能触发下一级计数,信号干净。方式 2 是分频器,输出周期性低脉冲,每个计数周期末给一个窄低电平,适合放在最后一级当计时脉冲源——它那个低脉冲正好可以当作“一秒到了”的标记。

通道 2 用方式 2 还有个额外好处:GATE 为低电平时计数器停止并把输出强制拉高,再拉高 GATE 时从初值重新装载。这叫硬件重触发,正好实现“拨下来停、拨上去重新开始计时”的操作,不需要程序去复位计数器。如果通道 2 误设成方式 3,GATE 的行为会变成“门控方波输出”,停止和重启的时序就对不上了,读回来的数会带着上次的残留。

通道方式分频比输出选它的理由
0方式 310001kHz 方波方波边沿干净,便于下一级计数
1方式 310001Hz 方波同上,且占空比稳定
2方式 265536秒脉冲计数支持 GATE 重触发,方便启停

4. 读数与显示:锁存、取补、动态扫描三件事

程序跑起来之后,真正决定“读数准不准、显示稳不稳”的是读计数器和刷数码管这两段。8254 是运行中读数,8255 是分时复用驱动两位数码管,两边都有时序上的坑,写错了现象很直观:要么数值乱跳,要么数字串位。

4.1 锁存命令 80H 与取补运算

8254 的计数值是 16 位,分两次读,先低后高。如果不管不顾直接连读两个字节,很可能低字节读的时候是 0xFF,等读高字节的时候计数器已经借位变成 0x01,拼出来就是个完全错误的数——这种错不是每次都出现,频率高了以后数码管看起来就是在随机跳,特别像接触不良,能让人怀疑半天硬件。

正确做法是先往控制寄存器写一个锁存命令,把当前计数值冻结到内部锁存器里,再从容地读两个字节。锁存命令 80H 的 D7D6=10 选中通道 2,D5D4=00 表示“锁存当前计数值”,后四位无所谓。锁存之后计数器照常运行,你读到的是发命令那一瞬间的快照。

; 锁存并读回通道2,换算成已计秒数 MOV AL, 80H ; 通道2 锁存命令,D5D4=00 MOV DX, 283H OUT DX, AL MOV DX, 282H IN AL, DX ; 先读低字节 MOV AH, AL ; 暂存到 AH IN AL, DX ; 再读高字节 XCHG AH, AL ; 交换后 AX = 完整计数值 MOV NUM, AX ; 存一份原始值,方便调试时看 MOV BX, 0 SUB BX, AX ; 0 - 计数值 = 已计脉冲数(模 65536) MOV TIME, BL ; 只取低 8 位,两位数码管够用

这段的关键在SUB BX, AX。8254 是减法计数器,初值 0(即 65536)往下减,减了 n 次之后计数值是 65536-n,所以用 0 减去它,结果的低 16 位正好等于 n。只取BL是因为两位数码管最大显示 99,超过 99 秒的部分本来也显示不出来;要看完整秒数就把BX整个存下来。

4.2 两位数码管的动态扫描与消隐

两位数字共用一组段码线,靠位选分时点亮,人眼看到的是两位同时亮。刷新频率要足够高,否则会看到明显的闪烁;但每次换位之前必须先把段码清零,否则上一位的笔画会残留在新一位上,出现“8 和 1 叠在一起”的鬼影。

SHOW_2 PROC PUSH AX PUSH BX PUSH DX MOV BL, 10 MOV AL, TIME MOV AH, 0 DIV BL ; AL=十位,AH=个位 MOV TIME_GE, AH MOV TIME_SHI, AL ; 十位直接取商,不要再除一次 ; ---- 个位 ---- MOV DX, L8255_A MOV AL, 00H ; 先消隐,防止串影 OUT DX, AL MOV DX, L8255_B MOV AL, 00000001B ; PB0 选右侧一位 OUT DX, AL LEA BX, LED MOV AL, TIME_GE XLAT ; 查段码表 MOV DX, L8255_A OUT DX, AL CALL DELAY1 ; ---- 十位 ---- MOV DX, L8255_A MOV AL, 00H OUT DX, AL MOV DX, L8255_B MOV AL, 00000010B ; PB1 选左侧一位 OUT DX, AL LEA BX, LED MOV AL, TIME_SHI XLAT MOV DX, L8255_A OUT DX, AL CALL DELAY1 POP DX POP BX POP AX RET SHOW_2 ENDP

LED表是共阴极段码:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,对应 0~9,后面还可以接 A~F。XLAT用DS:BX+AL查表,所以进子程序前BX必须指向表首、AL必须是 0~15 的索引,两个条件缺一个拿到的就是野值。DELAY1里CX装0FFFH循环,这个值太大两位都会闪,太小亮度不够,实际调的时候从0100H到0FFFH之间试,找到既不闪又够亮的那一档。

4.3 DOS 屏显的字符转换与防闪

DOS 显示那一路走的是 BIOS 的 2 号功能,AH=02H、DL=字符,把数字转成 ASCII 打出去。数值转字符用查表比ADD AL,30H更稳,因为段码表和 ASCII 表可以共用一个索引,十位个位各查一次,中间补个逗号。

刷屏最容易翻车的是“每次都重打”,屏幕上数字没变也照样输出一遍,整个 DOS 窗口闪得没法看。程序里用BUF存上一次显示的值,读回的新值和它一样就直接跳过这次输出,只有变化了才刷新。这个思路在任何字符界面的仪表程序里都能用,本质是个最土的脏值检测。

SHOW_DOS PROC PUSH AX PUSH BX PUSH DX CMP FLAG, 0 ; 拨码开关没在计数状态就不显示 JZ SHOW_DOS_END MOV AL, TIME CMP BUF, AL ; 和上次显示的值比 JZ SHOW_DOS_END ; 没变就跳过,避免刷屏闪烁 MOV BUF, AL MOV BL, 10 MOV AL, TIME MOV AH, 0 DIV BL MOV TIME_GE, AH MOV TIME_SHI, AL LEA BX, ASC MOV AL, TIME_SHI XLAT ; 十位转 ASCII MOV DL, AL MOV AH, 02H INT 21H LEA BX, ASC MOV AL, TIME_GE XLAT ; 个位转 ASCII MOV DL, AL MOV AH, 02H INT 21H MOV DL, ',' MOV AH, 02H INT 21H SHOW_DOS_END: POP DX POP BX POP AX RET SHOW_DOS ENDP

5. 避坑与排查:五个让实验箱重跑的现场

这套程序的坑有个共同特点:不报错、不崩,只是显示不对,你很难判断是硬件接线、芯片配置还是软件逻辑的问题。下面五条是我和组里同学真实踩过的,按“现象→原因→解决”记下来,遇到类似症状可以直接对号。

5.1 数码管只显示个位,十位永远是 0

现象:计时到 25 秒,数码管个位显示 5,十位死活是 0;DOS 那边干脆打出一个 0 加个 5。

原因:分离十位的时候多除了一次。第一次DIV BL之后AL已经是十位、AH是个位,代码里又把AH清 0 再除一遍,商的十位自然变成 0。这个 bug 特别阴,因为它只在数值小于 100 时“看起来正常”——个位是对的,只是高位丢了。

解决:第一次除法后直接把AL存进TIME_SHI,不要再除。真要处理三位数,就把TIME扩成 16 位以上,用连续除以 10 取余的方式逐位分离,每一步的余数才是当前最低位。

5.2 读回来的计数值像随机数,每次都不同

现象:拨码开关明明没动,连续读几次通道 2,数值在 0~65535 之间乱跳,完全没有规律。

原因:没发锁存命令就读。8254 是 16 位、8 位总线的芯片,读低字节和高字节之间隔了几条指令,这段时间里计数器可能正好借位,两次读到的不是一个时刻的值。计数值越大、时钟越快,撞上的概率越高。

解决:读之前先往控制寄存器写 80H 锁存,再连读两字节。锁存后的值冻结在内部锁存器里,读多慢都不影响。顺带一提,发完锁存命令到实际读之间不要插入其他 8254 操作,否则可能把锁存器冲掉。

5.3 拨码开关拨上去,计数器纹丝不动

现象:程序跑起来,读数一直停在 0,拨码开关来回拨都没反应。

原因有两种。一是 GATE2 那根线没接到开关上,悬空被当成低电平,方式 2 下低电平就是不计数;二是 8255 的控制字把 PC 口方向设错了,读开关的那一位实际是输出,程序读回来的永远是 0,于是误判成“开关一直在低电平”。

解决:先用万用表量 GATE2 对地电压,拨高时应该是高电平,不是就查线。再核对 8255 控制字,要读 PC0 就得保证 D0=1;想读 PC7 则要 D3=1 且 D0 无所谓。控制字和实际读的引脚必须一一对应,不能看着“C 口能读”就随便挑一位。

5.4 两位数码管串影,数字叠在一起

现象:个位和十位同时隐隐发亮,或者上一位的笔画残留在下一位上,看起来像两个数字糊成一团。

原因:换位选的时候没有消隐。段码还留在 PA 口上,位选一换,新的一位立刻用旧段码点亮,人眼就把两帧叠起来了。

解决:每次切换位选之前先往 PA 写 00H 把段码清掉,再改 PB 的位选,最后送新段码。多这两条OUT指令,视觉上就干净了。刷新间隔也要调,太慢会闪,太快亮度不够,DELAY1的循环次数在这两个极端之间取中间值。

5.5 上电第一次读数是 0,过几秒才开始跳

现象:程序刚跑起来,数码管一直显示 0,等两三秒之后才开始正常计数。

原因:通道 2 的初值写的是 0,芯片按 65536 装载,计数器从 65536 往下减,低 8 位一开始就是 0,要减到 255 以下BL才有变化。另外 GATE2 如果上电时是高电平,计数器已经在跑了,程序读到的第一个值不是从零开始的。

解决:上电初始化时先把 GATE2 拉低(拨码开关拨下)复位计数器,再拉高开始计时;显示逻辑里加一个判断,TIME为 0 时显示 0 属于正常,不要当成故障去改代码。要更精确的起停,就把 GATE 控制挪到程序里,用一个 8255 输出脚去驱动,别全靠手拨。

6. 二次开发:把它改成能量距离、能报警的测速台

原版程序是个“秒表 + 两位显示”,距离是固定的、单位是秒、没有任何判断逻辑。真要往智慧交通那个方向靠,改造点其实很集中:时间到速度的换算、量程切换、以及把结果送出去。下面三块是我在一个课程设计里实际加过的,代码量不大,但能让这套东西从“演示”变成“能用”。

6.1 用定点除法把秒换成速度

设测速段长度 100cm,时间 TIME 秒,速度 v = 100 / TIME cm/s。汇编里直接做小数除法麻烦,惯用做法是先放大再除:算 1000 / TIME,结果单位是 0.1cm/s,显示时把小数点补回去。除数要判零,车还没到的时候 TIME 是 0,不判就会除零溢出。

; 距离固定 100cm,速度 v = 100 / TIME cm/s ; 放大 10 倍:AX = 1000 / TIME,结果单位 0.1 cm/s MOV AX, 1000 MOV BL, TIME CMP BL, 0 JE NO_CAR ; 时间为 0,说明还没有车经过,跳过 MOV AH, 0 DIV BL ; AL = 1000 / TIME MOV SPEED, AL ; 存速度值,后续显示或比较 ; 限速判断:假设阈值 50(即 5.0 cm/s),超了点亮一个 LED CMP AL, 50 JBE NORMAL MOV DX, L8255_C MOV AL, 00000010B ; PC1 输出高电平驱动报警灯 OUT DX, AL NORMAL:

参数改动点就三处:1000是放大倍数,跟着显示精度走;100是测速段长度,换成 50cm 就把被除数改成 500;50是限速阈值,和SPEED同一个单位。放大倍数越大精度越高,但 16 位除法要求被除数不能超过 65535,1000 倍已经够两位小数了,再大就得换 32 位运算。

6.2 量程切换与串口上报

量程切换最简单的做法是把分频链拆成可变的:通道 0 的初值由拨码开关 PC1 选择,拨低时 1000 分频(1Hz,量程 0~99 秒),拨高时 100 分频(10Hz,量程 0~9.9 秒),后者适合测快速通过的小车。程序里在初始化之前读一次 PC1,按值把两个初值分别写进通道 0 和通道 1,后面的显示逻辑用同一个变量做缩放。

档位通道 0、1 分频比计时脉冲显示单位适用场景
慢档1000 × 10001Hz秒手推车、步行速度
快档1000 × 10010Hz0.1 秒电动模型车

串口上报这块,实验箱一般板载了可用的串行接口,把SPEED转成 ASCII 后按帧发出去,帧格式自己定个简单的头部加数据加校验就行。上位机那边用任意串口助手接收,存成 CSV 就能画速度曲线。这一层加上去,整套东西才勉强算摸到 IoT 的边——数据采集在底层用 8254 做,传输用串口,展示在上位机,三层各管各的,哪一层出问题都好定位。

6.3 验证方法:先对拍,再看线性

改完之后别急着相信读数。最省事的验证是拿信号发生器直接给 CLK2 送已知频率的方波,绕过前两级分频,看显示值是否等于“时间 × 频率”。比如送 10Hz,跑 5 秒应该读到 50,读到 49 或 51 属于正常的门控误差,读到 5 或者 500 就是分频比或者取补运算写错了。

第二步验线性:让小车模型以不同速度通过同一段距离,记录显示值,和秒表手动测的时间对比,画一条散点图,看斜率是不是接近 1。如果高速段明显偏小,多半是门控关闭的那一瞬间计数器还在跑,读到的值比实际多,得在停止后加几十微秒延时再锁存。这套对拍流程我后来每次改计时相关的代码都走一遍,比盯着数码管猜快得多,也从那以后养成了先冻结再读、改完必对拍的习惯。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询