焦作建设银行门户网站网站建设需要什么能力
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:37
当前位置: 首页 > news >正文
焦作建设银行门户网站,网站建设需要什么能力,开发一个小程序游戏要多少钱,app开发公司图片定时器定时器介绍晶振晶体震荡器#xff0c;又称数字电路的“心脏”#xff0c;是各种电子产品里面必不可少的频率元器件。数字电路的所有工作都离不开时钟#xff0c;晶振的好坏、晶振电路设计的好坏#xff0c;会影响到整个系统的稳定性。时钟周期时钟周期也称为振荡周期…定时器定时器介绍晶振晶体震荡器又称数字电路的“心脏”是各种电子产品里面必不可少的频率元器件。数字电路的所有工作都离不开时钟晶振的好坏、晶振电路设计的好坏会影响到整个系统的稳定性。时钟周期时钟周期也称为振荡周期定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单 位。在一个时钟周期内CPU仅完成一个最基本的动作。时钟周期是一个时间的量。更小的时钟周 期就意味着更高的工作频率。机械周期机器周期也称为CPU周期。在计算机中为了便于管理常把一条指令的执行过程划分为若干个阶 段如取指、译码、执行等每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为 机器周期。一般情况下一个机器周期由若干个时钟周期组成。每经过一个机械周期经过多长时间以晶振频率11.0592MHZ为例时钟周期为晶振的倒数即1/1105920000秒。如果是12T模式机械周期 12 X 时钟周期即12/11059200000秒 1.085微秒如果是6T模式机械周期 6 X 时钟周期即6/11059200000秒 0.5425微秒定时器和计数器的区别51单片机中的定时器和计数器使用同一个硬件电路通过修改寄存器的配置来将该硬件电路变成定时器或者计数器。 当配置成定时器时每经过一个机械周期计数存储器的值加1C51有两个定时器T0和T1。 当配置成计数器时每来一个负跳变信号高电平跳到低电平计数存储器的值加1。定时器相关寄存器定时器计时寄存器TH和TL寄存器当定时器的TH寄存器和TL寄存器都用起来即一共有16位那么该定时器最多数2^16 65536下即大概655361.085微秒 71毫秒也就是说定时器T0或者定时器T1最多定时71毫秒。 例如现在需要使用定时器0定时10毫秒怎么配置寄存器TH0和TL0只需要配置TH0 0xDC , TL0 0x00。定时器控制寄存器TCON寄存器以定时器0和外部中断0为例TF标志位当定时器0爆表后即定时结束后TF标志位TF0会置1TF0 1此时会向CPU请求中断如果中断条件允许的话就执行外部中断0执行完中断后TF0会硬件置0TF 0当我们不想它执行中断就可以软件置0即手动将TF0置0TF 0。TR标志位当TR0 1 时定时器0才1会允许计数即开始计时当TR0 0时不允许定时器0进行计数。IE标志位当IE0 1时会向CPU请求外部中断0当CPU响应外部中断0后会将IE0硬件置零IE0 0。IT标志位当IT0 1时低电平触发外部中断0当IT0 0时下降沿触发外部中断0。定时器模式寄存器TMOD寄存器以定时器0为例GATE标志位一般为0GATE 0时当TR0 0时定时器0开始计数。C/T标志位一般为0C/T为0时让定时器0作为定时器M1、M0标志位一般为0、116位定时器TL0和TH0两个寄存器都使用。通过定时器0让蜂鸣器叫一秒不叫一秒定时器0爆表后不执行中断 #includereg52.hsbit buzzer P1^2;voidmain(){int cnt 0;buzzer 1;TMOD 0x01; //设置定时器0为16为计时模式//设置定时器0定时时间为10msTH0 0xDC;TL0 0x00;TR0 1; //定时器0开始计时TF0 0; //外部中断0标志位置0不进行定时器0产生的中断while(1){//当定时器0爆表时if(TF0 1){ TF0 0; //外部中断0标志位置0不进行定时器0产生的中断cnt;TH0 0xDC;TL0 0x00;if(cnt 100){cnt 0;buzzer !buzzer;}}} }超声波HC-SR04测距超声波时序图发送超声波当Trig引脚接收到一个10微秒以上的高电平后开始发送超声波当开始发送超声波后Echo引脚会从低电平跳转到高电平。接收超声波当发出去的超声波返回来并被接收后Echo引脚会从高电平跳转到低电平。超声波从发出到被接收的时间Echo持续高电平的时间当超声波发出去的瞬间启动定时器超声波被接收的瞬间停止定时器查看中间经过的时间。测距距离 声音速度340m/s 时间 / 2除以2是因为超声波经过了两倍距离。超声波测距距离小于10cm时蜂鸣器叫距离大于10cm时蜂鸣器不叫#include reg52.h #include intrins.hsbit buzzer P1^4; sbit Trig P1^2; sbit Echo P1^3;void Delay15us() //11.0592MHz {unsigned char i;i 4;while (–i); }void timer1Init() { TMOD 0x10;TH1 0x00;TL1 0x00;TF1 0; }void ultrasonicStart() {Trig 0;Trig 1;Delay15us();Trig 0; }void main() {double time 0;double distance 0;timer1Init();while(1){ultrasonicStart();while(Echo 0); //当Echo引脚从低电平跳到高电平时开启定时器1TR1 1;while(Echo 1); //当Echo引脚从高电平跳到低电平时关闭定时器1TR1 0;time (TH1*256 TL1) * 1.085; //微秒/定时器16位全用时:高八位TH寄存器每加次1计数存储器的值就加256;低八位TL寄存器每次加1计数存储器的值就加1;计数存储器的值每次加1时就经过了一个机械周期(经过时间1.085微秒)/distance time * 0.017; //CMif(distance 10){buzzer 0;}else{buzzer 1;}//定时器1清0TH1 0x00;TL1 0x00;}}LCD1602LCD1602介绍LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏LCD、控制驱动主电路HD44780及其扩展驱动电路HD44100以及少量电阻、电容元件和结构件等装配在PCB板上而组成。字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD常用16×116×220×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。LCD1602引脚第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱接地时对比度最高对比度 过高时会产生“鬼影”使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚RS 为寄存器选择高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚R/W 为读写信号线高电平时进行读操作低电平时进行写操作。当 RS 和 R/W 共 同为低电平时可以写入指令或者显示地址当 RS 为低电平 R/W 为高电平时可以读忙信号 当 RS 为高电平 R/W 为低电平时可以写入数据。 第 6 脚E 端为使能端当 E 端由高电平跳变成低电平时液晶模块执行命令。 第 714 脚D0D7 为 8 位双向数据线。 第 15 脚背光源正极。 第 16 脚背光源负极。LCD1602显示字符写时序图和读时序图读时序图 写时序图时序图的参数 根据读时序图封装读取LCD1602的数据函数检测忙信号检测忙标志是否忙液晶显示模块是一个慢显示器件所以在写入每条指令或数据之前一定要确认模块的忙标志为低电平表示不忙否则此指令失效。由于BF标志位为数据线的D7引脚我们只关心D7引脚而且BF标志位为高电平时LCD1602表示忙可以利用一个while(BF)循环卡住然后不断读取数据线的D7引脚等待LCD1602不忙时硬件将BF标志位置0。根据写时序图封装LCD1602写入指令和写入数据的两个函数写入指令地址写入数据地址LCD1602初始化8bit的LCD1602初始化 延时 15ms 写指令 38H(不检测忙信号) 延时 5ms 检测忙信号 写指令 38H显示模式设置 写指令 08H显示关闭 写指令 01H显示清屏 写指令 06H显示光标移动设置 写指令 0CH显示开及光标设置4bit的LCD1602初始化延时 50ms发送 0x03(4bit)(rs0,rw0)延时 4.5ms发送 0x03(4bit)(rs0,rw0)延时 4.5ms发送 0x03(4bit)(rs0,rw0)延时 150μs发送 0x02(4bit)(rs0,rw0)写指令 28H(8bit)写指令 0CH(8bit)写指令 01H(8bit)延时 2ms(8bit)写指令 06H(8bit) 在哪里显示写入指令地址LCD1602 内部显示地址由于写入指令或数据的时候数据线D7恒定为高电平即如果想要在0x40显示字符则实际写入的地址为0x40 0x80。显示什么字符写入数据LCD1602 模块字库表由于字符A的ASCII码为65即0100 0001与LCD1602 模块字库表一致因此在写入字符的时候直接传入一个A即可。 LCD1602显示一个字符#includereg52.h#includeintrins.h#define dataBuf P0sbit RS P1^0; sbit RW P1^1; sbit EN P1^4;voidDelay5ms() //11.0592MHz{unsignedchar i, j;i 9;j 244;do{while (–j);} while (–i); }voidDelay15ms() //11.0592MHz{unsignedchar i, j;i 27;j 226;do{while (–j);} while (–i); }//检测忙信号读数据线的D7位voidcheckBusySignal(){char tmp 0x80;dataBuf 0x80;while(tmp 0x80){ //当忙标志位(数据位D7)为高电平时此时模块不能接收命令或者数据//根据读时序图读LCD1602的数据RS 0;RW 1;EN 0;nop();EN 1;nop();nop();tmp dataBuf; //读八位数据线的数据当不忙时硬件会自动将该位置0当检测到D7为低电平时将退出死循环EN 0;nop();} }//写指令voidwriteCmd(char cmd){checkBusySignal();RS 0; //选择写指令寄存器RW 0;EN 0;nop(); //该函数为延时函数延时一微秒dataBuf cmd; //将指令存入八位数据线中EN 1;nop();nop();EN 0;nop(); }//写数据voidwriteData(char myData){checkBusySignal();RS 1; //选择写数据寄存器RW 0;EN 0;nop(); //该函数为延时函数延时一微秒dataBuf myData; //将数据存入八位数据线中EN 1;nop();nop();EN 0;nop(); }//LCD1602初始化voidlcd1602Init(){Delay15ms(); //延时 15mswriteCmd(0x38); //写指令 38H(不检测忙信号) Delay5ms(); //延时 5mscheckBusySignal();//以后每次写指令读/写数据操作均需要检测忙信号writeCmd(0x38); //写指令 38H显示模式设置writeCmd(0x08); //写指令 08H显示关闭writeCmd(0x01); //写指令 01H显示清屏writeCmd(0x06); //写指令 06H显示光标移动设置writeCmd(0x0C); //写指令 0CH显示开及光标设置 }voidmain(){char displayAddress 0x80 0x05; char dsiplayData J; lcd1602Init();writeCmd(displayAddress); //字符显示的地址writeData(dsiplayData); //显示的字符 } LCD1602显示一行字符#includereg52.h#includeintrins.h#define dataBuf P0sbit RS P1^0; sbit RW P1^1; sbit EN P1^4;voidDelay5ms() //11.0592MHz{unsignedchar i, j;i 9;j 244;do{while (–j);} while (–i); }voidDelay15ms() //11.0592MHz{unsignedchar i, j;i 27;j 226;do{while (–j);} while (–i); }//检测忙信号读数据线的D7位voidcheckBusySignal(){char tmp 0x80;dataBuf 0x80;while(tmp 0x80){ //当忙标志位(数据位D7)为高电平时此时模块不能接收命令或者数据RS 0;RW 1;EN 0;nop();EN 1;nop();nop();tmp dataBuf; //读八位数据线的数据当不忙时硬件会自动将该位置0当检测到D7为低电平时将退出死循环EN 0;nop();} }//写指令voidwriteCmd(char cmd){checkBusySignal();RS 0; //选择写指令寄存器RW 0;EN 0;nop(); //该函数为延时函数延时一微秒dataBuf cmd; //将指令存入八位数据线中EN 1;nop();nop();EN 0;nop(); }//写数据voidwriteData(char myData){checkBusySignal();RS 1; //选择写数据寄存器RW 0;EN 0;nop(); //该函数为延时函数延时一微秒dataBuf myData; //将数据存入八位数据线中EN 1;nop();nop();EN 0;nop(); }//LCD1602初始化voidlcd1602Init(){Delay15ms(); //延时 15mswriteCmd(0x38); //写指令 38H(不检测忙信号) Delay5ms(); //延时 5mscheckBusySignal();//以后每次写指令读/写数据操作均需要检测忙信号writeCmd(0x38); //写指令 38H显示模式设置writeCmd(0x08); //写指令 08H显示关闭writeCmd(0x01); //写指令 01H显示清屏writeCmd(0x06); //写指令 06H显示光标移动设置writeCmd(0x0C); //写指令 0CH显示开及光标设置 }//LCD1602显示一行字符voidlcd1602ShowData(char rows,char columns,char *str){switch (rows){ //选择行case1:writeCmd(0x80 columns-1); //选择列while(*str ! \0){writeData(*str); //显示字符str;}break;case2:writeCmd(0x80 0x40 columns-1); //选择列while(*str ! \0){writeData(str); //显示字符str;}break;default:break;} }voidmain(){lcd1602Init();lcd1602ShowData(1,1,jiangxiaoya);lcd1602ShowData(2,1,hao zi ge); }喝水提醒器思路利用HC-08超声波模块测距获取水杯是否被放下或者拿起当水杯被放下时间超过设定喝水时间就会利用蜂鸣器狗叫发出响声提醒喝水LCD1602会显示距离上一次喝水过去的时间。main.c单文件开发项目工程main.c文件编写#include reg52.h #include intrins.h #include stdio.h #include string.h/ LCD1602 / #define dataBuf P0sbit EN P3 ^ 4; sbit RS P3 ^ 5; sbit RW P3 ^ 6;/ 蜂鸣器 / sbit buzzer P2 ^ 3;/ 超声波 / sbit Trig P1 ^ 1; sbit Echo P1 ^ 2;/ 延时相关函数 / void Delay10us() //11.0592MHz {unsigned char i;i 2;while (–i); }void Delay5ms() //11.0592MHz {unsigned char i, j;i 9;j 244;do{while (–j);} while (–i); }void Delay15ms() //11.0592MHz {unsigned char i, j;i 27;j 226;do{while (–j);} while (–i); }/ 定时器相关函数 / / 定时器1初始化 / void timer1Init() {// 设置定时器1为16位计时模式TMOD 0x0F;TMOD | 0x10;TH1 0x00;TL1 0x00;TF1 0; // 定时器1计数溢出不产生中断 }/ 定时器0初始化 / void timer0Init() {// 设置定时器0为16位计时模式TMOD 0xF0;TMOD | 0x01;/ 定时10ms /TH0 0xDC;TL0 0x00;TF0 0; // 定时器0计数溢出不产生中断 }/ 超声波相关函数 / void ultrasonicStart() {Trig 0;Trig 1;Delay10us();Trig 0; }/ 获取超声波测距距离 */ double getDistance() {double time 0;// 定时器1清0TH1 0x00;TL1 0x00;ultrasonicStart();while (Echo 0); // 当Echo引脚从低电平跳到高电平时开启定时器1TR1 1;while (Echo 1); // 当Echo引脚从高电平跳到低电平时关闭定时器1TR1 0;time (TH1 * 256 TL1) * 1.085; // 微秒return (time * 0.017); }/* LCD1602相关函数 */ // 检测忙信号读数据线的D7位 void checkBusySignal() {char tmp 0x80;dataBuf 0x80;while (tmp 0x80){ // 当忙标志位(数据位D7)为高电平时此时模块不能接收命令或者数据RS 0;RW 1;EN 0;nop();EN 1;nop();nop();tmp dataBuf; // 读八位数据线的数据当不忙时硬件会自动将该位置0当检测到D7为低电平时将退出死循环EN 0;nop();} }// 写指令 void writeCmd(char cmd) {checkBusySignal();RS 0; // 选择写指令寄存器RW 0;EN 0;nop(); // 该函数为延时函数延时一微秒dataBuf cmd; // 将指令存入八位数据线中EN 1;nop();nop();EN 0;nop(); }// 写数据 void writeData(char myData) {checkBusySignal();RS 1; // 选择写数据寄存器RW 0;EN 0;nop(); // 该函数为延时函数延时一微秒dataBuf myData; // 将数据存入八位数据线中EN 1;nop();nop();EN 0;nop(); }// LCD1602初始化 void lcd1602Init() {Delay15ms(); // 延时 15mswriteCmd(0x38); // 写指令 38H(不检测忙信号)Delay5ms(); // 延时 5mscheckBusySignal(); // 以后每次写指令读/写数据操作均需要检测忙信号writeCmd(0x38); // 写指令 38H显示模式设置writeCmd(0x08); // 写指令 08H显示关闭writeCmd(0x01); // 写指令 01H显示清屏writeCmd(0x06); // 写指令 06H显示光标移动设置writeCmd(0x0C); // 写指令 0CH显示开及光标设置 }// LCD1602显示一行字符 void lcd1602ShowData(char rows, char columns, char *str) {switch (rows){ // 选择行case 1:writeCmd(0x80 columns - 1); // 选择列while (*str ! \0){writeData(*str); // 显示字符str;}break;case 2:writeCmd(0x80 0x40 columns - 1); // 选择列while (*str ! \0){writeData(*str); // 显示字符str;}break;default:break;} }void main() {unsigned int time 100 * 3; /* 喝水提醒时间100*3为3秒 /unsigned int cnt 0;char strbuf[16] {0};lcd1602Init();timer0Init();timer1Init();sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(1, 1, zhao yi hao);lcd1602ShowData(2, 1, strbuf);while (1){/ 放下水杯 /if (getDistance() 10) {TR0 1; / 定时器0开始计时 // 定时器0溢出 /if (TF0 1) {TF0 0; / 定时器0中断标志位置0不产生中断 /cnt;TH0 0xDC;TL0 0x00;/ 显示距离上一次喝水的时间 /if (cnt / 100 9) {sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(2, 1, strbuf);}else{sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(2, 1, strbuf);}/ 如果超过设定的喝水时间提醒喝水 /if (cnt time){buzzer 0;}else{buzzer 1;}}}/ 拿起水杯 /else{cnt 0; / 喝水时间清0 */}} }模块化开发项目工程main.c文件编写void main() {unsigned int time 100 * 3; /* 喝水提醒时间100*3为3秒 /unsigned int cnt 0;char strbuf[16] {0};lcd1602Init();timer0Init();timer1Init();sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(1, 1, zhao yi hao);lcd1602ShowData(2, 1, strbuf);while (1){/ 放下水杯 /if (getDistance() 10) {TR0 1; / 定时器0开始计时 // 定时器0溢出 /if (TF0 1) {TF0 0; / 定时器0中断标志位置0不产生中断 /cnt;TH0 0xDC;TL0 0x00;/ 显示距离上一次喝水的时间 /if (cnt / 100 9) {sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(2, 1, strbuf);}else{sprintf(strbuf, Drink Time: %d S, cnt / 100);lcd1602ShowData(2, 1, strbuf);}/ 如果超过设定的喝水时间提醒喝水 /if (cnt time){buzzer 0;}else{buzzer 1;}}}/ 拿起水杯 /else{cnt 0; / 喝水时间清0 /}} }delay.c文件编写void Delay10us() //11.0592MHz {unsigned char i;i 2;while (–i); }void Delay5ms() //11.0592MHz {unsigned char i, j;i 9;j 244;do{while (–j);} while (–i); }void Delay15ms() //11.0592MHz {unsigned char i, j;i 27;j 226;do{while (–j);} while (–i); }delay.h文件编写void Delay10us();void Delay5ms();void Delay15ms();timer.c文件编写#include reg52.h #include intrins.h/ 定时器1初始化 / void timer1Init() {// 设置定时器1为16位计时模式TMOD 0x0F;TMOD | 0x10;TH1 0x00;TL1 0x00;TF1 0; // 定时器1计数溢出不产生中断 }/ 定时器0初始化 / void timer0Init() {// 设置定时器0为16位计时模式TMOD 0xF0;TMOD | 0x01;/ 定时10ms */TH0 0xDC;TL0 0x00;TF0 0; // 定时器0计数溢出不产生中断 }timer.h文件编写void timer0Init();void timer1Init();lcd1602.c文件编写#include reg52.h #include intrins.h #include delay.h#define dataBuf P0sbit EN P3^4; sbit RS P3^5; sbit RW P3^6;// 检测忙信号读数据线的D7位 void checkBusySignal() {char tmp 0x80;dataBuf 0x80;while (tmp 0x80){ // 当忙标志位(数据位D7)为高电平时此时模块不能接收命令或者数据RS 0;RW 1;EN 0;nop();EN 1;nop();nop();tmp dataBuf; // 读八位数据线的数据当不忙时硬件会自动将该位置0当检测到D7为低电平时将退出死循环EN 0;nop();} }// 写指令 void writeCmd(char cmd) {checkBusySignal();RS 0; // 选择写指令寄存器RW 0;EN 0;nop(); // 该函数为延时函数延时一微秒dataBuf cmd; // 将指令存入八位数据线中EN 1;nop();nop();EN 0;nop(); }// 写数据 void writeData(char myData) {checkBusySignal();RS 1; // 选择写数据寄存器RW 0;EN 0;nop(); // 该函数为延时函数延时一微秒dataBuf myData; // 将数据存入八位数据线中EN 1;nop();nop();EN 0;nop(); }// LCD1602初始化 void lcd1602Init() {Delay15ms(); // 延时 15mswriteCmd(0x38); // 写指令 38H(不检测忙信号)Delay5ms(); // 延时 5mscheckBusySignal(); // 以后每次写指令读/写数据操作均需要检测忙信号writeCmd(0x38); // 写指令 38H显示模式设置writeCmd(0x08); // 写指令 08H显示关闭writeCmd(0x01); // 写指令 01H显示清屏writeCmd(0x06); // 写指令 06H显示光标移动设置writeCmd(0x0C); // 写指令 0CH显示开及光标设置 }// LCD1602显示一行字符 void lcd1602ShowData(char rows, char columns, char *str) {switch (rows){ // 选择行case 1:writeCmd(0x80 columns - 1); // 选择列while (*str ! \0){writeData(*str); // 显示字符str;}break;case 2:writeCmd(0x80 0x40 columns - 1); // 选择列while (*str ! \0){writeData(*str); // 显示字符str;}break;default:break;} }lcd1602.h文件编写void checkBusySignal();void writeCmd(char cmd);void writeData(char myData);void lcd1602Init();void lcd1602ShowData(char rows,char columns,char str);ultrasonic.c文件编写#include reg52.h #include intrins.h #include delay.hsbit Trig P1^1; sbit Echo P1^2;void ultrasonicStart() {Trig 0;Trig 1;Delay10us();Trig 0; }/ 获取超声波测距距离 */ double getDistance() {double time 0;// 定时器1清0TH1 0x00;TL1 0x00;ultrasonicStart();while (Echo 0); // 当Echo引脚从低电平跳到高电平时开启定时器1TR1 1;while (Echo 1); // 当Echo引脚从高电平跳到低电平时关闭定时器1TR1 0;time (TH1 * 256 TL1) * 1.085; // 微秒return (time * 0.017); }ultrasonic.h文件编写void timer1Init();void ultrasonicStart();double getDistance();
- 上一篇: 椒江网站制作橱柜手机网站模板
- 下一篇: 焦作市住房和城乡建设局网站建设部资质查询网站
相关文章
-
椒江网站制作橱柜手机网站模板
椒江网站制作橱柜手机网站模板
- 技术栈
- 2026年03月21日
-
椒江区建设局网站wordpress 列表页
椒江区建设局网站wordpress 列表页
- 技术栈
- 2026年03月21日
-
椒江建设局网站建一个网站一般要多少钱
椒江建设局网站建一个网站一般要多少钱
- 技术栈
- 2026年03月21日
-
焦作市住房和城乡建设局网站建设部资质查询网站
焦作市住房和城乡建设局网站建设部资质查询网站
- 技术栈
- 2026年03月21日
-
焦作网站建设服务google网站登陆模板
焦作网站建设服务google网站登陆模板
- 技术栈
- 2026年03月21日
-
焦作网站建设兼职哪些软件可以制作视频
焦作网站建设兼职哪些软件可以制作视频
- 技术栈
- 2026年03月21日
