找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机时钟为什么实际和仿真上的时间不一样呢?

[复制链接]
跳转到指定楼层
楼主
不是应该在烧录程序的时候会和电脑上的时间一致吗?
仿真上显示的是正确的时间,但烧录到开发板上的时间就不对,年份初始化为13-01-01,时间为00:00:00,星期为星期一(应该是星期二才对)不想加按键调时,这个问题可以解决吗?

附上仿真图和实际图




以下附单片机代码部分:

  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  4. #include "eeprom52.h"
  5. #include "intrins.h"

  6. bit flag_200ms ;
  7. bit flag_100ms ;

  8. sbit dq   = P3^7;          //18b20 IO口的定义

  9. uint temperature ;    //温度变量

  10. uchar menu_1,menu_2;

  11. #include "ds1302.h"
  12. #include "lcd1602.h"

  13. /******************把数据保存到单片机内部eeprom中******************/
  14. void write_eeprom(){
  15.         SectorErase(0x2000);
  16.         byte_write(0x2000, fen1);
  17.         byte_write(0x2001, shi1);
  18.         byte_write(0x2002, open1);
  19.         byte_write(0x2058, a_a);        
  20. }

  21. /******************把数据从单片机内部eeprom中读出来*****************/
  22. void read_eeprom(){
  23.         fen1  = byte_read(0x2000);
  24.         shi1  = byte_read(0x2001);
  25.         open1 = byte_read(0x2002);
  26.         a_a   = byte_read(0x2058);
  27. }

  28. /**************开机自检eeprom初始化*****************/
  29. void init_eeprom(){
  30.         read_eeprom();                //先读
  31.         if(a_a != 1)                //新的单片机初始单片机内问eeprom
  32.         {
  33.                 fen1  = 3;
  34.                 shi1  = 8;
  35.                 open1  = 1;
  36.                 a_a = 1;
  37.                 write_eeprom();           //保存数据
  38.         }        
  39. }

  40. /***********************18b20初始化函数*****************************/
  41. void init_18b20(){
  42.         bit q;
  43.         dq = 1;                                //把总线拿高
  44.         delay_uint(1);            //15us
  45.         dq = 0;                                //给复位脉冲
  46.         delay_uint(80);                //750us
  47.         dq = 1;                                //把总线拿高 等待
  48.         delay_uint(10);                //110us
  49.         q = dq;                                //读取18b20初始化信号
  50.         delay_uint(20);                //200us
  51.         dq = 1;                                //把总线拿高 释放总线
  52. }

  53. /*************写18b20内的数据***************/
  54. void write_18b20(uchar dat){
  55.         uchar i;
  56.         for(i=0;i<8;i++){                                         //写数据是低位开始
  57.                 dq = 0;                         //把总线拿低写时间隙开始
  58.                 dq = dat & 0x01; //向18b20总线写数据了
  59.                 delay_uint(5);         // 60us
  60.                 dq = 1;                         //释放总线
  61.                 dat >>= 1;
  62.         }        
  63. }

  64. /*************读取18b20内的数据***************/
  65. uchar read_18b20(){
  66.         uchar i,value;
  67.         for(i=0;i<8;i++){
  68.                 dq = 0;                         //把总线拿低读时间隙开始
  69.                 value >>= 1;         //读数据是低位开始
  70.                 dq = 1;                         //释放总线
  71.                 if(dq == 1)                 //开始读写数据
  72.                         value |= 0x80;
  73.                 delay_uint(5);         //60us        读一个时间隙最少要保持60us的时间
  74.         }
  75.         return value;                 //返回数据
  76. }

  77. /*************读取温度的值 读出来的是小数***************/
  78. uint read_temp(){
  79.         uint value;
  80.         uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
  81.         init_18b20();                   //初始化18b20
  82.         write_18b20(0xcc);           //跳过64位ROM
  83.         write_18b20(0x44);           //启动一次温度转换命令
  84.         delay_uint(50);                   //500us
  85.         init_18b20();                   //初始化18b20
  86.         write_18b20(0xcc);           //跳过64位ROM
  87.         write_18b20(0xbe);           //发出读取暂存器命令
  88.         EA = 0;
  89.         low = read_18b20();           //读温度低字节
  90.         value = read_18b20();  //读温度高字节
  91.         EA = 1;
  92.         value <<= 8;                   //把温度的高位左移8位
  93.         value |= low;                   //把读出的温度低位放到value的低八位中
  94.         value *= 0.625;               //转换到温度值 小数
  95.         return value;                   //返回读出的温度 带小数
  96. }

  97. /******************1ms 延时函数*******************/
  98. void delay_1ms(uint q){
  99.         uint i,j;
  100.         for(i=0;i<q;i++)
  101.                 for(j=0;j<120;j++);
  102. }

  103. /******************写星期函数*******************/
  104. void write_week(uchar hang,uchar add,uchar week)//写星期函数
  105. {
  106.         if(hang==1)   
  107.                 write_com(0x80+add);
  108.         else
  109.                 write_com(0x80+0x40+add);         
  110.         switch(week){
  111.                 case 1:write_data('M');//星期数为1时,显示
  112.                            write_data('O');
  113.                            write_data('N');
  114.                            break;
  115.            
  116.                 case 2:write_data('T');//星期数据为2时显示
  117.                            write_data('U');
  118.                            write_data('E');
  119.                            break;
  120.                
  121.                 case 3:write_data('W');//星期数据为3时显示
  122.                            write_data('E');
  123.                            write_data('D');
  124.                            break;
  125.                
  126.                 case 4:write_data('T');//星期数据为4是显示
  127.                            write_data('H');
  128.                            write_data('U');
  129.                            break;
  130.                
  131.                 case 5:write_data('F');//星期数据为5时显示
  132.                            write_data('R');
  133.                            write_data('I');
  134.                            break;
  135.                
  136.                 case 6:write_data('S');//星期数据为6时显示
  137.                            write_data('T');
  138.                            write_data('A');
  139.                            break;
  140.                
  141.                 case 7:write_data('S');//星期数据为7时显示
  142.                            write_data('U');
  143.                            write_data('N');
  144.                            break;
  145.         }
  146. }

  147. /*************时钟显示***************/
  148. void init_1602_ds1302(){
  149.         write_sfm2_ds1302(1,1,shi);                   //显示时
  150.         write_sfm2_ds1302(1,4,fen);                   //显示分
  151.         write_sfm2_ds1302(1,7,miao);           //显示秒
  152.         write_week(2,12,week);                                                //显示星期
  153.         write_sfm3_18B20(1,11,temperature);           //显示温度
  154.         
  155.         write_sfm2_ds1302(2,2,nian);   //显示年
  156.         write_sfm2_ds1302(2,5,yue);           //显示月        
  157.         write_sfm2_ds1302(2,8,ri);           //显示日         
  158. }                                                                           

  159. /*************定时器0初始化程序***************/
  160. void init_time0()          {
  161.         EA   = 1;                   //开总中断
  162.         TMOD = 0X01;          //定时器0、工作方式1
  163.         ET0  = 1;                  //开定时器0中断
  164.         TR0  = 1;                  //允许定时器0定时
  165. }

  166. /*****************主函数********************/
  167. void main(){        
  168.         delay_1ms(150);
  169.         P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
  170.         init_time0();                 //初始化定时器
  171.         init_ds1302();                 //ds1302初始化
  172.         init_1602();                 //lcd1602初始化
  173.         init_1602_dis_csf(); //lcd1602初始化显示
  174.         init_eeprom();       //开始初始化保存的数据
  175.         temperature = read_temp();        //先读出温度的值
  176.         delay_1ms(650);
  177.         temperature = read_temp();        //先读出温度的值
  178.         while(1){
  179.                 if(flag_200ms == 1){        
  180.                         flag_200ms = 0;
  181.                         if(menu_1 == 0){
  182.                                 read_time();                  //读时间
  183.                                 temperature = read_temp();        //先读出温度的值
  184.                                 init_1602_ds1302();   //显示时钟
  185.                         }
  186.                 }
  187.                 delay_1ms(1);
  188.         }
  189. }

  190. /**************定时器0中断程序*****************/
  191. void time0() interrupt 1{                        
  192.         static uchar value;
  193.         TH0 = 0X3C;
  194.         TL0 = 0XB0;           //50ms
  195.         value ++;           
  196.         if((value % 2) == 0)         //100ms  
  197.                 flag_100ms = 1;         
  198.         if(value >= 6)                         //200ms
  199.         {
  200.                 value = 0;
  201.                 flag_200ms = 1;
  202.         }
  203. }



  204. //////////////////////////*****************************************//////////
  205. #ifndef _DS1302_H_
  206. #define _DS1302_H_

  207. /******************
  208.         ds1302 内部RAM   RAM0  1100 000R/W   1读 0写
  209.                                          RAM1  1100 001R/W  
  210.                                                .......
  211.                                          RAM30 1111 110R/W   
  212. ********************/

  213. sbit clk = P3^6;          //ds1302时钟线定义
  214. sbit io =  P3^4;          //数据线
  215. sbit rst = P3^5;          //复位线
  216.                                                 //秒  分   时   日   月  年   星期         
  217. uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //写地址
  218. uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //读地址
  219. uchar code init_ds[]  ={0x58,0x00,0x00,0x01,0x01,0x13,0x01};

  220. //uchar miao,fen,shi,ri,yue,week,nian;
  221. uchar  miao,fen,shi,ri,yue,week,nian;        
  222. uchar i;
  223. uchar fen1=0x11,shi1=0;          //两个闹钟变量的定义
  224. bit open1;

  225. /*************写一个数据到对应的地址里***************/
  226. void write_ds1302(uchar add,uchar dat)
  227. {               
  228.         rst = 1;                         //把复位线拉高
  229.         for(i=0;i<8;i++){                                     //低位在前
  230.                 clk = 0;                 //时钟线拿低开始写数据
  231.                 io = add & 0x01;            
  232.                 add >>= 1;                 //把地址右移一位
  233.                 clk = 1;                 //时钟线拿高
  234.         }        
  235.         for(i=0;i<8;i++){
  236.                 clk = 0;                 //时钟线拿低开始写数据
  237.                 io = dat & 0x01;
  238.                 dat >>= 1;                 //把数据右移一位
  239.                 clk = 1;                 //时钟线拿高
  240.         }
  241.         rst = 0;                         //复位线合低
  242.         clk = 0;
  243.         io = 0;
  244. }

  245. /*************从对应的地址读一个数据出来***************/
  246. uchar read_ds1302(uchar add){
  247.         uchar value,i;
  248.         rst = 1;                         //把复位线拿高
  249.         for(i=0;i<8;i++){                                     //低位在前
  250.                 clk = 0;                 //时钟线拿低开始写数据
  251.                 io = add & 0x01;            
  252.                 add >>= 1;                 //把地址右移一位
  253.                 clk = 1;                 //时钟线拿高
  254.         }               
  255.         for(i=0;i<8;i++){
  256.                 clk = 0;                 //时钟线拿低开始读数据
  257.                 value >>= 1;
  258.                 if(io == 1)
  259.                         value |= 0x80;
  260.                 clk = 1;                 //时钟线拿高
  261.         }
  262.         rst = 0;                         //复位线合低
  263.         clk = 0;
  264.         io = 0;
  265.         return value;                 //返回读出来的数据
  266. }

  267. /*************把要的时间 年月日 都读出来***************/
  268. void read_time(){
  269.         miao = read_ds1302(read_add[0]);        //读秒
  270.         fen  = read_ds1302(read_add[1]);        //读分
  271.         shi  = read_ds1302(read_add[2]);        //读时
  272.         ri   = read_ds1302(read_add[3]);        //读日
  273.         yue  = read_ds1302(read_add[4]);        //读月
  274.         nian = read_ds1302(read_add[5]);        //读年
  275.         week = read_ds1302(read_add[6]);        //读星期           
  276. }

  277. /*************把要写的时间 年月日 都写入ds1302里***************/
  278. void write_time(){
  279.         write_ds1302(0x8e,0x00);                        //打开写保护
  280.         write_ds1302(write_add[0],miao);        //写秒
  281.         write_ds1302(write_add[1],fen);                //写分
  282.         write_ds1302(write_add[2],shi);                //写时
  283.         write_ds1302(write_add[3],ri);                //写日
  284.         write_ds1302(write_add[4],yue);                //写月
  285.         write_ds1302(write_add[5],nian);        //写年
  286.         write_ds1302(write_add[6],week);        //写星期
  287.         write_ds1302(0x8e,0x80);                        //关闭写保护
  288. }

  289. /*************把数据保存到ds1302 RAM中**0-31*************/
  290. void write_ds1302ram(uchar add,uchar dat){
  291.         add <<= 1;     //地址是从第二位开始的
  292.         add &= 0xfe;   //把最低位清零  是写的命令
  293.         add |= 0xc0;   //地址最高两位为 1  
  294.         write_ds1302(0x8e,0x00);
  295.         write_ds1302(add,dat);        
  296.         write_ds1302(0x8e,0x80);
  297. }

  298. /*************把数据从ds1302 RAM读出来**0-31*************/
  299. uchar read_ds1302ram(uchar add){
  300.         add <<= 1;     //地址是从第二位开始的
  301.         add |= 0x01;   //把最高位置1  是读命令
  302.         add |= 0xc0;   //地址最高两位为 1  
  303.         return(read_ds1302(add));        
  304. }

  305. /*************初始化ds1302时间***************/
  306. void init_ds1302(){
  307.         uchar i;
  308.         rst = 0;        //第一次读写数据时要把IO口拿低
  309.         clk = 0;
  310.         io = 0;
  311.         i = read_ds1302ram(30);///***DS1302与RAM相关的寄存器,单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH~FDH***///
  312.                                                    ///***把数据从30地址中毒出来***///
  313.         if(i != 3){        
  314.                 i = 3;
  315.                 write_ds1302ram(30,i);                         //4050   4100                 3080

  316.                 write_ds1302(0x8e,0x00);                    //打开写保护
  317.                 for(i=0;i<7;i++)
  318.                         write_ds1302(write_add[i],init_ds[i]);        //把最高位值0 允许ds1302工作
  319.                 write_ds1302(0x8e,0x80);        //关写保护
  320.         }
  321. }
  322. #endif











  323. //////////////////////////*****************************************//////////
  324. #ifndef _EEPROM52_H_
  325. #define _EEPROM52_H_
  326. uchar a_a;
  327. #include <intrins.h>

  328. #define RdCommand 0x01 //定义ISP的操作命令
  329. #define PrgCommand 0x02
  330. #define EraseCommand 0x03
  331. #define Error 1
  332. #define Ok 0
  333. #define WaitTime 0x01 //定义CPU的等待时间
  334. sfr ISP_DATA=0xe2;  //寄存器申明
  335. sfr ISP_ADDRH=0xe3;
  336. sfr ISP_ADDRL=0xe4;
  337. sfr ISP_CMD=0xe5;
  338. sfr ISP_TRIG=0xe6;
  339. sfr ISP_CONTR=0xe7;

  340. /* ================ 打开 ISP,IAP 功能 ================= */
  341. void ISP_IAP_enable(void){
  342.          EA = 0;       /* 关中断   */
  343.          ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  344.          ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
  345.          ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  346. }

  347. /* =============== 关闭 ISP,IAP 功能 ================== */
  348. void ISP_IAP_disable(void){
  349.          ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  350.          ISP_TRIG = 0x00;
  351.          EA   =   1;   /* 开中断 */
  352. }

  353. /* ================ 公用的触发代码 ==================== */
  354. void ISPgoon(void){
  355.          ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
  356.          ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
  357.          ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
  358.          _nop_();
  359. }

  360. /* ==================== 字节读 ======================== */
  361. unsigned char byte_read(unsigned int byte_addr)
  362. {
  363.         EA = 0;
  364.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
  365.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  366.          ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
  367.          ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
  368.          ISPgoon();       /* 触发执行  */
  369.          ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  370.          EA  = 1;
  371.          return (ISP_DATA);    /* 返回读到的数据 */
  372. }

  373. /* ================== 扇区擦除 ======================== */
  374. void SectorErase(unsigned int sector_addr){
  375.          unsigned int iSectorAddr;
  376.          iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
  377.          ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  378.          ISP_ADDRL = 0x00;
  379.          ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
  380.          ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
  381.          ISPgoon();       /* 触发执行  */
  382.          ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  383. }

  384. /* ==================== 字节写 ======================== */
  385. void byte_write(unsigned int byte_addr, unsigned char original_data){
  386.          EA  = 0;
  387. //         SectorErase(byte_addr);
  388.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
  389.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  390.          ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
  391.          ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 */
  392.          ISP_DATA = original_data;   /* 写入数据准备 */
  393.          ISPgoon();       /* 触发执行  */
  394.          ISP_IAP_disable();     /* 关闭IAP功能 */
  395.          EA =1;
  396. }
  397. #endif








  398. //////////////////////////*****************************************//////////
  399. #ifndef _LCD1602_H_
  400. #define _LCD1602_H_

  401. #define uchar unsigned char
  402. #define uint unsigned int

  403. #define data_1602 P0
  404. uchar code table_num[]="0123456789abcdefg";

  405. sbit rs=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  406. sbit rw=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  407. sbit e =P2^7;         //片选信号   下降沿触发

  408. /***********************延时函数************************/
  409. void delay_uint(uint q){
  410.         while(q--);
  411. }

  412. /***********************lcd1602写命令函数************************/
  413. void write_com(uchar com){
  414.         e=0;
  415.         rs=0;
  416.         rw=0;
  417.         P0=com;
  418.         delay_uint(3);
  419.         e=1;
  420.         delay_uint(25);
  421.         e=0;
  422. }

  423. /***********************lcd1602写数据函数************************/
  424. void write_data(uchar dat){
  425.         e=0;
  426.         rs=1;
  427.         rw=0;
  428.         P0=dat;
  429.         delay_uint(3);
  430.         e=1;
  431.         delay_uint(25);
  432.         e=0;        
  433. }

  434. /***********************lcd1602初始化设置************************/
  435. void init_1602()         //lcd1602初始化设置
  436. {
  437.         write_com(0x38);        //
  438.         write_com(0x0c);
  439.         write_com(0x06);
  440. }

  441. /***********************lcd1602上显示两位十进制数************************/
  442. void write_sfm1(uchar hang,uchar add,uchar date)        ///***显示星期函数***从十位开始写///
  443. {
  444.         if(hang==1)   
  445.                 write_com(0x80+add);
  446.         else
  447.                 write_com(0x80+0x40+add);
  448.         write_data(table_num[date % 10]);        
  449. }  

  450. /***********************lcd1602上显示两位十进制数************************/
  451. void write_sfm2(uchar hang,uchar add,uchar date)  ///***显示时分秒函数***从十位开始写///
  452. {
  453.         if(hang==1)   
  454.                 write_com(0x80+add);
  455.         else
  456.                 write_com(0x80+0x40+add);
  457.         write_data(table_num[date / 10 % 10]);        
  458.         write_data(table_num[date % 10]);        
  459. }


  460. /***********************lcd1602上显示两位十进制数************************/
  461. void write_sfm3_18B20(uchar hang,uchar add,uint date)  ///***显示温度函数***从十位开始写///
  462. {
  463.         if(hang==1)   
  464.                 write_com(0x80+add);
  465.         else
  466.                 write_com(0x80+0x40+add);
  467.         write_data(0x30+date/100%10);
  468.         write_data(0x30+date/10%10);
  469.         write_data('.');
  470.         write_data(0x30+date%10);        
  471. }



  472. /***********************lcd1602上显示两位十进制数************************/
  473. void write_sfm2_ds1302(uchar hang,uchar add,uchar date){
  474.         if(hang==1)   
  475.                 write_com(0x80+add);
  476.         else
  477.                 write_com(0x80+0x40+add);         
  478.         write_data(table_num[date/16]);
  479.         write_data(table_num[date%16]);        
  480. }

  481. /***********************lcd1602上显示这字符函数************************/
  482. void write_string(uchar hang,uchar add,uchar *p){
  483.         if(hang==1)   
  484.                 write_com(0x80+add);
  485.         else
  486.                 write_com(0x80+0x40+add);
  487.                 while(1)                                                                                                                 
  488.                 {
  489.                         if(*p == '\0')  break;
  490.                         write_data(*p);
  491.                         p++;
  492.                 }        
  493. }

  494. /*****************控制光标函数********************/
  495. void write_guanbiao(uchar hang,uchar add,uchar date){               
  496.         if(hang==1)   
  497.                 write_com(0x80+add);
  498.         else
  499.                 write_com(0x80+0x40+add);
  500.         if(date == 1)
  501.                 write_com(0x0f);     //显示光标并且闪烁        
  502.         else
  503.                 write_com(0x0c);   //关闭光标
  504. }        

  505. /***********************lcd1602上显示特定的字符************************/
  506. void write_zifu(uchar hang,uchar add,uchar date){
  507.         if(hang==1)   
  508.                 write_com(0x80+add);
  509.         else
  510.                 write_com(0x80+0x40+add);
  511.         write_data(date);        
  512. }

  513. /***********************lcd1602清除显示************************/
  514. void clear_1602(){
  515.         write_string(1,0,"                ");
  516.         write_string(2,0,"                ");
  517. }

  518. /****************开机液晶显示函数 初始化液晶的内容********************************/
  519. void init_1602_dis_csf()  //初始化液晶
  520. {
  521.         write_string(1,0,"   :  :    00.0");               
  522.         write_string(2,0,"20  -  -       ");        
  523.         write_zifu(1,15,0xdf);  //显示度        
  524. }
  525. #endif
复制代码



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

使用道具 举报

沙发
ID:303383 发表于 2018-5-9 23:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:293977 发表于 2018-5-9 23:23 | 只看该作者
因为时间信息是存储在时钟芯片里的,解决办法就是你第一次烧录的时候把你设定的时间信息写到时钟芯片里,之后烧录就不要再去改动里面的时间信息了。如果需要再重新改时钟芯片里的时钟信息。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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