找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2308|回复: 0
打印 上一主题 下一主题
收起左侧

Smart_car4红外避障+超声波跟随设计源代码

[复制链接]
跳转到指定楼层
楼主
这是我上个月做的单片机智能小车,目前可实现红外避障和蓝牙遥控。保证原创,请多多指教。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<C52_car.h>
  3. #include <intrins.h>//包含_nop_指令的头文件
  4. #define MAIN_Fosc                11059200UL        //宏定义主时钟HZ
  5. #define PCF8591_ADDR        0x90                //PCF8591地址
  6. #define DACOUT_EN                0x40                //DAC输出使能

  7. typedef unsigned char uchar;
  8. typedef unsigned int uint;
  9. unsigned char pwm_left_val = 0;//左电机占空比值 取值范围0-80,0最快
  10. unsigned char pwm_right_val = 0;//右电机占空比值取值范围0-80 ,0最快
  11. unsigned char pwm_t = 0;//周期
  12. unsigned char control=0X01;//车运动控制全局变量,默认开机为停车状态
  13. unsigned int  time = 0;//传输时间
  14. unsigned long S = 0;//距离
  15. unsigned char count=0;
  16. unsigned char SEH_count;  //舵机朝向前面

  17. #define LCD1602_DB P0        //LCD1602数据总线
  18. uchar Control_mode = 0;
  19. uchar AD_Value;        //存储AD转换回的数字量
  20. sbit LCD1602_RS = P3^5;         //RS端
  21. sbit LCD1602_RW = P3^6;         //RW端
  22. sbit LCD1602_EN = P3^4;         //EN端
  23. sbit DU = P2^6;//
  24. sbit WE = P2^7;//数码管位选段选用于关闭数码管显示

  25. void delay(unsigned int z)//毫秒级延时
  26. {
  27.         unsigned int x,y;
  28.         for(x = z; x > 0; x--)
  29.                 for(y = 114; y > 0 ; y--);
  30. }

  31. void Delay10us(unsigned char i)            //10us延时函数 启动超声波模块时使用
  32. {           
  33.    unsigned char j;
  34.         do{
  35.                 j = 10;
  36.                 do{
  37.                         _nop_();
  38.                 }while(--j);
  39.         }while(--i);
  40. }

  41. /*====================================
  42. 函数:void Delay5us()
  43. 描述:12T 51单片机5微秒延时函数自适应时钟(11.0592M,12M,22.1184M)
  44. ====================================*/
  45. void Delay5us()
  46. {
  47.         #if MAIN_Fosc == 11059200
  48.                 _nop_();
  49.         #elif MAIN_Fosc == 12000000
  50.                 _nop_();
  51.         #elif MAIN_Fosc == 22118400
  52.                 _nop_(); _nop_(); _nop_();
  53.         #endif
  54. }

  55. /*小车前进*/
  56. void forward()
  57. {
  58.         left_motor_go; //左电机前进
  59.         right_motor_go; //右电机前进
  60. }
  61. /*小车左转*/
  62. void left_run()
  63. {
  64.         left_motor_stops; //左电机停止
  65.         right_motor_go; //右电机前进       
  66. }
  67. /*小车右转*/
  68. void right_run()
  69. {
  70.         right_motor_stops;//右电机停止
  71.         left_motor_go;    //左电机前进
  72. }

  73. /*PWM控制使能 小车后退*/
  74. void backward()
  75. {
  76.         left_motor_back; //左电机后退
  77.         right_motor_back; //右电机后退       
  78. }
  79. void stop()
  80. {
  81.         left_motor_stops; //左电机后退
  82.         right_motor_stops; //右电机后退       
  83. }

  84. void Init(void)
  85. {
  86.            EA = 1;            //开总中断
  87.         PT0 = 1;

  88.         IT0 = 0;                //边沿触发方式
  89.         IT1 = 0;                //边沿触发方式

  90.            SCON |= 0x50;         // SCON: 模式1, 8-bit UART, 使能接收
  91.         T2CON |= 0x34;         //设置定时器2为串口波特率发生器并启动定时器2
  92.         TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //设置波特率
  93.         TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
  94.         ES= 1;                         //打开串口中断
  95.                
  96.         TMOD |= 0x01;        //定时器0,工作模式1,16位定时模式
  97.         TH0 = 0;
  98.         TL0 = 0;                //T0,16位定时计数用于记录ECHO高电平时间
  99.         TR0 = 1;                //启动定时器0
  100.         ET0 = 1;                //允许定时器0中断

  101.         TMOD |= 0x10;        //定时器1,16位定时模式。
  102.         TH1 = 0xff;     //配置定时器0初值,溢出时间为0.1ms
  103.     TL1 = 0xa3;
  104.         TR1 = 1;                //启动定时器1
  105.         ET1 = 1;        //允许T1中断

  106. }

  107. void  StartModule()                          //启动超声波模块
  108. {
  109.           TX=1;                                             //启动一次模块
  110.       Delay10us(2);
  111.           TX=0;
  112. }

  113. /*计算超声波所测距离并显示*/
  114. void Conut()
  115. {
  116.         time=TH0*256+TL0;
  117.         TH0 = 0;
  118.         TL0 = 0;

  119.         S=(float)(time*1.085)*0.17;     //算出来是MM
  120.         if(S>=7000) //超出测量范围
  121.         {         
  122.                 stop();
  123.                 beep = 0;
  124.                 delay(1000);
  125.                 beep = 1;
  126.         }

  127. }

  128. /*====================================
  129. 函数:void SEH_count_0()
  130. 描述:舵机在左侧时指令
  131. ====================================*/
  132. void SEH_count_5()
  133. {
  134.         StartModule();        //启动模块测距
  135.         while(!RX);                //当RX(ECHO信号回响)为零时等待
  136.         TR0 = 1;                        //开启计数
  137.         while(RX) ;                        //当RX为1计数并等待
  138.         TR0 = 0;                        //关闭计数
  139.         Conut();                        //计算距离
  140.         if(S > 170 && S <850 )//设置随动距离(单位毫米)
  141.         {
  142.                 left_run();                       
  143.         }       
  144. }

  145. /*====================================
  146. 函数:void SEH_count_10()
  147. 描述:舵机在中间时指令
  148. ====================================*/
  149. void SEH_count_10()
  150. {
  151.         StartModule();        //启动模块测距
  152.         while(!RX);                //当RX(ECHO信号回响)为零时等待
  153.         TR0 = 1;                        //开启计数
  154.         while(RX) ;                        //当RX为1计数并等待
  155.         TR0 = 0;                        //关闭计数
  156.         Conut();                        //计算距离
  157.         if(S > 170 && S <850 )//设置随动距离(单位毫米)
  158.         {
  159.                 forward();                       
  160.         }       
  161. }

  162. /*====================================
  163. 函数:void SEH_count_20()
  164. 描述:舵机在右侧时指令
  165. ====================================*/
  166. void SEH_count_15()
  167. {
  168.         StartModule();        //启动模块测距
  169.         while(!RX);                //当RX(ECHO信号回响)为零时等待
  170.         TR0 = 1;                        //开启计数
  171.         while(RX) ;                        //当RX为1计数并等待
  172.         TR0 = 0;                        //关闭计数
  173.         Conut();                        //计算距离
  174.         if(S > 150 && S <850 )//设置随动距离(单位毫米)
  175.         {
  176.                 right_run();                       
  177.         }       
  178. }

  179. /*====================================
  180. 函数:I2C_init()
  181. 描述:I2C总线初始化
  182. ====================================*/
  183. void I2C_init()
  184. {
  185.         SDA = 1;   //数据总线高
  186.         _nop_();
  187.         SCL = 1;   //时钟总线高
  188.         _nop_();
  189. }

  190. /*====================================
  191. 函数:I2C_Start()
  192. 描述:I2C起始信号
  193. ====================================*/
  194. void I2C_Start()  
  195. {
  196.         SCL = 1;
  197.         _nop_();
  198.         SDA = 1;
  199.         Delay5us();
  200.         SDA = 0;
  201.         Delay5us();
  202. }

  203. /*====================================
  204. 函数:I2C_Stop()
  205. 描述:I2C停止信号
  206. ====================================*/
  207. void I2C_Stop()
  208. {
  209.         SDA = 0;
  210.         _nop_();
  211.         SCL = 1;
  212.         Delay5us();
  213.         SDA = 1;
  214.         Delay5us();
  215. }

  216. /*====================================
  217. 函数:Master_ACK(bit i)
  218. 参数:i 为0时发送非应答 为1时发送应答
  219. 描述:I2C主机发送应答
  220. ====================================*/
  221. void Master_ACK(bit i)       
  222. {
  223.         SCL = 0; // 拉低时钟总线允许SDA数据总线上的数据变化
  224.         _nop_(); // 让总线稳定
  225.         if (i)         //如果i = 1 那么拉低数据总线 表示主机应答
  226.         {
  227.                 SDA = 0;
  228.         }
  229.         else         
  230.         {
  231.                 SDA = 1;         //发送非应答
  232.         }
  233.         _nop_();//让总线稳定
  234.         SCL = 1;//拉高时钟总线 让从机从SDA线上读走 主机的应答信号
  235.         _nop_();
  236.         SCL = 0;//拉低时钟总线, 占用总线继续通信
  237.         _nop_();
  238.         SDA = 1;//释放SDA数据总线。
  239.         _nop_();
  240. }

  241. /*====================================
  242. 函数:Test_ACK()
  243. 返回:0为非应答 1为应答
  244. 描述:I2C检测从机应答
  245. ====================================*/
  246. bit Test_ACK()         // 检测从机应答
  247. {
  248.         SCL = 1;//时钟总线为高电平期间可以读取从机应答信号
  249.         Delay5us();
  250.         if (SDA)
  251.         {
  252.                 SCL = 0;
  253.                 I2C_Stop();
  254.                 return(0);
  255.         }
  256.         else
  257.         {
  258.                 SCL = 0;
  259.                 return(1);
  260.         }
  261. }

  262. /*====================================
  263. 函数:I2C_send_byte(uchar byte)
  264. 参数:byte 要发送的字节
  265. 描述:I2C发送一个字节
  266. ====================================*/
  267. void I2C_send_byte(uchar byte)
  268. {
  269.         uchar i;
  270.         for(i = 0 ; i < 8 ; i++)
  271.         {
  272.                 SCL = 0;
  273.                 _nop_();
  274.                 if (byte & 0x80)        //
  275.                 {
  276.                         SDA = 1;
  277.                         _nop_();
  278.                 }
  279.                 else
  280.                 {
  281.                         SDA = 0;
  282.                         _nop_();
  283.                 }
  284.                 SCL = 1;
  285.                 _nop_();
  286.                 byte <<= 1;
  287.         }
  288.         SCL = 0;
  289.         _nop_();
  290.         SDA = 1;
  291.         _nop_();       
  292. }

  293. /*====================================
  294. 函数:I2C_read_byte()
  295. 返回:读取的字节
  296. 描述:I2C读一个字节
  297. ====================================*/
  298. uchar I2C_read_byte()
  299. {
  300.         uchar i, dat;
  301.         SCL = 0 ;
  302.         _nop_();
  303.         SDA = 1;
  304.         _nop_();
  305.         for(i = 0 ; i < 8 ; i++)
  306.         {
  307.                 SCL = 1;
  308.                 _nop_();
  309.                 dat <<= 1;          
  310.                 if (SDA)
  311.                 {
  312.                         dat |= 0x01;  
  313.                 }
  314.                 _nop_();
  315.                 SCL = 0;
  316.                 _nop_();
  317.         }
  318.         return(dat);
  319. }

  320. /*读AD数据*/
  321. bit ADC_Read(uchar CON)
  322. {
  323.         I2C_Start();
  324.         I2C_send_byte(PCF8591_ADDR+0);
  325.         if (!Test_ACK())
  326.         {
  327.                 return(0);
  328.         }
  329.         I2C_send_byte(CON);
  330.         Master_ACK(0);
  331.         I2C_Start();
  332.         I2C_send_byte(PCF8591_ADDR+1);
  333.         if (!Test_ACK())
  334.         {
  335.                 return(0);
  336.         }
  337.         AD_Value = I2C_read_byte();
  338.         Master_ACK(0);
  339.         I2C_Stop();
  340.         return(1);       
  341. }

  342. /*=================================================
  343. *函数名称:Read_Busy
  344. *函数功能:判断1602液晶忙,并等待
  345. =================================================*/
  346. void Read_Busy()
  347. {
  348.         uchar busy;
  349.         LCD1602_DB = 0xff;//复位数据总线
  350.         LCD1602_RS = 0;          //拉低RS
  351.         LCD1602_RW = 1;          //拉高RW读
  352.         do
  353.         {
  354.                 LCD1602_EN = 1;//使能EN
  355.                 busy = LCD1602_DB;//读回数据
  356.                 LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
  357.         }while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
  358. }

  359. /*=================================================
  360. *函数名称:LCD1602_Write_Cmd
  361. *函数功能:写LCD1602命令
  362. *调用:Read_Busy();
  363. *输入:cmd:要写的命令
  364. =================================================*/
  365. void LCD1602_Write_Cmd(uchar cmd)
  366. {
  367.         Read_Busy();         //判断忙,忙则等待
  368.         LCD1602_RS = 0;
  369.         LCD1602_RW = 0;        //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
  370.         LCD1602_DB = cmd;//写入命令
  371.         LCD1602_EN = 1;         //拉高使能端 数据被传输到LCD1602内
  372.         LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
  373. }

  374. /*=================================================
  375. *函数名称:LCD1602_Write_Dat
  376. *函数功能:写LCD1602数据
  377. *调用:Read_Busy();
  378. *输入:dat:需要写入的数据
  379. =================================================*/
  380. void LCD1602_Write_Dat(uchar dat)
  381. {
  382.         Read_Busy();
  383.         LCD1602_RS = 1;
  384.         LCD1602_RW = 0;
  385.         LCD1602_DB = dat;
  386.         LCD1602_EN = 1;
  387.         LCD1602_EN = 0;
  388. }

  389. /*=================================================
  390. *函数名称:LCD1602_Dis_Str
  391. *函数功能:在指定位置显示字符串
  392. *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  393. *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
  394.                 *str:需要显示的字符串
  395. =================================================*/
  396. void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
  397. {
  398.         if(y) x |= 0x40;
  399.         x |= 0x80;
  400.         LCD1602_Write_Cmd(x);
  401.         while(*str != '\0')
  402.         {
  403.                 LCD1602_Write_Dat(*str++);
  404.         }
  405. }
  406. /*=================================================
  407. *函数名称:Init_LCD1602
  408. *函数功能:1602初始化
  409. *调用:        LCD1602_Write_Cmd();
  410. =================================================*/
  411. void Init_LCD1602()
  412. {
  413.         LCD1602_Write_Cmd(0x38); //        设置16*2显示,5*7点阵,8位数据接口
  414.         LCD1602_Write_Cmd(0x0c); //开显示
  415.         LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
  416.         LCD1602_Write_Cmd(0x01); //清除显示
  417. }
  418. /*=================================================
  419. *函数名称:Dispaly_LCD1602
  420. *函数功能:1602显示字符
  421. *调用:        LCD1602_Write_Cmd();
  422. =================================================*/
  423. void Dispaly_LCD1602()
  424. {
  425.         int LCD_CK=0;
  426.         uchar Str_1[] = {"Welcome to use"};
  427.         uchar Str_2[] = {"Pick a pattern"};
  428.         uchar Str_3[] = {"S2 -> automatic"};
  429.         uchar Str_4[] = {"S3 -> bluetooth"};
  430.         Init_LCD1602();//1602初始化
  431.         for(;;)        //死循环
  432.         {
  433.                 if(LCD_CK == 0)
  434.                 {
  435.                          LCD1602_Dis_Str(0, 0, &Str_1[0]);        //显示字符串
  436.                         LCD1602_Dis_Str(0, 1, &Str_2[0]);        //显示字符串
  437.                         delay(10);               
  438.                 }
  439.                 if(LCD_CK == 20000)
  440.                 {
  441.                          LCD1602_Dis_Str(0, 0, &Str_3[0]);        //显示字符串
  442.                         LCD1602_Dis_Str(0, 1, &Str_4[0]);        //显示字符串
  443.                         delay(10);
  444.                 }/**/
  445.                                
  446.                 if(key_s2 == 0)// 实时检测S2按键是否被按下
  447.                 {
  448.                         delay(5); //软件消抖
  449.                         if(key_s2 == 0)//再检测S2是否被按下
  450.                         {
  451.                                 while(!key_s2);//松手检测
  452.                                 delay(50);//50毫秒延时
  453.                                 Control_mode = 0;
  454.                                 break;                //退出FOR死循环
  455.                         }
  456.                 }
  457.                 if(key_s3 == 0)// 实时检测S3按键是否被按下
  458.                 {
  459.                         delay(5); //软件消抖
  460.                         if(key_s3 == 0)//再检测S3是否被按下
  461.                         {
  462.                                 while(!key_s3);//松手检测
  463.                                 delay(50);//50毫秒延时
  464.                                 Control_mode = 1;
  465.                                 break;                //退出FOR死循环
  466.                         }
  467.                 }

  468.                 if(LCD_CK <= 40000)        LCD_CK++;
  469.                 if(LCD_CK >= 40000) LCD_CK = 0;
  470.         }               
  471. }

  472. void main()
  473. {
  474.         DU = 0;
  475.         WE = 0;
  476.         EN2 = EN1 =1;
  477.         SEH_count = 10;
  478.         Dispaly_LCD1602();
  479.         I2C_init();//I2C初始化
  480.         LCD1602_Write_Cmd(0x08); //关闭1602显示
  481.         Init();//定时器、串口初始化Init();//定时器、串口初始化       
  482.         beep = 0;
  483.         delay(200);//延时1秒
  484.         beep = 1;
  485.         while(1)
  486.         {
  487.                 if(Control_mode == 1)
  488.                 {
  489.                         EX0 = 0;                //关闭外部中断1
  490.                         EX1 = 0;                //关闭外部中断2

  491.                         while(1)
  492.                         {
  493.                                 if(control>0X07)//如果成立,则表示接收的命令不在运行命令内
  494.                                   {
  495.                                            stop();        //  停车
  496.                                    }
  497.                                 switch(control)
  498.                                 {                                       
  499.                                         case 0X02:        forward();                 break;//前进
  500.                                         case 0X03:        backward();                 break;//后退
  501.                                         case 0X04:        left_run();                 break;//左转
  502.                                         case 0X05:        right_run();         break;//右转
  503.                                         case 0X01:        stop();                         break;//停车
  504.                                         case 0X08:        beep = 0;                 break;//鸣笛
  505.                                         case 0X09:        beep = 1;                 break;//停止鸣笛
  506.                                         case 0X0B:        SEH_count = 10;         break;//SEH_COUNT: 10:0.5+1(0.1*10T)=1.5ms->90°舵机角度
  507.                                         case 0X0A:        Control_mode = 0;break;
  508.                                 }
  509.                                 break;
  510.                         }
  511.                 }
  512.                 if(Control_mode == 0)
  513.                 {
  514.                         EX0 = 1;                //打开外部中断1
  515.                         EX1 = 1;                //打开外部中断2

  516.                          for (;;)
  517.                         {                               
  518.                                 SEH_count = 12;
  519.                                 delay(300);
  520.                                 ADC_Read(0x03);//体感模块,当检测到人体收输出3.3高电平
  521.                                 if(AD_Value > 100) SEH_count_10();

  522.                                 SEH_count = 6;
  523.                                 delay(300);
  524.                                 ADC_Read(0x03);//体感模块,当检测到人体收输出3.3高电平
  525.                                 if(AD_Value > 100) SEH_count_5();//大于3.1V表示感应到了人体,小车行进

  526.                                 SEH_count = 12;
  527.                                 delay(300);
  528.                                 ADC_Read(0x03);//体感模块,当检测到人体收输出3.3高电平
  529.                                 if(AD_Value > 100) SEH_count_10();

  530.                                 SEH_count = 18;
  531.                                 delay(300);
  532.                                 ADC_Read(0x03);//体感模块,当检测到人体收输出3.3高电平
  533.                                 if(AD_Value > 150) SEH_count_15();

  534.                                 if(control == 0X0C)
  535.                                 {
  536.                                          Control_mode = 1;
  537.                                         break;       
  538.                                 }
  539.                         }
  540.                 }
  541.         }       
  542. }
  543. void int0() interrupt 0
  544. {       
  545.         EX0 = 0;
  546.         delay(10);
  547.         if(left_led2 == 0)
  548.         {               
  549.                   backward();
  550.                 delay(500);
  551.                 key_s3 = 1;
  552.                 right_run();
  553.                 delay(700);
  554.                 forward();
  555.                 delay(500);
  556.                 stop();
  557.         }
  558.         EX0 = 1;                       
  559. }

  560. //定时器0中断
  561. void timer0() interrupt 1
  562. {
  563. /*        pwm_t++;//周期计时加
  564.         if(pwm_t == 120)
  565.                 pwm_t = EN1 = EN2 = 0;
  566.         if(pwm_left_val == pwm_t)//左电机占空比       
  567.                 EN1 = 1;               
  568.         if(pwm_right_val == pwm_t)//右电机占空比
  569.                 EN2 = 1;
  570. */                                                 
  571. }

  572. void int1() interrupt 2
  573. {       
  574.         EX1 = 0;
  575.         delay(10);
  576.         if(right_led2 == 0)
  577.         {
  578.                
  579.                   backward();
  580.                 delay(500);
  581.                 key_s3 = 1;
  582.                 left_run();
  583.                 delay(700);
  584.                 forward();
  585.                 delay(500);
  586.                 stop();
  587.         }
  588.         EX1 = 1;
  589. }

  590. //定时器1中断
  591. void timer1() interrupt 3                  //T1中断用来计数器溢出
  592. {
  593.         TR1 = 0;      //关闭定时器1
  594.     TH1 = 0xff;   //重装初值0.1ms
  595.     TL1 = 0xa3;
  596.     //舵机1
  597.     if(count <= SEH_count) //控制占空比左右
  598.     {
  599.         //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波
  600.         Servo = 1;
  601.     }
  602.     else
  603.     {
  604.         Servo = 0;
  605.     }
  606.         count++;
  607.     if (count >= 200) //T = 20ms则定时器计数变量清0
  608.     {
  609.         count = 0;
  610.     }

  611.         TR1 = 1; //开启定时器1
  612. }

  613. /******************************************************************/
  614. /* 串口中断程序*/
  615. /******************************************************************/
  616. void UART_SER () interrupt 4
  617. {
  618.         unsigned char n;         //定义临时变量

  619.         if(RI)                 //判断是接收中断产生
  620.         {
  621.                 RI=0;         //标志位清零
  622.                 n=SBUF; //读入缓冲区的值

  623.                 control=n;
  624. /*                if((n >= 51) && (n <= 150))//左电机调速0~100个档位 手机端软件进行调节
  625.                         pwm_left_val = 0.8-((n-50)*0.8);       
  626.                 if((n >= 151) && (n <= 250))          //右电机调速0~100个档位 手机端软件进行调节
  627.                         pwm_right_val = 0.8-((n-150)*0.8);*/
  628.                 if((n >= 51) && (n <= 150))//左电机调速0~100个档位 手机端软件进行调节
  629.                         pwm_left_val = 1.7-((n-50)*1.7);       
  630.                 if((n >= 151) && (n <= 250))          //右电机调速0~100个档位 手机端软件进行调节
  631.                         pwm_right_val = 1.7-((n-150)*1.7);
  632.         }
  633. }
复制代码

所有资料51hei提供下载:
Smart_car4 红外避障&amp;超声波跟随.rar (56.44 KB, 下载次数: 25)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表