找回密码
 立即注册

QQ登录

只需一步,快速开始

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

开启PIC单片机学习之路,记录PIC单片机的学习的点点滴滴,与大家分享

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 bbxyliyang 于 2019-10-12 21:12 编辑

第一天PIC单片机编译环境的安装
  网上关于PIC单片机的入门或者学习资料相对较少,不像STM32、AVR或者51单片机那样丰富,所以我记录下我学习PIC单片机的点点滴滴,与大家共享下,技术在于交流,如我写的错误的地方,希望大家指正。
  来介绍一下我所使用的平台信息、调试工具。
  PIC单片机型号:PIC16F887
  开发环境:MPLAB X IDE v3.30
  下载工具:PIC Kit 3.5
  一、 安装开发环境
  我是直接在官网(www.microchip.com)上下载的MPLAB X IDE v3.30版本,400多兆,应该是最新版本了,安装过程中使用推荐选项就可以,还安装了一个XC8编译器(XC8_V1.31破解版)。如果大家需要软件,可以联系我们震撼科技工作室,QQ 515580142,我们可以把软件发给你。给大家介绍下我们震撼科技工作室,我们是几个刚大学毕业大学生创立,主要承接各种单片机设计制作,如原理图设计、电路板PCB绘制、单片机程序代写、实物制作等相关软硬件开发。
  二、 新建项目
  1、我安装开发环境的时候,选择了中文版本,进入开发环境后,点击:文件->新建项目,弹出如下界面:选择独立项目,然后点下一步。
                                                                                                   

  步骤一
  2、点击下一步后弹出如下界面:选择你使用的单片机型号,这里我使用的是PIC16F887单片机。
  步骤二
  3、继续点下一步,这里选择调试/下载工具,我使用的是PICkit3。
  步骤三
  4、下一步,这一步选择的是编译器,选择XC8编译器。
  步骤四
  5、最后一步,选择项目的保存目录,编码这里选择的是GB2312,这样做的目的是使项目中的中文字符能够被识别,否则,添加中文注释时会出现乱码。
  步骤五
  6、至此,项目新建完毕,界面如下,项目目录里面,我们目前只需要关注头文件和源文件即可,在头文件上右键可以选择添加现有的头文件,源文件同理。
                                       
  7、文件添加完成后,点击编译按钮 进行编译,编译通过后会在环境下方提示编译信息,
 8、 编译成功后,可以进行下载和在线调试,下载按钮 用于将程序下载到单片机内部,调试按钮  用于在线调试程序,注意,点击调试按钮程序不会下载到单片机内。
  注意接下来以测试程序来讲解这款单片机的使用,在此之前先来了解一下《配置位》,在开发环境中,点击运行窗口->PIC存取器视图->配置位,即可在环境下方调出配置窗口,Option下面的定义可以修改,
这里说一下时钟配置和看门狗配置,FOSC用于配置系统时钟,WDTE用于看门狗的配置,如果你想使用外部晶振就选择XT即可,同理,看门狗的开启和关闭,以及开启后的设置也可以通过WDTE来配置,这里我们选择关闭看门狗,只需将WDT选项选择为OFF即可,注意,这里选择好之后,必须点击输出生成源代码,会自动生成源码,生成的源码拷贝到你的项目文件中才有效。
  至于一些详细的配置请自行参见手册。
  生成代码
 

PIC单片机编译环境的安装.doc

793.5 KB, 下载次数: 71, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:342822 发表于 2019-10-13 09:49 | 只看该作者
个人看法:
呵呵~~麻烦!不如用Proteus 8 配置xc8编译器爽快。
回复

使用道具 举报

板凳
ID:190577 发表于 2019-10-13 10:05 | 只看该作者
第二天开始第一个程序
今天的任务,点亮一个LED,和编写一个流水灯程序。我们直接进入主题,先介绍下PIC单片机I/O口,I/O端口的寄存器复位后,默认为输入(输出高阻态),每一路I/O有方向控制寄存器TRISA~E和数据寄存器PORTA~E,为了实现I/O端口的功能必需先对端口进行初始化设置。方向控制寄存器与数据寄存器都是8位的,方向控制寄存器中的每一位与数据寄存器中的每一位相对应;方向控制寄存器的相应位设置为1表示输入;设置为0表示输出;端口控制寄存器的相应位设置为1表示输出高电平,设置为0表示输出低电平。 这个需要我们记住。通用I/O接口的输出设计要点:1、输出电平的转换和匹配,我们PIC系统一般工作电源是5V,当连接的外围是9V、12V等于5V不同的电源时,需要考虑输出电平的转换。2、输出电流的驱动能力,每个I/O口允许最大25mA的灌电流和20mA的拉电流,可以直接驱动LED和继电器。因各端口结构不同,RB口提供的总灌电流和总拉电流可达150mA和100mA;其他端口为80mA和50mA;五个端口驱动电流之和不大于200mA。3、输出电平转换的延时,PIC单片机是一款高速单片机,当系统晶振为4MHZ时,执行一个指令的时间为0.25us,也就是说讲一个I/O置1,在置0,只需要0.25us。
(1)LED发光二级管电流硬件设计:二极管电流大于5MA,人眼睛就可以明显的观察到二极管的发光,导通电流越大,亮度越高。但最好不要超过10ma,否则可能会将二级管烧坏或IO口烧坏。我们在设计电路时,需要在电路中串接一个限流电阻,这个电流一般在330-1K之间。
                              
(2)软件设计,代码如下:
#include<pic.h>//头文件包含
//芯片配置字定义
#pragmaconfig FOSC = XT        // OscillatorSelection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT andRA7/OSC1/CLKIN)
#pragmaconfig WDTE = OFF       // Watchdog TimerEnable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCONregister)
#pragmaconfig PWRTE = OFF      // Power-up TimerEnable bit (PWRT disabled)
#pragmaconfig MCLRE = ON       // RE3/MCLR pinfunction select bit (RE3/MCLR pin function is MCLR)
#pragmaconfig CP = OFF         // CodeProtection bit (Program memory code protection is disabled)
#pragmaconfig CPD = OFF        // Data CodeProtection bit (Data memory code protection is disabled)
#pragmaconfig BOREN = ON       // Brown OutReset Selection bits (BOR enabled)
#pragmaconfig IESO = ON        // InternalExternal Switchover bit (Internal/External Switchover mode is enabled)
#pragmaconfig FCMEN = ON       // Fail-SafeClock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragmaconfig LVP = ON         // Low VoltageProgramming Enable bit (RB3/PGM pin has PGM function, low voltage programmingenabled)
#pragmaconfig BOR4V = BOR40V   // Brown-outReset Selection bit (Brown-out Reset set to 4.0V)
#pragmaconfig WRT = OFF        // Flash ProgramMemory Self Write Enable bits (Write protection off)
voidmain()
{
//   TRISC=0xfe;//11111110,端口操作
//   PORTC=0xfe;//00000001
   TRISC0=0;//位操作,类似51单片机sbit
   RC0=0;
   while(1);
}
实验效果如下:
流水灯程序如下:
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
#pragma config FOSC = XT        // Oscillator Selection bits (XToscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDTdisabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRTdisabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit(RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memorycode protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Datamemory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BORenabled)
#pragma config IESO = ON        // Internal External Switchover bit(Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit(Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit(RB3/PGM pin has PGM function, low voltage programming enabled)
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-outReset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self WriteEnable bits (Write protection off)
void delay_ms(uint x)
{
         uint a,b;
         for(a=x;a>0;a--)
                   for(b=110;b>0;b--);
}
void main()
{
         uchar position=0;
         TRISC=0x00;//设置为输出方式
         while(1)
         {
                   PORTC=~(1<<postion);
                   if(++position>=8)      postion=0;
                   delay_ms(1000);
         }
}
回复

使用道具 举报

地板
ID:190577 发表于 2019-10-13 10:42 来自手机 | 只看该作者
taotie 发表于 2019-10-13 09:49
个人看法:
呵呵~~麻烦!不如用Proteus 8 配置xc8编译器爽快。

您好,这方面的资料吗,给我们分享下!
回复

使用道具 举报

5#
ID:342822 发表于 2019-10-14 09:34 | 只看该作者
bbxyliyang 发表于 2019-10-13 10:42
您好,这方面的资料吗,给我们分享下!

在这个页面添加编译器路径就可以了~~


回复

使用道具 举报

6#
ID:190577 发表于 2019-10-15 17:19 | 只看该作者
第三天 定时器的学习
3.1 定时/计数器功能
3.1.1定时功能
所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1,计数值达到予置值后,定时/计数模块产生溢出。
3.1.2计数器功能
所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。
3.2定时器应用的方法
在单片机中,每一个中断源都有一个相应的中断标志位,该中断标志将占据中断控制寄存器的一位,该中断标志位置1,就意味着有中断信号产生并向MCU申请中断,但这不代表MCU一定响应该中断。响应一个中断请求的条件:
响应A中断=全局中断允许标志(由用户软件设置)AND中断A允许标志位(由用户软件设置)AND中断A标志位(由用户软件设置或者符合中断条件时由硬件自动设置)。
我们今天的目的就是学习PIC单片机定时器0,实现让LED灯每隔1S亮一次。
接下来我们分析一下,指令周期就是单片机执行一个指令所花费的时间。这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。假设现在的时钟是4MHZ  ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us就是指令周期,这1us也就是定时器定时的最小单位。
1、定时器与预分频器
假设在没有预分频器情况下。开启定时器每隔一个指令周期定时器就加一。假设时钟是4MHz 也就是每隔 1us 定时器加一。如果有了预分频器假设预分频器设置成2分频,定时器就 每隔2个指令周期定时器加一。如果预分频器设置成4分频,定时器就 每隔4个指令周期定时器加一,以此类推。
2、定时器中断标志位
如: TMR0 这个是8位的定时器,也就是8位的寄存器。8位的寄存器能代表的数值为0~255.也就是说定时器可以从0开始加一直加到255.到255后再加一就又变成0。此时TMR0定时器中断标志位 (TMR0IF)变成 1.(如果中断没有开启,并不执行中断程序。)
3、实例说明:
   假设时钟周期为4MHZ,每隔1秒点亮LED,每1秒灭掉LED。这样的程序要如何做到呢。
  1、得到指令周期
4MHz/4=1MHz
     1/1MHz=0.0000001s=1us
  2、得到预分频
     定时器定时的最大时间=预分频*256。256X256=65536us=65.536ms这里面我们选择50ms。
3、计算定时器初始值=(定时器最大值+1)-(定时时间/预分频)。
     255+1=256
50000/256=195.3125
     256-195.3125=60.6875 四舍五入,定时器初始值为61
接下来我们就要开始编程,编程之前,我们讲下,几个重要的寄存器。
                              
#include "pic.h"
//********************函数定义*********************   
//*************** 主程序 ********************
void main(void)
{   
  PSA=0;   //PSA等于0,分频
  PS0=1;
  PS1=1;
  PS2=1;
  T0CS=0;   //设为定时方式
  TMR0=61;  //设定定时初值     
  GIE=1;    //总中断允许
  T0IE=1;   //TMR0中断允许
  TRISC=0;     //PORTC设置为输出
  PORTC=0x0ff; //PORTC输出1
  while(1)
  {  
  }
}
//*********************中断服务程序******************
void interruptisr(void)
{
static uint tmr0_count=0;  
if(T0IE&&T0IF)     //判断是否为TMR0中断
  {
    T0IF=0;    //清TMR0中断标志位(必须用软件清零)
    TMR0=61;   //TMR0重新赋初值
    if(++tmr0_count>=20)  //定时20次,就是1秒
    {
      tmr0_count=0;
      PORTC=~PORTC;      
    }
  }
}
回复

使用道具 举报

7#
ID:454243 发表于 2019-10-17 08:57 | 只看该作者
给你 点赞  一起学习
回复

使用道具 举报

8#
ID:454243 发表于 2019-10-17 09:08 | 只看该作者
等你继续更新
回复

使用道具 举报

9#
ID:625214 发表于 2019-10-17 10:22 | 只看该作者
我也是才开始学PIC,多多交流
回复

使用道具 举报

10#
ID:190577 发表于 2019-10-17 23:11 来自手机 | 只看该作者
son2011 发表于 2019-10-17 10:22
我也是才开始学PIC,多多交流

技术在于交流,我会继续更新下去!帮助需要帮助的人!
回复

使用道具 举报

11#
ID:190577 发表于 2019-10-17 23:15 来自手机 | 只看该作者
f15067460282 发表于 2019-10-17 09:08
等你继续更新

好的,技术在于交流,我会继续更新下去,希望能帮助需要帮助的人!
回复

使用道具 举报

12#
ID:190577 发表于 2019-10-20 09:36 | 只看该作者
这几天比较忙,没有跟时间更新,我把前3章WORD上传下,方便大家学习。

PIC单片机从入门到精通.doc

1.21 MB, 下载次数: 54, 下载积分: 黑币 -5

回复

使用道具 举报

13#
ID:150142 发表于 2019-11-27 18:33 | 只看该作者
继续师兄
回复

使用道具 举报

14#
ID:190577 发表于 2019-12-6 21:12 | 只看该作者

最近太忙了
回复

使用道具 举报

15#
ID:140183 发表于 2019-12-22 10:14 | 只看该作者
多谢分享!很好的资料.
回复

使用道具 举报

16#
ID:190577 发表于 2021-8-18 11:19 | 只看该作者
qxdqx 发表于 2019-12-22 10:14
多谢分享!很好的资料.

技术在于分享,希望可以帮助需要的人
回复

使用道具 举报

17#
ID:967119 发表于 2021-9-19 16:27 | 只看该作者
bbxyliyang 发表于 2019-10-15 17:19
第三天 定时器的学习3.1 定时/计数器功能3.1.1定时功能所谓定时功能就是通过来自单片机内部的时钟脉冲作 ...

谢谢!很有帮助!
回复

使用道具 举报

18#
ID:967119 发表于 2021-9-19 16:30 | 只看该作者
本帖最后由 cczjw 于 2021-9-19 22:34 编辑

期望继续。谢谢!请问 kit3.5 是否包含了 kit2 的全部功能?
回复

使用道具 举报

19#
ID:967119 发表于 2021-9-20 08:03 | 只看该作者
taotie 发表于 2019-10-14 09:34
在这个页面添加编译器路径就可以了~~

请教,proteus 8.3 在win10下安装后怎么器件库不全的呢?比如 没找到 LED和直插件的小功率电阻呢?这个版本在XP下是正常的。谢谢!
回复

使用道具 举报

20#
ID:190577 发表于 2021-9-20 16:12 | 只看该作者
cczjw 发表于 2021-9-19 16:27
谢谢!很有帮助!

客气,技术在于分享。
回复

使用道具 举报

21#
ID:190577 发表于 2021-9-20 16:13 | 只看该作者
cczjw 发表于 2021-9-19 16:30
期望继续。谢谢!请问 kit3.5 是否包含了 kit2 的全部功能?

这个我也没过多的研究这方面的,给不了你什么帮助。
回复

使用道具 举报

22#
ID:190577 发表于 2021-9-20 16:15 | 只看该作者
cczjw 发表于 2021-9-20 08:03
请教,proteus 8.3 在win10下安装后怎么器件库不全的呢?比如 没找到 LED和直插件的小功率电阻呢?这个版 ...

W10估计有局限性,可以安装更高的版本,高版本里面的库比较全一点,也有很多新添加的库,如proteus8.9版本。
回复

使用道具 举报

23#
ID:342822 发表于 2021-12-3 08:03 | 只看该作者
bbxyliyang 发表于 2021-9-20 16:15
W10估计有局限性,可以安装更高的版本,高版本里面的库比较全一点,也有很多新添加的库,如proteus8.9版 ...

在proteus8里这是最基本的
点击  P字符弹出对话框
搜 rse---电阻
搜 led---发光二极管

   
回复

使用道具 举报

24#
ID:342822 发表于 2021-12-3 09:22 | 只看该作者
本帖最后由 taotie 于 2021-12-3 09:39 编辑
bbxyliyang 发表于 2019-10-13 10:05
第二天开始第一个程序今天的任务,点亮一个LED,和编写一个流水灯程序。我们直接进入主题,先介绍下PIC单片 ...

晶振只接一个脚?
uchar position=0;
if(++position>=8)
  postion=0;?
小老弟学习不认真
回复

使用道具 举报

25#
ID:987542 发表于 2021-12-3 12:00 | 只看该作者
好贴,通俗易懂
回复

使用道具 举报

26#
ID:190577 发表于 2022-7-18 20:34 | 只看该作者
    #define _XTAL_FREQ 4000000 //晶振定义
    #include<pic.h> //头文件包含
//__CONFIG(0x3b31);//芯片配置字定义
// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
    //宏定义
    #define uchar unsigned char
    #define uint unsigned int
    #define RS RC0 //命令数据选择
    #define RW RC1 //读写选择
    #define EN RC2 //使能
    uint count=0;
    uchar miao,fen,shi;
    /*******************延时函数部分******************
    大约延时1ms
    ************************************************/
    void delayms(uint ms)
    {
        uchar i,j;
        for(j=ms;j>0;j--)
        for(i=110;i>0;i--);
    }
   
    /*******************1602发送主函数******************
    ************************************************/
    void LCD_WRITE(uchar data,uchar com)
    {
        RS=com;//1表示数据;0表示命令
        PORTD=data;//将数据写入
        delayms(5);//延时
        EN=1;//使能
        delayms(5);//延时
        EN=0;//关闭
    }
    /*******************1602显示主函数******************
    //指定位置显示字符
    //输入:列地址X(0~15),行地址y(0~1)
    // 字符串指针*p,要显示的字符个数num
    ************************************************/
    void disp_1602(uchar x,uchar y,uchar *p,uchar num)
    {
        uchar i;
        for(i=0;i<num;i++)
        {
        if(0==y)
        x|=0x80;//第一行地址为0x80
        else
        x|=0xc0;//第二行地址为0xC0
        LCD_WRITE(x,0); //写地址命令
        LCD_WRITE(*p,1);//写数据
        x++;//地址加
        p++;//显示字符地址加
    }
    }
    /*******************初始化函数部分******************
    ************************************************/
    void LCD_init(void)
    {
        // ADCON1=0x07;//定义RE为数据口
         TRISC0=0;
         TRISC1=0;
         TRISC2=0;//RE口为输出
         RC0=0;
         RC1=0;
         RC2=0;//初始化输出低电平
         TRISD=0;//D口为输出
         PORTD=0;//输出0
         LCD_WRITE(0x38,0);//设置8位总线,双行显示
         LCD_WRITE(0x01,0);//清屏
         LCD_WRITE(0x0c,0);//开显示,关光标
         LCD_WRITE(0x06,0);//光标右移
         LCD_WRITE(0x80,0);//第一行显示位置
    }
    /*******************主程序函数******************
************************************************/
void main(void)
{
LCD_init();//端口初始化
    T1CKPS0=1;         
    T1CKPS1=1;                //前置分频器8分频
    TMR1CS=0;                 //TMR1工作于定时器方式
    TMR1L=(65536-12500)%256;  //定时12500个时钟
    TMR1H=(65536-12500)/256;
    GIE=1;     //总中断允许
    PEIE=1;    //外围功能模块中断允许
    TMR1IE=1;  //TMR1中断允许
    TMR1ON=1;  //启动TMR1
while(1)
{
            disp_1602(0,0,"Time:",5);//第一行显示temp:
            delayms(20);
            LCD_WRITE(0x80+5,0); //写地址命令
            LCD_WRITE(shi/10+0x30,1);//写数据
            LCD_WRITE(shi%10+0x30,1);//写数据
            LCD_WRITE(':',1);//写数据
            LCD_WRITE(fen/10+0x30,1);//写数据
            LCD_WRITE(fen%10+0x30,1);//写数据
            LCD_WRITE(':',1);//写数据
            LCD_WRITE(miao/10+0x30,1);//写数据
            LCD_WRITE(miao%10+0x30,1);//写数据      
}
}
//*********************中断服务程序******************
void interrupt isr(void)
{
  if(TMR1IE&&TMR1IF)      //判断是否为TMR1中断
  {
    TMR1L=(65536-12500)%256;
    TMR1H=(65536-12500)/256;
   
    TMR1IF=0;             //清TMR1中断标志位(必须用软件清零)  
    count++;
    if(count==10)
    {
        count=0;
        miao++;
        if(miao==60)
        {
            miao=0;
            fen++;
            if(fen==60)
            {
                fen=0;
                shi++;
                if(shi==24)
                    shi=0;
            }
        }
    }
  }
}


回复

使用道具 举报

27#
ID:72649 发表于 2023-2-26 06:35 来自手机 | 只看该作者
能不能用定时器做个1秒定时
回复

使用道具 举报

28#
ID:190577 发表于 2023-3-5 13:25 | 只看该作者
hjx5548 发表于 2023-2-26 06:35
能不能用定时器做个1秒定时

可以的
回复

使用道具 举报

29#
ID:1083996 发表于 2023-8-24 11:53 | 只看该作者
这个版本和哪个版本的win兼容性最好呢
回复

使用道具 举报

30#
ID:190577 发表于 2023-11-22 14:46 | 只看该作者
量子工业 发表于 2023-8-24 11:53
这个版本和哪个版本的win兼容性最好呢

我用的W10,一直没出啥问题
回复

使用道具 举报

31#
ID:1100590 发表于 2023-11-22 20:28 | 只看该作者
ça m'aide beaucoup merci
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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