怎么使单片机脉冲发生器发出脉冲

单片机发脉冲可以这样吗?_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:131,736贴子:
单片机发脉冲可以这样吗?收藏
程序如下:int main(){
int a=5000;
while(a——)
}想要发的脉冲数量 改a的值即可
上海虚谷科技承接各种上海单片机开发和上海单片机开发项目联系电话: 郭先生
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或您现在所在的是:
单片机论坛
→ 浏览主题:
* 帖子主题:
文章数:2348
年度积分:502
历史总积分:7094
注册时间:
西门子PLC体验(二)
f = 6n/B
n &电机转速
B &步距角
f &频率
用定时中断来置位或复位IO口输出一个脉冲,每中断两次输出一个脉冲
T_APR = T_BASE/2f
T_APR 定时器重载值
T_BASE 定时器时基
如51单片机的定时器重载值:
TAPR = 65536-T_APR
do{
& & &REC_TL = TxL;
& & &REC_TH = TxH;
& & TAPR = 65536-T_APR+TxL+TxH*256;
& &}while(REC_TL!=TxL)
TxL = TAPR%256;
TxH = TAPR/256;
文章数:2348
年度积分:502
历史总积分:7094
注册时间:
西门子PLC体验(二)
如果用单片机直接控制步进电机,需在程序中做出步进电机旋转时IO状态做成表格,计算定时器重载值的方法同上(不用除2了),在中断中做一个环形计数器,每次中断时将查表得出的值直接输出到IO口。
文章数:136
年度积分:50
历史总积分:835
注册时间:
xlian的程序还有点象那么回事,楼主说的应该是用现成驱动器的情况,就是脉冲加方向,所以不需要轮番的对IO口输出,3楼的就没任何实用价值,除了误导人,估计是教材看多了,楼主没看到是福气。51做这个控制定时器输出脉冲是唯一的选择,什么DJNZ啊FOR之类的就不要来了,如果需要进行加速度的处理最好是查表,因为51能力实在有限,发脉冲的间隙根本来不及复杂的计算,做在程序里或预先计算好都可以
sankyo_feng
文章数:600
年度积分:73
历史总积分:2761
注册时间:
#include &reg51.h& & &
sbit P10 = P1^0;
void main(void)
TMOD=0x01;
ET0=1; & &
while(1) &
}
}
timer0() interrupt 1
P10=~P10; }
是不是我写成这样你们才觉得爽呢?
sankyo_feng
文章数:600
年度积分:73
历史总积分:2761
注册时间:
这个不知道他看不看的懂
文章数:88
年度积分:50
历史总积分:722
注册时间:
我 是看不懂啊,郁闷。。。。。
文章数:1048
年度积分:50
历史总积分:6134
注册时间:
看你选择哪种控制方法,脉冲+方向还是双脉冲控制,再考虑怎末产生脉冲
yangyong5105
文章数:17
年度积分:50
历史总积分:717
注册时间:
yangyong5105
文章数:17
年度积分:50
历史总积分:717
注册时间:
谢谢,以上各位同仁的指点,方法我已知道了,只是还没有时间去试,这段时间再做一些低层的函数,已经大功告成,包括一些12864的全部底层函数,什么画图啊,画直线之类的,还有就是一些定时器,与PLC完全一样,想要多少定时器就有多少定时器,除了没有像PLC的编程软件,其它的基本一模一样,包括发脉冲
文章数:12
年度积分:53
历史总积分:1033
注册时间:
回复 #18楼 yangyong5105
用这款RSI12864***这款液晶屏 UART 串口与单片机直接通信,就可以控制显示屏,占用口线少。
型号:RSI12864B***-00
显示模式:STN 蓝模负显
分 辨 率:128*64 Dots
VA &尺寸:72.0mm*40.0mm
工作电压:5.0V
接 & &口:RS232 or UART(TTL:5.0V)
◆基本特性◆
显示模式: STN 蓝模负显
VA &尺寸: 72.0mm*40.0mm
分 辨 率: 128*64 Dots
显示视角: 6:00
图片存储: 内建FLASH Memory,用于存储界面图片
2D &绘图: 支持2D(点、线、圆、矩形)图形绘制
字 & &库: 支持多国语言字库(如ASCII、中、日、韩……)
背光亮度: 支持软件可调
对 比 度: 支持软件可调
键 & &盘: 支持4*8键盘扫描功能,直接将键值发送给控制端
ID &识别: 支持ID识别功能,可实现一机多控
工作温度: -20~70℃
存储温度: -30~80℃
工作电压: 5.0V
通信接口: RS232 or UART(TTL:5.0V)
工控学堂推荐视频:查看: 5479|回复: 14
怎样让定时器输出一定数量的脉冲
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
如题,如何让定时器输出一定数量的PWM呢,我要用它来做工作前监测。
看看这个:/posts/list/41832.htm
主题帖子精华
金钱103674
在线时间628 小时
看看这个:
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
我是个40岁的初学者,这阶段比较清闲才学单片机,而选择正点原子也是因为店主说按我目前的水平学STM32有点难(目前说实话的人越来越少了),但看了楼主的标题感觉更难了~~~&用定时器中断就可以了吧而且还要看你的具体要求啊。这个不难吧~~
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
我用回复【3楼】 正点原子 :
---------------------------------
我用这个里面的002 &以给定频率f、输出n个脉冲,进行软件仿真,根本实现不了输出n个脉冲停止的效果啊
脉冲仍然连续输出,中间无中断和停止迹象,怎么回事
9e2bfa610d0f4e.jpg (0 Bytes, 下载次数: 20)
22:54 上传
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
原子哥,帮看看啊,他这个原理是什么,看不太明白。
哪位有主从门控方式产生固定数量PWM的程序供参考一下,谢谢
主题帖子精华
金钱103674
在线时间628 小时
回复【5楼】laoguren1122:
---------------------------------
你可以去问问原作者。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
回复【6楼】正点原子:
---------------------------------
原子哥有采用主从定时器门控方式输出PWM的例程供参考一下么?
主题帖子精华
金钱103674
在线时间628 小时
回复【7楼】laoguren1122:
---------------------------------
我在论坛发过,你找找。不过好久以前写的代码了,具体细节得你自己去整理了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
我在网上查了很多资料,总结一下:输出一定数量PWM脉冲,
主要有几种方法:
1.单脉冲法,需要一个脉冲中断一次,中断次数多,影响效率,而且能保证每次的脉冲连续性么?
2.另一定时器进行中断计数,与1一样,需要频繁中断;
3.用主从定时器门控方式,还没完全搞清楚怎么用,比较繁琐,应该能满足大部分人的需要;
4.高级定时器T1、T8的重复计数方式,RCR计数中断,看手册好像这种方式最简单,能满足一部分人要求,缺点是寄存器只有8位,最多实现&&&&&255个脉冲计数输出,还没完全试出来,正在仿真。
个人拙见,请指点!
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
采用重复计数方式还是有问题,暂时搁置;
采用门控方式实现了
主题帖子精华
初级会员, 积分 57, 距离下一级还需 143 积分
在线时间6 小时
回复【9楼】laoguren1122:
---------------------------------
回复【9楼】laoguren1122:
---------------------------------
大神,能给共享一下,门控方式的历程吗
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间9 小时
TIM2,TIM1进行主从配置
void&TIM_PWM_Number_Init(u16&master_arr,&u16&master_psc,&u16&slave_arr,&u16&slave_psc)
GPIO_InitTypeDef&GPIO_InitS
TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS
TIM_OCInitTypeDef&&TIM_OCInitS&
NVIC_InitTypeDef&NVIC_InitS
&&&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器2的时钟
&&&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能定时器3的时钟
&&&
&&&//设置该引脚为复用输出功能,输出TIM3&CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9;&&//TIM_CH2
GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_AF_PP;&&&//复用推挽输出
GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&&GPIO_InitStructure);&&&//初始化GPIO
&&&
&&//TIM2工作在单脉冲下
&&&TIM_TimeBaseStructure.TIM_Period&=&master_//TIM2//重装值
&&&TIM_TimeBaseStructure.TIM_Prescaler&=&master_//7200;//预分频值,每100us计数一次
&&&TIM_TimeBaseStructure.TIM_ClockDivision&=&TIM_CKD_DIV1;//0;//TIM_CKD_DIV1;//没有时钟分割
&&&TIM_TimeBaseStructure.TIM_CounterMode&=&TIM_CounterMode_Up;//向上计数模式
&&&TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
&
&&&TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止
&&&TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
&&&TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref);
&&& TIM_ITConfig(&TIM2,&TIM_IT_Update,&ENABLE);&//&中断源,&TIM&触发中断源&使能
NVIC_InitStructure.NVIC_IRQChannel&=&TIM2_IRQn;&&//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&0;&&//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&3;&&//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;&//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);&&//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
&&TIM_OCInitStructure.TIM_OCMode&=&TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT&TIMx_CCR1时通道1为无效电平,否则为有效电平
&&TIM_OCInitStructure.TIM_OutputState&=&TIM_OutputState_E//OC1输出使能
&&TIM_OCInitStructure.TIM_OCPolarity&=&TIM_OCPolarity_H//有效电平为高
&&TIM_OCInitStructure.TIM_OCIdleState&=&TIM_OCIdleState_R
//&&TIM_OCInitStructure.TIM_Pulse&=&1;//比较捕获1的预装载值
&&TIM_OC1Init(TIM2,&TIM_OCInitStructure);&&
&&TIM_Cmd(TIM2,DISABLE);//先不使能能TIM2
&&//TIM1工作在从模式的门控模式下的PWM输出模式
&& TIM_TimeBaseStructure.TIM_Period&=&slave_&//TIM3设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler&=&slave_&//720;设置用来作为TIMx时钟频率除数的预分频值&
TIM_TimeBaseStructure.TIM_ClockDivision&=&TIM_CKD_DIV1;//0;&//TIM_CKD_DIV1;/设置时钟分割:TDTS&=&Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode&=&TIM_CounterMode_CenterAligned3;&&//TIM向上计数模式
// TIM_TimeBaseStructure.TIM_RepetitionCounter&=&10;
TIM_TimeBaseInit(TIM1,&&TIM_TimeBaseStructure);&
&&
&&TIM_SelectSlaveMode(TIM1,&TIM_SlaveMode_Gated);//TIM3为门控模式
&//&TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式
&&TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);//内部触发,从TIM2触发
//初始化TIM3&Channel2&nbspWM模式 &
TIM_OCInitStructure.TIM_OCMode&=&TIM_OCMode_PWM2;&//选择定时器模式:TIM脉冲宽度调制模式2
& TIM_OCInitStructure.TIM_OutputState&=&TIM_OutputState_E&//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity&=&TIM_OCPolarity_H&//输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_OCIdleState&=&TIM_OCIdleState_R
// TIM_OCInitStructure.TIM_Pulse&=&TIM3Compare1;//比较捕获1的预装载值
TIM_OC1Init(TIM1,&&TIM_OCInitStructure);&&//根据T指定的参数初始化外设TIM3&OC2
&&& TIM_OCInitStructure.TIM_OCMode&=&TIM_OCMode_PWM1;&//选择定时器模式:TIM脉冲宽度调制模式2
& TIM_OCInitStructure.TIM_OutputState&=&TIM_OutputState_E&//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity&=&TIM_OCPolarity_H//TIM_OCNPolarity_L&//输出极性:TIM输出比较极性高
// TIM_OCInitStructure.TIM_Pulse&=&TIM3Compare1;//比较捕获1的预装载值
& TIM_OC2Init(TIM1,&&TIM_OCInitStructure);&
&
&&&&TIM_CtrlPWMOutputs(TIM1,ENABLE);
&&&&TIM_Cmd(TIM1,ENABLE);//使能TIM3
void&TIM2_IRQHandler(void)&&&//TIM3中断
{
if&(TIM_GetITStatus(TIM2,&TIM_IT_Update)&!=&RESET)&//检查指定的TIM中断发生与否:TIM&中断源&
TIM_ClearITPendingBit(TIM2,&TIM_IT_Update&&);&&//清除TIMx的中断待处理位:TIM&中断源&
// LED1=!LED1;
&&&& TIM_ForcedOC1Config(TIM1,&TIM_ForcedAction_InActive);
TIM_ForcedOC2Config(TIM1,&TIM_ForcedAction_InActive);
main()
{
&//初始化TIM1,2使其固定数量脉冲输出
TIM_PWM_Number_Init(,71);
TIM_SetCompare1(TIM1,arr/2+400);
TIM_SetCompare2(TIM1,arr/2-400);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,&ENABLE);
TIM_SetCompare1(TIM2,10);
TIM_Cmd(TIM2,&ENABLE);
主题帖子精华
中级会员, 积分 244, 距离下一级还需 256 积分
在线时间4 小时
回复【4楼】laoguren1122:
---------------------------------
不好意思。
主程序中的注释错了。应该是以“frequency”的频率发出“&num”个脉冲
关于函数
void&MyTimer2_Startup(u16&num,u16&frequency)
第一个参数是“脉冲数目”
第二个参数是“脉冲频率(速度)”
可以修改后再编译、验证。
主题帖子精华
中级会员, 积分 233, 距离下一级还需 267 积分
在线时间20 小时
一时看不懂,慢慢看
主题帖子精华
初级会员, 积分 66, 距离下一级还需 134 积分
在线时间4 小时
还好学习一下。
Powered by温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
// & &step motor & 串口通信G代码//&#include&REG51.H&#include &string.h&#define uchar unsigned char#define uint unsigned int#define Gcode_LEN 10 &
//数据长度G01X12345$ &(10char)sbit Xpul = P0^0;
& &//axis X clksbit Xdir = P0^1;
//axis X CCWuint X & & &//ctsuint Y
//ctsuint Xsbit KEY4 = P3^2; & &bit rece_flag = 0;
//为1代表串口接收到了一帧数据 &uchar receive[Gcode_LEN]={0};
//暂存数组,可以将10改为需要的数值/**************************************************//* & & & & & & & 向串口发送字符 & & & & & & & & & *//**************************************************/void send_char_com(uchar c){ SBUF=c;
while(TI==0); TI=0;}/**************************************************//* & & & & & & & 向串口发送字符串 & & & & & & & & *//**************************************************/void send_string_com(uchar *s){ while(*s!='\0') {
send_char_com(*s);
s++; }}/**************************************************//* & & & & & & & & & &delay 50us & & & & & & & & &*//**************************************************/void delay_50us(int x) & & &//如 delay=0.05ms,f=20kHz{ & & int i,j; for(i=0;i&x;i++) & //延时x个0.05ms& for(j=1;j&=6;j++); //延时约0.05ms
}/**************************************************//* & & & & & & & & & &delay 1ms & & & & & & & & &*//**************************************************/void delay_1ms(int x)&{ & & int i,j; for(i=0;i&x;i++) &&& for(j=1;j&=120;j++);
}/**************************************************//* & & & & & & & & & Xposition & & & & & & & & & &*//**************************************************/void Xposition(void)& {
uint x1=receive[4]-'0';
uint x2=receive[5]-'0';
uint x3=receive[6]-'0';
uint x4=receive[7]-'0';
uint x5=receive[8]-'0';
Xmove=x1*10+x3*100+x4*10+x5*1; }/**************************************************//* & & & & & & &MAIN & & & & & & & & & & & & & & &*//**************************************************/void main(){
TMOD=0x20; & //串口初始化,//T1工作模式2& & &PCON=0x00;& & &SCON=0x50;
//串口模式1& & &TL1=0& & &TH1=0 &
//波特率9600& & &TR1=1;& & REN = 1; & & &//容许串行口接收数据& & SM0 = 0; & & &//设定串口工作方式1& & SM1 = 1; & & &//设定串口工作方式1(10位异步收发,波特率可变,且由定时器1的溢出率决定)& & EA = 1; & & & //开总中断& & ES = 1; & & & //开串口中断& & TR1 = 1; & & &//启动定时器1&while (1)& & {& & & & //若检测到rece_flag为1, 说明程序已经执行过串口中断服务程序, 即收到了数据.&& & & & if (rece_flag == 1)& & & & {& & & & & & ///手动将flag清0,方便标志位检测& & & & & & rece_flag = 0;&
Xposition();
for(Xcount=0; Xcount&X Xcount++)
Xdir=0; & & & & & & & &
delay_1ms(1000);
//times=1,delay0.05ms=20000Hz
send_string_com("ok");&
ES = 1; & & &
//重新开启串口中断& & & & }& & }}/**************************************************//* & & & & &缓存的数组采用移位寄存的方式 & & & & &*//**************************************************/void ser() interrupt 4{& & //RI为接收中断标志位, 在方式0时, 当串行接收第N位数据结束时, 或在其他方式, 串行接收停止位的& & //中间时, 由内部硬件使RI置1, 向CPU发出中断申请, 也必须在中断服务程序中, 用软件将其清0,取消& & //此中断申请, 以方便下一次中断申请检测, 即这样才能产生下一次中断.& & //这里RI清0, 因为程序既然产生了串口中断, 肯定是收到或发送了数据, 在开始时没有发送任何数据& & //那必然是收到了数据, 此时RI会被硬件置1, 所以进入串口中断服务程序后必须由软件清0, 这样才能& & //产生下一次中断.9个字符为例& && RI=0; && &&
for(rei=0;rei&Gcode_LEN;rei++) &&
{ && & & receive[rei]=receive[rei+1]; &&
receive[Gcode_LEN-1]=SBUF;
//每次数据进入最后一位,逐步移动&&
if(receive[0]=='G' && receive[9]=='$') &&
{ && & & rece_flag=1; && & & & ES = 0; & && & & & & & //检测到flag为1后,即串口中断发生,先将ES清0, 原因是接下来要发送数据, 若不关闭串口中断, 发送完数据后,& & & & & & //单片机同样会申请串口中断,再次进入中断服务程序,flag又为1,又再此发送数据,一直重复& & & & & & //因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据&
阅读(543)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'51 单片机接收命令发送脉冲',
blogAbstract:'//===========================================================// & &step motor & 串口通信G代码//&#include&REG51.H&#include &string.h&#define uchar unsigned char#define uint unsigned int#define Gcode_LEN 10 & \t\t\t//数据长度G01X12345$ &(10char)sbit Xpul = P0^0;\t\t\t & &//axis X clksbit Xdir = P0^1;',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 单片机脉冲计数c程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信