《17PWM机器人.docx》由会员分享,可在线阅读,更多相关《17PWM机器人.docx(23页珍藏版)》请在课桌文档上搜索。
1、一种具有17路可调PWM直流电机的串口遥控机器人技术领域本实用新型涉及一种具有17路PWM直流电机的串口遥控机器人,尤其是一种可以用串口 无线WiFl遥控的智能机器人。背景技术现有常规遥控机人按照无线电信号的遥控进行动作,也可以按照存储在寄存器里面的程 序动作,但是动作电机较少,一般只有4路PWM直流电机,且PWM方波的频率,占空比保持 固定,这对机器人的行动带来很大的不便。一种具有17路可调PWM直流电机的串口遥控机器 人是一种具有17路可调PWM频率、占空比的直流电机的机器人,操作者可以使用计算机串口 WIFI信号对它的17路直流电机进行遥控,它也可以按照其控制电路中的24C04铁电存储器
2、 里面的数据,读取ADC0832芯片采样的温度值,并通过串口 WTFI信号发送到操作者的电脑。实用新型内容为了解决常规遥控机器人动作电机较少,动作单一的缺点,一种具有17路可调PWM直流 电机的串口遥控机器人提供了一种具有17路可调PWM直流电机进行串口 WIFI信号遥控动作 的机器人。它可以按照电路中的24C04铁电存储器里面的数据,读取ADCO832芯片采样的温 度值,在单片机STCI2C5A60S2的控制下进行动作,也可以按照操作人员的计算机串口 WlFl 信号的遥控进行动作。由于它具有17路PWM直流电机,所以它可以进行行走,抬手,伸手等 多种动作。本实用新型解决其技术问题所采用的技术
3、方案是:一种具有17路可调PWM直流电机的串 口遥控机器人是一种可以被WIFl串口信号遥控的机器人,它的17路PWM方波的频率和占空 比都可以通过计算机WIFl串口信号进行调节。它依靠外壳下面装配的17路PWM直流电机在 操作人员的计算机串口 WIFl信号的遥控下进行转动,行走等各种动作。它可以在电机的转动 下进行移动,行走,抬手等等动作。同时,它也可以按照控制电路中的24C04铁电存储器(5) 里面的数据,在STC12C560S2单片机(4)的控制下进行电机的转动等动作,它可以将ADC0832 芯片(6)采样得到的温度值通过WIFl串口发送到计算机。它的控制电路如图1所示。在图 1 中,ST
4、CI2C5A60S2 单片机(4)的 Pl 中的 PL 2, PL 3, Pl. 4, Pl. 5, Pl. 6, PL 7 端口, P3 中的 P3.2, P3. 5, P3. 6 端口,P2 中的 P2.0, P2. 1, P2.2, P2. 3, P2.4, P2. 5, P2.6, P2. 7 端口在定时器TlMEO的控制下产生17路PWM方波,上面总共17路IO 口,每个IO 口产生一 路PWM信号,总共17路PWM控制方波信号。操作人员通过遥控计算机的WIFI串口发送数据 到STCI2C5A60S2单片机(4),就可以改变上述端口的PWM方波信号的频率、占空比等。同时 也可以得到A
5、DC0832芯片(6)采样得到的温度值。WIFI模块连接在单片机STC12C560S2 (4) 的串口上面,它接收操作人员发出的数据,然后单片机STCI2C5A60S2 (4)按照程序减少或增 加PWM方波的占空比,增加或减少频率。同时单片机(4)按照铁电存储器24C04 (5)中的 数据控制上面的PWM方波信号。操作人员通过USB串口 (1),经过芯片PL2303HX (3),给单 片机下载程序。5V开关电源(2)给单片机提供5V直流电。ULN2003D驱动芯片(7)使单片 机Pl, P2, P3端口的PWM信号稳定保持不变操作人员通过计算机串口发送十六进制数01,单片机(4)的PO. 0端
6、口就是高电平,同 时单片机将01发送给计算机,也将ADCO832芯片(6)采样得到的温度值发送给计算机。操 作人员通过计算机串口发送十六进制数02,单片机(4)的PO. 1端口就是高电平,同时单片 机将02发送给计算机,也将ADCo832芯片(6)采样得到的温度值发送给计算机。操作人员 通过计算机串口发送十六进制数04,单片机(4)的P0. 2端口就是高电平,同时单片机将04 发送给计算机,也将ADCo832芯片(6)采样得到的温度值发送给计算机。单片机的程序可以 在百度网盘hups:/DarLs14Ui9J TlWZ,OVJPuoOI-cw下载。单片机STCI2C5A60S2 (4)的控制程
7、序是在keill4编译环境下,通过C语言编译并通过 串口下载到单片机STCI2C5A60S2 (4)0程序代码如下:* 程 序思 路 说明:* 关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为IKHZ,这样定时中断次 数* 设定为C=IO,即0. OlMS中断一次,则THO=FF, TL0=F6;由于设定中断时间为0. 01ms, 这样可以设定占空比可从 ITOO 变化。即 0. 01ms*10O=ImS*/ttinclude #include #define uchar unsigned charinclude define OP_READ Oxal /器件地址以及读取操作def
8、ineOPJrRITE OxaO/器件地址以及写入操作#defineMAX _ADDR 0x7f/ AT24C02 最大地址* THO和TLO是计数器0的高8位和低8位计数器,计算办法:TLO= (65536-C)%256;* THO= (65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数 器* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长 时* 间为lms*65536=65.536ms*/#define V THO OXFF#define V_TLO 0XF6#define V TMOD 0X01#define V
9、 THl OXFF#define V_TL1 0XF6#define V JH2 OXFF#define V TL2 0XF6#define uint unsigned intdefine uchar unsigned char#define nop nop ()sbit adcs=P3*7;/P3.7 连接 DC0832 的 CS 使能端sbit adclk=P; PLO 连接 ADCO832 的时钟输入口Sbitaddin=P1;ADeO832的DO, Dl是分时工作的,所以这两个端口可以接在同一个 IO 口 Pl. 1uchar addata;bit y; 位数据,以0或I区倍两个通道的
10、输入和输出unsigned char code dis_code = 0x7e, Oxbd, Oxdb, 0xe7, Oxdb, Oxbd, 0x7e, Oxff;/写入到AT24C01的数据串sbit SDA = P34;sbit SCL = P33;void adread();void adstart ();void start ();void stop();unsigned char shin();bit shout(unsigned char write data);unsigned char readrandom(unsigned char random addr);void wri
11、tebyte( unsigned char addr, unsigned char write data);void fi11 byte(unsigned char fi11 data);void deIayms(unsigned char ms);void init_sys(void) ;*系统初始化函数*/void Delay5Ms(void);void delayl (unsigned char m);unsignedcharZKBl, ZKB2, ZKB3, ZKB4, ZKB5, ZKB6, ZKB7, ZKB8, ZKB9, ZKBlO, ZKBll, ZKB12, ZKB13,
12、ZKB14, ZKB15 ,ZKB16, ZKB17, ZKB18;unsignedcharZKB19, ZKB20, ZKB21, ZKB22, ZKB23, ZKB24, ZKB25, ZKB26, ZKB27, ZKB28, ZKB29, ZKB30, ZKB31, ZK B32; unsigned char key_s, key_v, tmp, tmpl; charcodestr = 0x7e, Oxbd, Oxdb, 0xe7, Oxdb, Oxbd, 0x7e, Oxff, 0x7e, Oxbd, Oxdb, 0xe7, Oxdb, Oxbd, 0x7 e, Oxff, 0x7e,
13、 Oxbd, Oxdb, 0xe7, Oxdb, Oxbd, 0x7e, Oxff;void send str();bit scan key();void proc key();void deIayms(unsigned char ms);void deIaymsl(unsigned char a);void send char(unsigned char txd);unsigned char i;unsigned char k, m; m为频率常数变量unsigned char s=0;unsigned char p;unsigned char p1=0x00,p2, p3, p4;本例采用
14、89C52,晶振为12MHZ关于如何编制音乐代码,其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;所以拿出谱子,试探编吧!/sbit Beep = P37;sbit Beepl = P36;sbit Beep2 = P35;/sbit Beep3 = P34;/ sbit Beep4 = P33;sbit Beep5 = P32;/sbit Beep6 = P31;/sbit Beep7 = P3 0;sbit Beep8 = Pl 7;sbit Beep9 = Pl 6;sbit BeeplO = Pl 5;sbit Beepll = Pl4;s
15、bit Beepl2 = P3;sbit Beep 13 = P2;/sbit Beepl4 = Pll;/sbit Beep15 = Pl 0;sbit Beepl6 = P27;sbit Beep17 = P2-6;sbit Beepl8 = P2-5;sbit Beep19 = P24;sbit Beep20 = P23;sbit Beep21 = P22;sbit Beep22 = P21;sbit Beep23 = P2P;unsigned char n=0; n为节拍常数变量歌曲为八月桂花香unsigned char code music_tab =0x18, 0x30, OxlC
16、 , 0x10, 格式为:频率常数,节拍常数,频率常数,节拍常数,0x20,0x40,OxlC,0x10,0x18,0x10,0x20,0x10,OxlC,0x10,0x18,0x40,OxlC,0x20,0x20,0x20,OxlC,0x20,0x18,0x20,0x20,0x80,OxFF,0x20,0x30,OxlC,0x10,0x18,0x20,0x15,0x20,OxlC,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,OxFF,0x20,0x20,OxlC,0x10,0x18,0x
17、10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,OxlC,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,OxlC,0x10,0x18,0x20,0x15,0x20,OxlC,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,OxlC,0x10,0x20,0x10,OxlC,0x10,0x20,0x
18、20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,OxlF,0x05,0x20,0x10,OxlC,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,OxlC,0x10,0x18,0x20,0x15,0x20,OxlC,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,OxlC,0x10,0x18,0x40,OxlC,0x20,0x20,0x
19、20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,OxOO);unsigned char code music tabi =OxlD, 2202, OxlD , 2902, 格式为:频率常数,节拍常数,频率常数,节拍常数,我 从山中来歌曲OxlD,2902,OxlD,2902,OxlD,2906,OxlD,2702,0x15,2502,0x16,2702,0x00,2502,0x15,2402,0x16,2208,0x19,0x20,0x00, 0x80, OxlC, 0x20, 0x00,OxlC,0x10,0x18
20、,0x20,0x15,0x20,OxlC,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,OxFF,0x20,0x20,OxlC,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,OxlC,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,OxlC,0x10,0x18,0x20,0x15,0x20
21、,OxlC,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,OxlC,0x10,RI = O;tmp = SBUF;/暂存接收到的数据0x20, 0x10, OxlC , 0x10,0x20, 0x20, 0x26 ,0x20,0x2B, 0x20, 0x30 ,0x20,0x2B, 0x40, 0x20 ,0x15,OxlF, 0x05, 0x20 ,0x10,OxlC, 0x10, 0x20 ,0x20,0x26, 0x20, 0x2B ,0x20,0x30, 0x20
22、, 0x2B ,0x40,0x20, 0x30, OxlC ,0x10,0x18, 0x20, 0x15 ,0x20,OxlC, 0x20, 0x20 ,0x20,0x26, 0x40, 0x20 ,0x20,0x2B, 0x20, 0x26 ,0x20,0x20, 0x20, 0x30 ,0x30,0x20, 0x30, OxlC ,0x10,0x18, 0x40, OxlC ,0x20,0x20, 0x20, 0x26 ,0x40,0x13, 0x60, 0x18 ,0x20,0x15, 0x40, 0x13 , 0x18, 0x80, OxOO0x40,;void main (void)
23、(init sys();ZKB1=40;*占空比初始值设定*/SDA = 1;SCL = 1;/ fill byte(OxOO) /adstart (); / adread ();;/全部填充Oxffplay: whi Ie(I) (/adstart ();/ adread ();if(RI)/是否有数据到来/ tmpI=SBUF+;/ dis_codei=SBUF;/数据传送到PO 口/ str1=SBUF;write byte(0X00, tmp);/write byte(0X01, tmp+4); write byte(0X02, addata);/ write byte(0X00, s
24、trl);/ write byte(0X01, tmpl);PO 二 read random(0X00); / 循环读取 24Cxx 内容,并输出到 PO 口 /P2=read_random(0X02);/ PI= read random(0X00);/ p2= read random (0X01);/de Iayms(250); send char(tmp) ;/回传接收到的数据send char( addata) ;/回传接收到的数据/ send str() ;) a: k=music tabs+tmp; if (k-0x00) s=0, deIayms(1000); goto play;
25、如果碰到结束符,延时1秒,回到开始再来一遍else if(k-0xff) s=s+l ;delayms (100), TRO=O; goto a;) 若碰到休止符, 延时IOOrns,继续取下一音符 elsem=music_tabs+, n=music_tabs+; 取频率常数和节拍常数TRO=I;开定时器1while(n!=0) Beepl=Beepl, Beep2=Beep2, Beep5-Beep5, Beep8=Beep8, Beep9=Beep9, BeeplO=BeeplO, Beepll=Beepl1, BeePl2=Beep12, BeePl3=Beep13, BeePl6=B
26、eep16, BeePl7=Beep17, Beepl 8=Beepl8, BeePl9=Beep19, Beep20=Beep20, Beep21=Beep21, Beep22=Beep22, Beep23=Be ep23, delayl(m);等待节拍完成,通过Pl 口输出音频(可多声道哦!) TRO=O;关定时器1b: k=music tabis+tmp; if (k=0x00) s=0, deIayms(1000); goto play;/如果碰至!)结束符,延时1秒,回到开始再来一遍 else if (k-0xff) s=s+l;delayms(100), TRO=O; goto b
27、; 若碰到休止符, 延时100ms,继续取下一音符 elsem=music-tabl s+, n=music tabi s+ ; 取频率常 数和节拍常数TRO=I;开定时器1while(n!=O)BeePI6=Beep16, Beepl7=Beepl7, Beepl8=Beepl8, BeePl9=Beep19, Beep20=Beep20, Beep2 l=Beep21, Beep22=Beep22, Beep23=Beep23, de Iayl (m);等待节拍完成,通过Pl 口输出音频(可多声道哦!)TRO=O;/ tmpl = stri;/write byte(0X01, tmpl);
28、/ i+;/下一个字符/ P2 = read random(0X01); / 循环读取 24Cxx 内容,并输出到 PO 口/ if (!PO 0) 如果按了 +键,增加占空比 / Delay5Ms ();/ if (!PO 0)/ / ZKBl-;/ ZKB1=90;/ ) )/函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/void init_sys(void)/*系统初始化函数*/(/*定时器TIMEo初始化*/TMOD=V TMOD;THO=V THO;TLO=V TLO;TRO=I;ETO=I;EA=I;/*定时器TIMEl初始化*/TMOD=0x20;/定时器1工作于8
29、位自动重载模式,用于产生波特率THl = OxFD;/ 波特率 9600TLl = OxFD;SCON = 0x50;PCON &= Oxef;对占空比值限定范围*/if (ZKBl99) ZKBl=I;/设定串行口工作方式/波特率不倍增/if (ZKBKl) ZKB 1=99; )TRl = 1;/启动定时器1/ TR2=1;/ ET2=1;/ TMODfe=OxOf;/TMODI=0x01;TH0=0xd8;TLO=Oxef;IE=0x82;/ IE = 0x0;/禁止任何中断/ TH2=V TH2;/ TL2=V_TL2;/ TR2=1;/ ET2=1;/EA=I;)延时void Del
30、ay5Ms(void) (unsigned int TempCyc = 1000;whiIe(TempCyc);)/*中断函数*/void tImerO(void) interrupt 1 using 2 (static uchar click=0;*中断次数计数器变量*/adstart ();adread ();/THO=V THO;/*恢复定时器初始值*/TLO=V TLO;TH0=0xd8;TLO=Oxef;n;/+click;/if (click=100) click=0;/if (click=ZKBl)*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ Pl 0=
31、0;/else/Pl 0=1;/if (click=ZKB2)/Pl 1=0;/else/Pl 1=1;/if (click=ZKB3) 现占空比的调整*/Pl_2=0;/else/P1.2=1;)void send char(unsigned/传送一个字符(SBUF = txd;while(!TI);TI = 0;)void send str()/传送字串(unsigned char i = 0;whiIe(stri != , 0,: (SBUF = stri;while(!TI);TI = 0;i+;*当小于占空比值时输出低电平,高于时是高电平,从而实char txd)/等特数据传送/清除
32、数据传送标志/等特数据传送/清除数据传送标志/下一个字符void start()/开始位(SDA = 1;SCL= 1;_nop_();nop_ O ;SDA = 0;_nop_O;nop_();nop_ O ;nop_();SCL 二 O;)void stop O/停止位(SDA = 0;nop_ O ;nop_();SCL = 1;nop_();_nop_();_nop_();nop_();SDA = 1;)unsigned char shin()/从T24Cxx移入数据到MeU(unsigned char i,read data;for(i = 0; i 8; i+)(SCL = 1;r
33、ead data = 1;read data I= (unsigned char)SDA;SCL = 0;)return(read data);)bit shout(unsigned char write data)/从MCU移出数据到T24Cxx(unsigned char i;bit ack bit;for(i = 0; i 8; i+)/ 循环移入 8 个位(SDA = (bit)(write data & 0x80);nop_ O ;SCL = 1 _nop_() nop_ OSCL 二 O write data = 1;/读取应答SDA = 1 _nop_() _nop_ () SC
34、L 二 1 _nop_() _nop_() _nop_() _nop_()ack bit = SDA;SCL = O;return ack bit;/ 返回 AT24Cxx 应答位void write byte(unsigned char addr, unsigned char write data) /在指定地址addr处写入数据wri te data(start ();shout(OP WRITE);shout(addr);shout(write data);stop O ;delayms(10) ;/ 写入周期)void fi11 byte(unsigned char fi11 data
35、) /填充数据fi 11 _data到EEPROM内unsigned char i;for(i = 0; i MAX ADDR; i+) (write byte(i, fil1 data);unsigned char read current () /在当前地址读取unsigned char read data;start ();shout(OP_READ);read data = shin();stop O ;return read data;unsigned char read random(unsigned char random addr)/在指定地址读取(start ();shout
36、(OP WRITE);shout(random addr);return(readcurrent ();void deIayms(unsigned char ms)/延时子程序(unsigned char i;whiIe(ms)(for(i = 0; i 120; i+);void adstart()ADeo832 开始子函数(、说明ADCo832芯片资料。CS使能二L禁止,CLK和D0/D1随意/需要转换时,宣讲CS=O使能,并保持到数据传输完成单片机向CLK输出脉冲,前3个脉冲为启动和通道控制,脉冲上升沿有效;第一个脉 冲前使Dl = I,启动信号传输,在第二个和第三个脉冲前分贝输入两位数
37、字选择通道,IO=CHO, H=CHladcs=l;/ ; 一个转换周期开始adclk=0;adcs=0; / CS置0,片选有效addin=l;/ ;Dl 置 1,起始位adclk=l;/第一个脉冲/ nop;/在负跳变之前加一个DI反转操作addin=O;adc1k=0;addin=l;Dl置1,设为单通道adclk=l;/第二个脉冲addin=0; adc1k=0;addin=0;Dl置。,选择通道0adclk=l;第三个脉冲addin=l;adcIk=O;nop;adcIk=I;第四个脉冲void adread()adc0832的数据读取子函数(根据芯片说明:从第4和脉冲DC0832开
38、始输出数据/4-19个脉冲分别从高到低输出(D7D0)然后公用最低位D0,从低到高再(DOD7) 输出一次uchar h;/uchar dat; datO读取1219脉冲作为数据效验,这里不要addata=0;for(h=0;h8;h+) ( adcIk=I;nop;nop; adc1k=0;nop;addata=l;必须选为以后读取。否则最高位会丢失addata=addin; addata值同addin 口的值进行或运算后赋值给addatanop; )如果不要效验,12-19脉冲可以不再使用和读取,所以下面8位的循环可以去掉, 直接将CS使能值1/for(h=0;h8;h+)/ dat=ad
39、din; 因为上一组8位的末位是和这8位共用DO数据,所以这里需要选 读取再脉冲/dat= cror_(datO, 1);这里需要使用的CorOJ ()循环位移/nop;/adclk=l;/nop;nop;/adclk=O;/nop;/nop; /)adcs=l;)/void timer2(void) interrupt 4 using 1/adstart ();/adread();/)/void int() interrupt 1 采用中断O控制节拍/ /THl=0xd8;/ TLl=Oxef;/ n-;/)void delay 1 (unsigned char m) 控制频率延时 (uns
40、igned i=3*m;whi le(一i);void deIaymsl (unsigned char a) 豪秒延时子程序(whi Ie(a);采用WhiIe(-a)不要采用WhiIe(a-);各位可编译一下看看汇编结果就知道了!)上述程序中,单片机STCI2C5A60S2串口只能接收到一个字节的16进制数,所以每次必 须发送一个字节的16进制数,这样单片机才能接收。程序中的下面内容:if(RI)/是否有数据到来(RI = 0;tmp二SBUF;/暂存接收到的数据/ tmpI=SBUF+;/ di s_codei=SBUF;/数据传送到PO 口 / str1=SBUF;write byte(
41、0X00, tmp);/write byte(0X01, tmp4); write byte(0X02, addata); / write byte(0X00, strl);/ write byte(0X01, tmpl);PO 二 read random(0X00); / 循环读取 24Cxx 内容,并输出到 PO 口 /P2= read_random(0X02);/ PI= read random(0X00);/ p2= read_random(0X01);/deIayms(250);send char(tmp) ;/回传接收到的数据send char( addata) ;/回传接收到的数
42、据/ send str ();) 这段代码实现的内容是将串口接收的一个字节数据存储到24C04中的0X00寄存器中,并 输出到单片机的PO端口,并赋值给pl,最后有将接收到的数据从串口发送出去。 a: k=music tabs+tmp;if (k=OxOO) s=0, deIayms(1000); goto play;如果碰到结束符,延时1秒,回到开始再来一遍else if(k-0xff) s=s+l ;delayms (100), TRO=O; goto a; 若碰到休止符, 延时100ms,继续取下一音符elsem=music_tabs+, n=music_tabs+; 取频率常数和节拍常
43、数TRO=I;开定时器1while(n!=0) Beepl=Beepl, Beep2=Beep2, Beep5=Beep5, Beep8=Beep8, Beep9=Beep9, BeeplO=BeeplO, Beepll=Beepl1, Beepl2=Beepl2, BeePI3=Beep13, Beepl6=Beepl6, Beepl7=Beepl7, Beepl 8=Beepl8, BeePl9=Beep19, Beep20=Beep20, Beep21=Beep21, Beep22=Beep22, Beep23-Be ep23, delayl(m);等待节拍完成,通过Pl 口输出音频(可多声道哦!) TRO=O;关定时器1b: k=music tabis+tmp