找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5816|回复: 5
收起左侧

单片机新人想请教一下为什么读取不出DHT11的数据 很急呀

[复制链接]
ID:512941 发表于 2019-4-23 10:04 | 显示全部楼层 |阅读模式
300黑币
程序是网上看的 LCD1602显示那里是自己做了点变动 串口发送数据也没有

#include  <reg51.h>
#include <intrins.h>
#define LCD1602_DB P0 //LCD1602数据总线
sbit LCD1602_RS = P3^5; //RS端
sbit LCD1602_RW = P3^6; //RW端
sbit LCD1602_EN = P3^4; //EN端
sbit DU = P2^6;//
sbit WE = P2^7;//数码管位选段选用于关闭数码管显示

typedef unsigned char  U8;      
typedef signed   char  S8;      
typedef unsigned int   U16;      
typedef signed   int   S16;      
typedef unsigned long  U32;      
typedef signed   long  S32;      
typedef float          F32;      
typedef double         F64;      
//
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit  P2_0  = P2^0 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8  U8FLAG,k;
U8  U8count,U8temp;
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;
U8  outdata[5];  //定义发送的字节数   
U8  indata[5];
U8  a1[5];
//U8  b[10];
U8  count, count_r=0;
U8  str[5];
U16 U16temp1,U16temp2;
void SendData(U8 *a)
{
        outdata[0] = a[0];
        outdata[1] = a[1];
        outdata[2] = a[2];
        outdata[3] = a[3];
        outdata[4] = a[4];
        count = 1;
        SBUF=outdata[0];
}
void Delay(U16 j)
{      
         U8 i;
   for(;j>0;j--)
{
        
        for(i=0;i<27;i++);

}
}
void  Delay_10us(void)
      {
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
       }
void  COM(void)
      {

       U8 i;

       for(i=0;i<8;i++)   
   {
     U8FLAG=2;
  while((!P2_0)&&U8FLAG++);
                Delay_10us();
    Delay_10us();
                Delay_10us();
  U8temp=0;
    if(P2_0)U8temp=1;
   U8FLAG=2;
while((P2_0)&&U8FLAG++);
  //超时则跳出for循环  
  if(U8FLAG==1)break;
  //判断数据位是0还是1  

// 如果高电平高过预定0高电平值则数据位为 1

  U8comdata<<=1;
    U8comdata|=U8temp;        //0
    }//rof

}

//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------

void RH(void)
{
//主机拉低18ms
  P2_0=0;
  Delay(180);
  P2_0=1;
//总线由上拉电阻拉高 主机延时20us
  Delay_10us();
  Delay_10us();
  Delay_10us();
  Delay_10us();
//主机设为输入 判断从机响应信号
  P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行  
  if(!P2_0) //T !  
  {
  U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束  
  while((!P2_0)&&U8FLAG++);
  U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  while((P2_0)&&U8FLAG++);
//数据接收状态  
  COM();
  U8RH_data_H_temp=U8comdata;
  COM();
  U8RH_data_L_temp=U8comdata;
  COM();
  U8T_data_H_temp=U8comdata;
  COM();
  U8T_data_L_temp=U8comdata;
  COM();
  U8checkdata_temp=U8comdata;
  P2_0=1;
//数据校验

  U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  if(U8temp==U8checkdata_temp)
{
        U8RH_data_H=U8RH_data_H_temp;
        U8RH_data_L=U8RH_data_L_temp;
        U8T_data_H=U8T_data_H_temp;
        U8T_data_L=U8T_data_L_temp;
        U8checkdata=U8checkdata_temp;
}//fi
}//fi

}
/*void Read_Busy()  //判忙函数 通过率极低 直接改延迟
{
        U8 busy;
        LCD1602_DB = 0xff;//复位数据总线
        LCD1602_RS = 0;  //拉低RS
        LCD1602_RW = 1;  //拉高RW读
do
{
        LCD1602_EN = 1;//使能EN
        busy = LCD1602_DB;//读回数据
        LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
}
        while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
}*/
void LCD1602_Write_Cmd(U8 cmd)
{
   Delay(3);
   LCD1602_RS = 0;
   LCD1602_RW = 0;
   LCD1602_DB = cmd;//写入命令
         Delay(3);
   LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
         Delay(3);
   LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
}
void LCD1602_Write_Dat(U8 dat)
{

        Delay(3);
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DB = dat;
  Delay(3);
  LCD1602_EN = 1;
  Delay(3);
  LCD1602_EN = 0;
}
void LCD1602_Dis_Str(U8 x, U8 y, U8 *str)
{
        
  if(y) x |= 0x40;
  x |= 0x80;
  LCD1602_Write_Cmd(x);
  while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}
void Init_LCD1602()
{
  LCD1602_Write_Cmd(0x38); // 设置16*2显示,5*7点阵,8位数据接口
  LCD1602_Write_Cmd(0x0c); //开显示
  LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
  LCD1602_Write_Cmd(0x01); //清除显示
}
void lcddisplay()
{
  U8 temperature[] = {"temp:           "};
  U8 humidity [] = {"humi:         RH"};
  DU = 0;
  WE = 0;//关闭数码管显示
  Init_LCD1602();//1602初始化
  LCD1602_Dis_Str(0, 0, &temperature[0]); //显示字符串
  LCD1602_Dis_Str(0, 1, & humidity [0]); //显示字符串
  a1[0]=U8RH_data_H;
  a1[1]=U8RH_data_L;
  a1[2]=U8T_data_H;
  a1[3]=U8T_data_L;
  a1[4]=U8checkdata;
temperature [5] =(0x30+a1[2]/10);
        temperature [6] =(0x30+a1[2]%10);
        /*temperature [7] ='.';
        temperature [8] =(0x30+a1[3]/100);
        temperature [9] =(0x30+(a1[3])/10);*/
        temperature [14] =(0xdf);
        temperature [15] =(0x43);
        humidity [5] =(0x30+a1[0]/10);
        humidity [6] =(0x30+a1[0]%10);
        /*humidity [7] ='.';
        humidity [8] =(0x30+a1[1]/100);
        humidity [9] =(0x30+(a1[1])/10);*/
        LCD1602_Dis_Str(5, 0, & temperature [5]);
        LCD1602_Dis_Str(6, 0, & temperature [6]);
        //LCD1602_Dis_Str(7, 0, & temperature [7]);
        //LCD1602_Dis_Str(8, 0, & temperature [8]);
        //LCD1602_Dis_Str(9, 0, & temperature [9]);
        LCD1602_Dis_Str(14, 0, & temperature [14]);
        LCD1602_Dis_Str(15, 0, & temperature [15]);
        LCD1602_Dis_Str(5, 1, & humidity [5]);
        LCD1602_Dis_Str(6, 1, & humidity [6]);
        //LCD1602_Dis_Str(7, 1, & humidity [7]);
        //LCD1602_Dis_Str(8, 1, & humidity [8]);
        //LCD1602_Dis_Str(9, 1, & humidity [9]);

}
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz 串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{

  //uchar str[5]={"12345"};
        /* 系统初始化 */
        TMOD = 0x20;  //定时器T1使用工作方式2
        TH1 = 253;        // 设置初值
        TL1 = 253;
        TR1 = 1;          // 开始计时
        SCON = 0x50;  //工作方式1,波特率9600bps,允许接收   
        ES = 1;
        EA = 1;           // 打开所以中断   
        TI = 0;
        RI = 0;
        SendData(str) ;   //发送到串口
        Delay(1);         //延时100US(12M晶振)
        while(1)
{  

  //------------------------
  //调用温湿度读取子程序
  RH();
  //串口显示程序
  //--------------------------

  str[0]=U8RH_data_H;
  str[1]=U8RH_data_L;
  str[2]=U8T_data_H;
  str[3]=U8T_data_L;
  str[4]=U8checkdata;
  SendData(str) ;  //发送到串口  
  //读取模块数据周期不易小于 2S
        lcddisplay();
                Delay(20000);
}//elihw
}// main

        void RSINTR() interrupt 4 using 2
{
        U8 InPut3;
        if(TI==1) //发送中断  
        {
        TI=0;
        if(count!=5) //发送完5位数据  
{
        SBUF= outdata[count];
        count++;
}
}

        if(RI==1) //接收中断  
{
        InPut3=SBUF;
        indata[count_r]=InPut3;
        count_r++;
        RI=0;  
        if (count_r==5)//接收完4位数据
{
        //数据接收完毕处理。
        count_r=0;
        str[0]=indata[0];
        str[1]=indata[1];
        str[2]=indata[2];
        str[3]=indata[3];
        str[4]=indata[4];
        P0=0;
}
}
}

微信图片_20190423095936.jpg
回复

使用道具 举报

ID:512941 发表于 2019-4-23 10:14 | 显示全部楼层
  1. #include  <reg51.h>
  2. #include <intrins.h>
  3. #define LCD1602_DB P0 //LCD1602数据总线
  4. sbit LCD1602_RS = P3^5; //RS端
  5. sbit LCD1602_RW = P3^6; //RW端
  6. sbit LCD1602_EN = P3^4; //EN端
  7. sbit DU = P2^6;//
  8. sbit WE = P2^7;//数码管位选段选用于关闭数码管显示

  9. typedef unsigned char  U8;      
  10. typedef signed   char  S8;      
  11. typedef unsigned int   U16;      
  12. typedef signed   int   S16;      
  13. typedef unsigned long  U32;      
  14. typedef signed   long  S32;      
  15. typedef float          F32;      
  16. typedef double         F64;      
  17. //
  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define   Data_0_time    4
  21. //----------------------------------------------//
  22. //----------------IO口定义区--------------------//
  23. //----------------------------------------------//
  24. sbit  P2_0  = P2^0 ;
  25. //----------------------------------------------//
  26. //----------------定义区--------------------//
  27. //----------------------------------------------//
  28. U8  U8FLAG,k;
  29. U8  U8count,U8temp;
  30. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  31. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  32. U8  U8comdata;
  33. U8  outdata[5];  //定义发送的字节数   
  34. U8  indata[5];
  35. U8  a1[5];
  36. //U8  b[10];
  37. U8  count, count_r=0;
  38. U8  str[5];
  39. U16 U16temp1,U16temp2;
  40. void SendData(U8 *a)
  41. {
  42.         outdata[0] = a[0];
  43.         outdata[1] = a[1];
  44.         outdata[2] = a[2];
  45.         outdata[3] = a[3];
  46.         outdata[4] = a[4];
  47.         count = 1;
  48.         SBUF=outdata[0];
  49. }
  50. void Delay(U16 j)
  51. {      
  52.          U8 i;
  53.    for(;j>0;j--)
  54. {
  55.        
  56.         for(i=0;i<27;i++);

  57. }
  58. }
  59. void  Delay_10us(void)
  60.       {
  61.         U8 i;
  62.         i--;
  63.         i--;
  64.         i--;
  65.         i--;
  66.         i--;
  67.         i--;
  68.        }
  69. void  COM(void)
  70.       {
  71.      
  72.        U8 i;
  73.          
  74.        for(i=0;i<8;i++)   
  75.    {
  76.      U8FLAG=2;
  77.   while((!P2_0)&&U8FLAG++);
  78.                 Delay_10us();
  79.     Delay_10us();
  80.                 Delay_10us();
  81.   U8temp=0;
  82.     if(P2_0)U8temp=1;
  83.    U8FLAG=2;
  84. while((P2_0)&&U8FLAG++);
  85.   //超时则跳出for循环  
  86.   if(U8FLAG==1)break;
  87.   //判断数据位是0还是1  
  88.    
  89. // 如果高电平高过预定0高电平值则数据位为 1
  90.    
  91.   U8comdata<<=1;
  92.     U8comdata|=U8temp;        //0
  93.     }//rof
  94.   
  95. }

  96. //--------------------------------
  97. //-----湿度读取子程序 ------------
  98. //--------------------------------
  99. //----以下变量均为全局变量--------
  100. //----温度高8位== U8T_data_H------
  101. //----温度低8位== U8T_data_L------
  102. //----湿度高8位== U8RH_data_H-----
  103. //----湿度低8位== U8RH_data_L-----
  104. //----校验 8位 == U8checkdata-----
  105. //----调用相关子程序如下----------
  106. //---- Delay();, Delay_10us();,COM();
  107. //--------------------------------

  108. void RH(void)
  109. {
  110. //主机拉低18ms
  111.   P2_0=0;
  112.   Delay(180);
  113.   P2_0=1;
  114. //总线由上拉电阻拉高 主机延时20us
  115.   Delay_10us();
  116.   Delay_10us();
  117.   Delay_10us();
  118.   Delay_10us();
  119. //主机设为输入 判断从机响应信号
  120.   P2_0=1;
  121. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行  
  122.   if(!P2_0) //T !  
  123.   {
  124.   U8FLAG=2;
  125. //判断从机是否发出 80us 的低电平响应信号是否结束  
  126.   while((!P2_0)&&U8FLAG++);
  127.   U8FLAG=2;
  128. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  129.   while((P2_0)&&U8FLAG++);
  130. //数据接收状态  
  131.   COM();
  132.   U8RH_data_H_temp=U8comdata;
  133.   COM();
  134.   U8RH_data_L_temp=U8comdata;
  135.   COM();
  136.   U8T_data_H_temp=U8comdata;
  137.   COM();
  138.   U8T_data_L_temp=U8comdata;
  139.   COM();
  140.   U8checkdata_temp=U8comdata;
  141.   P2_0=1;
  142. //数据校验

  143.   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  144.   if(U8temp==U8checkdata_temp)
  145. {
  146.         U8RH_data_H=U8RH_data_H_temp;
  147.         U8RH_data_L=U8RH_data_L_temp;
  148.         U8T_data_H=U8T_data_H_temp;
  149.         U8T_data_L=U8T_data_L_temp;
  150.         U8checkdata=U8checkdata_temp;
  151. }//fi
  152. }//fi

  153. }
  154. /*void Read_Busy()  //判忙函数 通过率极低 直接改延迟
  155. {
  156.         U8 busy;
  157.         LCD1602_DB = 0xff;//复位数据总线
  158.         LCD1602_RS = 0;  //拉低RS
  159.         LCD1602_RW = 1;  //拉高RW读
  160. do
  161. {
  162.         LCD1602_EN = 1;//使能EN
  163.         busy = LCD1602_DB;//读回数据
  164.         LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
  165. }
  166.         while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
  167. }*/
  168. void LCD1602_Write_Cmd(U8 cmd)
  169. {
  170.    Delay(3);
  171.    LCD1602_RS = 0;
  172.    LCD1602_RW = 0;
  173.    LCD1602_DB = cmd;//写入命令
  174.          Delay(3);
  175.    LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
  176.          Delay(3);
  177.    LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
  178. }
  179. void LCD1602_Write_Dat(U8 dat)
  180. {

  181.         Delay(3);
  182.   LCD1602_RS = 1;
  183.   LCD1602_RW = 0;
  184.   LCD1602_DB = dat;
  185.   Delay(3);
  186.   LCD1602_EN = 1;
  187.   Delay(3);
  188.   LCD1602_EN = 0;
  189. }
  190. void LCD1602_Dis_Str(U8 x, U8 y, U8 *str)
  191. {
  192.        
  193.   if(y) x |= 0x40;
  194.   x |= 0x80;
  195.   LCD1602_Write_Cmd(x);
  196.   while(*str != '\0')
  197. {
  198. LCD1602_Write_Dat(*str++);
  199. }
  200. }
  201. void Init_LCD1602()
  202. {
  203.   LCD1602_Write_Cmd(0x38); // 设置16*2显示,5*7点阵,8位数据接口
  204.   LCD1602_Write_Cmd(0x0c); //开显示
  205.   LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
  206.   LCD1602_Write_Cmd(0x01); //清除显示
  207. }
  208. void lcddisplay()
  209. {
  210.   U8 temperature[] = {"temp:           "};
  211.   U8 humidity [] = {"humi:         RH"};
  212.   DU = 0;
  213.   WE = 0;//关闭数码管显示
  214.   Init_LCD1602();//1602初始化
  215.   LCD1602_Dis_Str(0, 0, &temperature[0]); //显示字符串
  216.   LCD1602_Dis_Str(0, 1, & humidity [0]); //显示字符串
  217.   a1[0]=U8RH_data_H;
  218.   a1[1]=U8RH_data_L;
  219.   a1[2]=U8T_data_H;
  220.   a1[3]=U8T_data_L;
  221.   a1[4]=U8checkdata;
  222. temperature [5] =(0x30+a1[2]/10);
  223.         temperature [6] =(0x30+a1[2]%10);
  224.         /*temperature [7] ='.';
  225.         temperature [8] =(0x30+a1[3]/100);
  226.         temperature [9] =(0x30+(a1[3])/10);*/
  227.         temperature [14] =(0xdf);
  228.         temperature [15] =(0x43);
  229.         humidity [5] =(0x30+a1[0]/10);
  230.         humidity [6] =(0x30+a1[0]%10);
  231.         /*humidity [7] ='.';
  232.         humidity [8] =(0x30+a1[1]/100);
  233.         humidity [9] =(0x30+(a1[1])/10);*/
  234.         LCD1602_Dis_Str(5, 0, & temperature [5]);
  235.         LCD1602_Dis_Str(6, 0, & temperature [6]);
  236.         //LCD1602_Dis_Str(7, 0, & temperature [7]);
  237.         //LCD1602_Dis_Str(8, 0, & temperature [8]);
  238.         //LCD1602_Dis_Str(9, 0, & temperature [9]);
  239.         LCD1602_Dis_Str(14, 0, & temperature [14]);
  240.         LCD1602_Dis_Str(15, 0, & temperature [15]);
  241.         LCD1602_Dis_Str(5, 1, & humidity [5]);
  242.         LCD1602_Dis_Str(6, 1, & humidity [6]);
  243.         //LCD1602_Dis_Str(7, 1, & humidity [7]);
  244.         //LCD1602_Dis_Str(8, 1, & humidity [8]);
  245.         //LCD1602_Dis_Str(9, 1, & humidity [9]);

  246. }
  247. //----------------------------------------------
  248. //main()功能描述:  AT89C51  11.0592MHz 串口发
  249. //送温湿度数据,波特率 9600
  250. //----------------------------------------------
  251. void main()
  252. {

  253.   //uchar str[5]={"12345"};
  254.         /* 系统初始化 */
  255.         TMOD = 0x20;  //定时器T1使用工作方式2
  256.         TH1 = 253;        // 设置初值
  257.         TL1 = 253;
  258.         TR1 = 1;          // 开始计时
  259.         SCON = 0x50;  //工作方式1,波特率9600bps,允许接收   
  260.         ES = 1;
  261.         EA = 1;           // 打开所以中断   
  262.         TI = 0;
  263.         RI = 0;
  264.         SendData(str) ;   //发送到串口
  265.         Delay(1);         //延时100US(12M晶振)
  266.         while(1)
  267. {  

  268.   //------------------------
  269.   //调用温湿度读取子程序
  270.   RH();
  271.   //串口显示程序
  272.   //--------------------------

  273.   str[0]=U8RH_data_H;
  274.   str[1]=U8RH_data_L;
  275.   str[2]=U8T_data_H;
  276.   str[3]=U8T_data_L;
  277.   str[4]=U8checkdata;
  278.   SendData(str) ;  //发送到串口  
  279.   //读取模块数据周期不易小于 2S
  280.         lcddisplay();
  281.                 Delay(20000);
  282. }//elihw
  283. }// main

  284.         void RSINTR() interrupt 4 using 2
  285. {
  286.         U8 InPut3;
  287.         if(TI==1) //发送中断  
  288.         {
  289.         TI=0;
  290.         if(count!=5) //发送完5位数据  
  291. {
  292.         SBUF= outdata[count];
  293.         count++;
  294. }
  295. }

  296.         if(RI==1) //接收中断  
  297. {
  298.         InPut3=SBUF;
  299.         indata[count_r]=InPut3;
  300.         count_r++;
  301.         RI=0;  
  302.         if (count_r==5)//接收完4位数据
  303. {
  304.         //数据接收完毕处理。
  305.         count_r=0;
  306.         str[0]=indata[0];
  307.         str[1]=indata[1];
  308.         str[2]=indata[2];
  309.         str[3]=indata[3];
  310.         str[4]=indata[4];
  311.         P0=0;
  312. }
  313. }
  314. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2019-4-23 11:58 | 显示全部楼层
再研读过DHT11的数据手册,与你的程序作个对比。
回复

使用道具 举报

ID:512941 发表于 2019-4-23 14:54 | 显示全部楼层
yzwzfyz 发表于 2019-4-23 11:58
再研读过DHT11的数据手册,与你的程序作个对比。

就是按照DHT11的时序图来的 看了好几天了。
回复

使用道具 举报

ID:110606 发表于 2019-4-23 15:10 | 显示全部楼层
我帮你分析一下,
如果你只改动显示程序,其他的都没有改动,那么串口输出应该不会有问题
回复

使用道具 举报

ID:110606 发表于 2019-4-23 15:15 | 显示全部楼层
所以我有这样的建议,你可以试一下
1.使用原程序,显示肯定不对,不用管,看串口,如果串口发的数据也不对,那么要么就是你DHT11插的引脚不对,要么就是原程序不对
2.找一个串口好用的程序,把DHT11部分的程序复制过去,这样DHT读取是好用的,然后再研究1602
不要期望在网上找的东西都好用,学电子就是不断的解决问题,加油!

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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