打印
[STC单片机]

双路温度+时间 显示,(18B20+STC15W408AS+LCD1602)

[复制链接]
2972|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 广东梁百万 于 2017-12-31 19:03 编辑

单片机用的是STC15W480AS,传感器是18b20。
用的是汇编语言,
下面是程序的部分





以下是程序部分,是本人原创 手打出来

;下面是寄存器的分配使用

  ;字节20H的前4位用作18b20的存在标示位 。位00H,01H,02H,03H
  ;字节20H的后4位用作正负温度标志  位04H,05H,06H,07H

   TPH1 EQU 24H            ;存放温度值的高字节
   TPL1 EQU 25H            ;存放温度值的低字节
   TTH1 EQU 26H            ;合并成完整的温度整数\
   TTL1 EQU 27H            ;合并成完整的温度整数

   TPH2 EQU 28H     ;第二个存放温度值的高字节
   TPL2 EQU 29H     ;第二个存放温度值的低字节
   TTH2 EQU 2AH     ;第二个合并成完整的温度整数
   TTL2 EQU 2BH     ;第二个合并成完整的温度整数


  DQ1  BIT P1.5      ;第一个DS18B20的数据口位

  DQ2 BIT P1.4      ;第二个DS18B20的数据口位

     TSRAM0 EQU 2CH         ;定时器计数用的寄存器0
     TSRAM1 EQU 2DH         ;定时器计数用的寄存器1
     TSRAM2 EQU 2EH         ;定时器计数用的寄存器1
     TSRAM3 EQU 2FH          ;定时器计数用的寄存器1
     TSRAM4 EQU 30H          ;定时器计数用的寄存器1

    YSRAM1 EQU 31H       ;延时用寄存器1
    YSRAM2 EQU 32H      ;延时用寄存器2
    YSRAM3 EQU 33H     ; 延时用寄存器3



    S1X EQU 34H   ;第一行显示个位
    S10X EQU 35H  ;第一行显示十位
    S100X EQU 36H  ;第一行显示百位
    S1000X EQU 37H  ;第一行显示千位



    S1XB EQU 38H   ;第二行显示个位
    S10XB EQU 39H   ;第二行显示十位
    S100XB EQU 3AH  ;第二行显示百位
    S1000XB EQU 3BH   ;第二行显示千位
    SS1 EQU 3CH  ;时钟1秒计数

    SS10 EQU 3DH   ;时钟10秒计数
    MM1 EQU 3EH   ;时钟分个位
    MM10 EQU 3FH  ;时钟分十位
    HH1 EQU 40H   ;时钟小时个位
    HH10 EQU 41H  ;时钟小时十位



     SBUF_R  EQU 42H    ;串口接收字节计数

     RAM1602 EQU 43H         ;LCD1602写入缓冲

    ASWRAM1 EQU 44H    ;按键A 计数
    BSWRAM1 EQU 45H    ;按键B 计数



    RS BIT P5.5    ;LCD1602 的 RS端  ,1-数据,0-指令
   
    EN BIT P5.4    ;LCD1602 的 E端   ,先从低变高,再变低,以确认输入数据或命令


    LCD1_1 EQU 80H   ;LCD1602的第一行第1个



    LCD2_1 EQU 90H   ;LCD1602的第二行第1个




           ORG 0000H
          LJMP AA1
     ;--------------------------

           ORG 00BH;T0中断入口
           LJMP T0INT


          ORG 0100H
;数值初始化


       AA1:MOV R0,#02H      ;间接寻址,从02H开始到0FFH共256字节   全清空置零
           MOV R1,#255
       CL1:MOV @R0,#00H
           INC R0
           DJNZ R1,CL1
           MOV R0,#00
           MOV R1,#00

      SETB DQ1
      SETB DQ2

       MOV SP,#0E0H;设定堆栈底在RAM的0E0H

        ;---------定时器T0初始化--------10毫秒@11.0592MHz
        ANL AUXR,#7FH                ;定时器T0时钟12T模式
        ANL TMOD,#0F0H                ;设置定时器模式
        MOV TL0,#0FCH                ;设置定时初值 #000H
        MOV TH0,#0DBH                ;设置定时初值 #0DCH
        CLR TF0                        ;清除TF0标志
        SETB TR0                ;定时器0开始计时
        SETB ET0             ;允许T0中断

     ;-------------------------
     ;------定时器T2初始化-------用于串口波特率
     ;晶振-11.0592MHZ
     ;波特率数对应T2重装值
     ;9600----0FEE0H
     ;4800----0FDC0H
     ;2400----0FB80H
     ;1200----0F700H
       MOV T2L,#0E0H    ;波特率9600
       MOV T2H,#0FEH
       MOV AUXR,#15H   ;定时器T2工作1T模式,并开始计时  ;  选择定时器2作串口波特率


    ;-------------------------
      MOV A,AUXR1

      MOV AUXR1,A

      SETB SM0
      SETB SM1   ;串口工作在模式3,9位 ,波特率可变
      SETB  REN   ;*****允许串口接收********
      CLR ES        ;暂停串口中断
        SETB EA            ;中断总开关





  ;---------------------------------------



         ;LCD1602初始化
      MOV RAM1602,#000      ;清P2
      LCALL DELAY15MS     ;延时15毫秒


      MOV RAM1602,#38H             ;16行*2,5*8
      LCALL ZL

      LCALL DELAY5MS       ;延时5毫秒


      MOV RAM1602,#38H             ;16行*2,5*8

      LCALL ZL
      LCALL DELAY5MS       ;延时5毫秒




      MOV RAM1602,#08H         ;关显示
      LCALL ZL
      LCALL DELAY1MS       ;延时1毫秒


      MOV RAM1602,#01H       ;清屏
      LCALL ZL
      LCALL DELAY5MS       ;延时5毫秒


      MOV RAM1602,#06H       ;地址计数器AC自动加1,光标右移 *******
      LCALL ZL     ;
      LCALL DELAY1MS       ;延时1毫秒


      MOV RAM1602,#0CH             ;开显示
       LCALL ZL
      LCALL DELAY1MS       ;延时1毫秒



    ;-----------------------------------

            MOV R0,#80H   ;给80H到09FH都置空格(20H)
            MOV R1,#32    ;32个字符存储字节
       CL2: MOV @R0,#20H
            INC R0
            DJNZ R1,CL2


          MOV ASWRAM1,#00
          MOV BSWRAM1,#00





;运行主程序



      AA2:LCALL DS18B20_1       ;第一路温度测量
           LCALL DS18B20_2
           LCALL DS1820_JH



           LCALL B_DS18B20_1     ;第二路温度测量
           LCALL B_DS18B20_2
           LCALL B_DS1820_JH

           LCALL T_SC1      ;温度数送显示 第一路
           LCALL TB_SC1      ;温度数送显示 第二路

            LCALL SJ1         ;调用时钟计时
            LCALL SW1           ;调用按键扫描



           LCALL LCD_SC1     ;调用显示



           LJMP AA2





;------------------------------------------

  ;T0定时器中断处理程序

     T0INT:MOV F0,C;保护C位到标志位地址FO--T0中断处理程序开始
           PUSH A
           INC TSRAM0;计数,11.0592MHZ,每10ms加一次
           NOP
           INC TSRAM1;时钟计数  11.0592MHZ,每10ms加一次
           NOP
           INC TSRAM2;*******备用****11.0592MHZ,每10ms加一次

           NOP

          MOV A,TSRAM1

          CJNE A,#010,AA3;  RAM的TSRAM1加到100MS就清空
          MOV TSRAM1,#00H
          INC TSRAM3;   每100Ms就加1

          NOP


      AA3:MOV A,TSRAM0
          CJNE A,#010,AA4;TSRAM0加到100MS就清空(10)

          MOV TSRAM0,#000
          INC TSRAM4;每100Ms就加1


     AA4:MOV A,TSRAM2
         CJNE A,#100,AA5  ;TSRAM2加到1秒(100)就清空
         MOV TSRAM2,#00
         INC SS1   ;秒计时器加1

          NOP

     AA5:MOV C,F0;恢复C位,****标志位地址FO用来做中断现场保护
         POP A
         RETI

;--------------------------------------------------------


    ;>>>>>>>>>>>>>>>>>>>>>>>第一路传感器通道》》》》》》》》》》》》》

   ;****************** 18B20主程序1

  DS18B20_1:MOV A,TSRAM4
          CJNE A,#020,DS18B20_1B            ;每两秒转换一次
          INC TSRAM4        ;加多一个数,避免重复发送



        LCALL DS18B20_RST      ;设备复位和发出转换命令



    DS18B20_1B:RET     ;返回



;***************18B20主程序2

   DS18B20_2: MOV A,TSRAM4                ;等待0.8秒
              CJNE A,#29,DS18B20_2B

              JNB 00H,DS18B20_2B      ;设备标示位为0就返回


              LCALL DS18B20_2RST      ;第二次复位
              MOV A,#0CCH             ;跳过ROM命令
              LCALL DS18B20_TXD  ;送出命令
              MOV A,#0BEH             ;读暂存存储器
               CALL DS18B20_TXD  ;送出命令
              CALL DS18B20_RXD   ;读温度低字节
              MOV TPL1,A               ;存储数据
              CALL DS18B20_RXD   ;读温度高字节
              MOV TPH1,A               ;存储数据

          MOV TSRAM4,#00
          MOV TSRAM0,#00




   DS18B20_2B:RET       ;返回





  ;**************************************
;复位DS18B20,并检测设备是否存在
;入口参数:无
;出口参数:无
;**************************************

  DS18B20_RST:CLR DQ1                  ;送出低电平复位信号


           LCALL DELAY600US       ;延时600US



                SETB DQ1                 ;释放数据线
                LCALL DELAY60US         ;延时60US
                MOV YSRAM3,#10   ;置检测次数

   DS18B20_RST2:MOV C,DQ1   ;检测18B20的回应信号

                  JC DS18B20_RST3  ;检测到不是0就转
                  SETB 00H  ;检测到有信号回复就置标志位


        LCALL DELAY420US    ;延时420US


                  MOV A,#0CCH             ;跳过ROM命令
                  LCALL DS18B20_TXD  ;送出命令

                  MOV A,#044H
                  LCALL DS18B20_TXD  ;发送出转换命令

                  RET

   DS18B20_RST3:LCALL DELAY4US  ;延时4US

                  DJNZ YSRAM3,DS18B20_RST2    ; 最多10次检测
                  CLR 00H ;10次检测不到信号那就标示0不存在
                  MOV TPL1,#00FH  ; 置显示255的数
                  MOV TPH1,#0F0H



                  RET


   ;*************第二次复位

  DS18B20_2RST:CLR DQ1                  ;送出低电平复位信号

            LCALL DELAY600US          ;延时600US

                SETB DQ1                 ;释放数据线
                LCALL DELAY60US         ;延时60US
                MOV YSRAM3,#10   ;置检测次数

DS18B20_2RST2:MOV C,DQ1   ;检测18B20的回应信号
                 JC DS18B20_2RST3  ;检测到不是0就转


          LCALL DELAY420US     ;延时420US



                 RET



   DS18B20_2RST3:LCALL DELAY4US  ;延时4US
                  DJNZ YSRAM3,DS18B20_2RST2    ; 最多10次检测
                  CLR 00H ;10次检测不到信号那就标示0不存在

                  RET





;**************************************
;向DS18B20写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************

DS18B20_TXD:PUSH 0
                  SETB DQ1
                  CLR C
                  MOV 0,#8                ;8位计数器
        DS18B20_TXD2:CLR DQ1                  ;开始时间片
                  LCALL DELAY4US           ;延时4US
                  RRC A                   ;输出数据
                  MOV DQ1,C
                  LCALL DELAY80US        ;等待18B20读取时间结束                                                                                   LCALL DELAY80US        ;等待18B20读取时间结束
                  SETB DQ1
                  LCALL DELAY1US           ;延时1.3US
                  DJNZ 0,DS18B20_TXD2
                  POP 0
                  RET


;**************************************
;从DS18B20读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
  DS18B20_RXD:CLR A
                   PUSH 0
                   CLR C
                   SETB DQ1
                   MOV 0,#8                ;8位计数器
      DS18B20_RXD2:CLR C
                  SETB DQ1
                  LCALL DELAY1US           ;延时1.3US
                  CLR DQ1                  ;开始时间片
                  LCALL DELAY4US       ;延时4US
                  SETB DQ1                 ;准备接收
                  LCALL DELAY4US     ;延时4US

                  NOP
                  MOV C,DQ1                ;读取数据



                  RRC A
                  LCALL DELAY60US     ;等待时间片结束



                  DJNZ 0,DS18B20_RXD2
                  POP 0

                  RET


;***********************************************************


     ;*****************转换温度数 DS1820_JH **************

    DS1820_JH:MOV A,TPH1

              CLR 04H  ;先把负温度标志回零
              JNB 0E7H,DS1820_JH2   ;判断是否是负温度数,0E7H是A的第8位

               SETB 04H;   是负温度那就置标志位为1
               CPL A; A取反

               PUSH 82H  ;这里用到了DRTR指针计数器,需要保护原数据
               PUSH 83H

               MOV DPH,A    ;存到数据指针DPTR高位
               MOV A,TPL1   ;温度低字节取反后存到DPTR低字节
               CPL A
               MOV DPL,A
               INC DPTR    ;负温度数取反再加1
               MOV TTH1,DPH   ;整理后再放回
               MOV TTL1,DPL


               POP 83H; 恢复DPTR原数据
               POP 82H




               MOV A,TTH1
               SWAP A
               MOV TTH1,A ;得到温度整数的高4位
               MOV A,TTL1
               ANL A,#0F0H   ;清低4位
               SWAP A      ;得到温度整数的低4位
               ORL TTH1,A   ;全部成温度整数 放在TTH
               ANL TTL1,#00FH   ;清高4位,得到温度小数
               LJMP DS1820_JH3


     DS1820_JH2:MOV A,TPH1
                SWAP A  ;半字节交换
                MOV TTH1,A    ;得到温度整数的高4位
                MOV A,TPL1
                ANL A,#0F0H   ;清低4位
                SWAP A      ;得到温度整数的低4位
                ORL TTH1,A   ;全部成温度整数 放在TTH
                MOV TTL1,TPL1
                ANL TTL1,#00FH   ;清高4位,得到温度小数


     DS1820_JH3:MOV B,#100;   转换成BCD   ****************
                MOV A,TTH1
                DIV AB        ;分离出百位
                MOV S1000X,A
                MOV A,#10
                XCH A,B
                DIV AB
                MOV S100X,A
                MOV S10X,B

                MOV A,TTL1  ;小数转BCD(4位小数乘10后再除16,也就是相当于乘0.625)
                ANL A,#0FH  ;去掉高4位整数,保留低4位小数



                MOV B,#10
                MUL AB     ;先放大10倍
                MOV B,#16
                DIV AB     ;再除以16
                MOV S1X,A

                RET



微信图片_20171229194527.jpg (385.22 KB )

微信图片_20171229194527.jpg

相关帖子

沙发
座机呀| | 2017-12-31 12:41 | 只看该作者
除以16可以用移位

使用特权

评论回复
板凳
ohy3686| | 2017-12-31 12:55 | 只看该作者
把精力花在C语言编程上吧。

使用特权

评论回复
地板
广东梁百万|  楼主 | 2017-12-31 19:01 | 只看该作者
座机呀 发表于 2017-12-31 12:41
除以16可以用移位

移位的话要做4次 RR A指令,稍麻烦点

使用特权

评论回复
5
linqing171| | 2017-12-31 20:47 | 只看该作者
本帖最后由 linqing171 于 2017-12-31 20:48 编辑
广东梁百万 发表于 2017-12-31 19:01
移位的话要做4次 RR A指令,稍麻烦点

百万哥,keil生成的移4位的时候是用的SWAP A,不是RR A。
如果移位多的话,keil会调用一个自己的小函数。
兄弟也写过很多A51,曾经8k的浮点库,曾经把AT89C51RD2的flash都用光了。
虽然keil在jbc的时候都是jb ;clr c 两条; 虽然keil的函数传递残的寄存器不足够智能。但是在变量overlay分配上等等耗时的地方,有个编译器工具,会比人工省很多时间。

使用特权

评论回复
6
linqing171| | 2017-12-31 21:50 | 只看该作者
1 板子焊的很不错。不过我以前是买的那种飞线,带皮的,不是这种漆包线,颜色太少。
2 变量分配的话,keil会把不同时调用的函数里面的变量分配在相同的位置。根据调用树的技术。人工分配变量如果要达到keil的话,还是很累的。
3 AA1清空RAM的代码,百万哥可以单步走254个循环,看看是不是@R0指向了R0,而后清R0,而后INC R0,最终R0=1,R1~FF都是0。而反过来看keil C51运行库里自带的汇编代码,只使用R0没有使用R1,到最后R0自己也变成了00。  比你的这个清空代码省一点点。当然,你们这两个人的都需要PSW=0,也就是复位默认状态。
附录keil代码:
        CLR        A
        MOV     R0,#0FFH
IDATALOOP:      ;这行有行表,这行就不写汇编了,看起来清晰一些。
        MOV     @R0,A
        ;MOVX        @R0,A
        DJNZ    R0,IDATALOOP

4 堆栈底。同理这个汇编的话需要自己分配。
5 百万哥的注释写的很漂亮。但是AA1这种最好有个名字,PUSH 82H这种最好有个名字。我注释写的就比较少,像  LCALL DELAY4US  这种即使写也就写个像 建立时间 四个字,而不会写的这么详细。
6  LJMP AA2 这种,如果keil在small模式,会变成AJMP,如果small模式编译不过,直接改个模式,就能变成LJMP和LCALL了。如果汇编的话,需要自己来算是用LCALL还是ACALL呢?
7 T0INT的第一句,keil会是push PSW,而百万哥的MOV F0,C 这是有区别的。有区别的。有区别的。
8  DS18B20_1的倒数第二句和倒数第一句,call+return,会被合并成一个jump指令。基本编译器都有的尾调优化。但是如果汇编你这么写,可读写就差了很多。
9 JNB 00H;push 82H等等,能不能写成名字?地址看起来比较别扭。C语言的话基本每个公司都有编程规范,变量名怎么标准化。但是汇编的我也没有见过。
10 MOV C,DQ1 和下句的JC,应该能合并成一句。我记的51的汇编指令是很强大的。
11 DS18B20_TXD:PUSH 0
; 一般keil保存寄存器的时候,是PUSH AR0,然后根据前面的使用的寄存器组,对应的AR0是0还是8还是16和24。 这个函数里面R0作为8次循环的循环值,进来push了一下。而keil的调用规范里,R0~R3是任意函数都是可以不备份直接破坏使用的(除了中断和操作系统等重入的函数)和你函数中的A一样,R0~R3如果保存的是重要的变量,不是临时运算结果,在CALL子函数之前是调用方备份,被调用方可以直接破坏的。这个调用约定导致了可以不用push,而你这个函数push了。
再比如DPTR,主程序AA2及其调用的程序里,每次用之前都有从其它变量赋值,用后其实就可以不恢复了。只有中断用的时候备份一下即可。但是如果做成这样,又和将来不知道被修改成什么样的AA2不一定兼容。如果要优化到极致,靠人来完成,累啊。
12 DS1820_JH2前后两部分,有一些相同的代码,会被keil变成子函数。优化等级高于一定级别的时候。只要是加上调用还能节省出5个字节来,keil就会干。 关于此处的取反加1,使用了INC DPTR指令,看起来省了一些,但是实际上可以 CLR A;SUB A,TPH1;MOV A,TPH1; CLR A; SUBB A TPL1; MOV A TPL1;六条指令。和你的12条指令比起来略少,即使你不存DPTR,你8条指令也是基本相当的。
13 ... ...

百万哥的程序我没有仔细看大纲,只看了点细节,就和编译器的窥孔优化的过程一样。如果是C语言的话,可能两分钟就能review一遍了,但是这个是汇编写的。本来想确认一下负号的处理是否有keil那么聪明,本来想从整体的方向确认一下中断和主循环都会用到的那几个变量是否有临界资源冲突。但是被电话打断了两次后,十几分钟了,实在没有心情再看下去了。

编译器的优势就是,可以做一些工作量特别大的运算,比人分配寄存器快了很多。
但是要想比人写汇编写的还要省flash和省RAM还要运行快,还是比较难的,特别是百万哥这种汇编已经用的熟的人了。
不过话说回来,百万哥如果天天有大项目做,大部分时间花在业务上,而不是代码上,还是换C吧。有汇编基础,很多C语言调试的问题都很有帮助。现在搞互联网的都脚本解释的语言了,都不用编译语言了,我们搞嵌入式的又何必抱着汇编语言去追求那个极致呢?

使用特权

评论回复
7
广东梁百万|  楼主 | 2017-12-31 23:01 | 只看该作者
linqing171 发表于 2017-12-31 20:47
百万哥,keil生成的移4位的时候是用的SWAP A,不是RR A。
如果移位多的话,keil会调用一个自己的小函数。
...

看来俺学到经验了,谢谢

使用特权

评论回复
8
广东梁百万|  楼主 | 2017-12-31 23:10 | 只看该作者
linqing171 发表于 2017-12-31 21:50
1 板子焊的很不错。不过我以前是买的那种飞线,带皮的,不是这种漆包线,颜色太少。
2 变量分配的话,keil ...

高手啊,非常感谢提点,真心的感谢。  我正在努力学C

使用特权

评论回复
9
linqing171| | 2018-1-1 10:57 | 只看该作者
广东梁百万 发表于 2017-12-31 23:01
看来俺学到经验了,谢谢

百万哥谦虚了。 看代码注释,函数格式等,远不是一日之功了。
有时候同事的C有偏或者怪问题,我经常看一下反汇编的ARM指令,很快就能知道问题在哪里了。如果想把C用好,汇编基本功还是必要的。往往95%的bug都修正了,就剩下5%的bug不懂汇编解决不了的时候,就体现出用处了。特别运行库和一些abort等情况下。
读书的时候从老一代的赵教授那里学了一些8051汇编的旁门左道,本论坛之前人多的时候,dengm和hotpower大叔的8051汇编也很厉害。你可以百度一下dengm site:21ic.com 找一篇8051的BCD转换代码,印象里2005年之前的帖子。



使用特权

评论回复
10
广东梁百万|  楼主 | 2018-1-1 17:06 | 只看该作者
本帖最后由 广东梁百万 于 2018-1-1 17:23 编辑
linqing171 发表于 2018-1-1 10:57
百万哥谦虚了。 看代码注释,函数格式等,远不是一日之功了。
有时候同事的C有偏或者怪问题,我经常看一 ...


自我介绍下,自幼喜欢捣鼓电器,后来读书是职业高中家电维修班,职业高中其间没有单片机课程,当时的老师也不懂单片机,单片机是我买书自学的,那时是1996年开始,当时条件限制,我还没有电脑,当时也还没流行单片机c语言,我也就从汇编语言起步,跟着是断断续续的自学。
应该是2000年,我用亲戚给的500红包买了一个简易编程器,这编程器自带一块1602屏幕,无需要电脑,我用他做出了两个定时器和一个电解电容测试仪。因为是简易型,程序无法转存,编写一次那上一次就要清除。使用这个根本就无法进步,  后来丢在一边吃灰。

职中毕业后出来工作,在亲戚的纺织厂做机器和纺织工艺调试学徒,每天上班12小时,这一干就是十年,偶尔会看下单片机的书籍。
早十年前纺织行业都逐渐往东南亚跑去了,国内行情越来越差。纺织厂的普通级师傅也不好混。而且我还是在外地做,拖家带小的不好受。
只好回家改行做了电气维修工,去年底找到了现在的工作,在镇里一食品厂做电工,上班8小时,因为对电气维修轻车熟路,而且空闲时间多,于是又学起了单片机。
一年时间里用洞洞板焊接了数个试验电路,验证了多个基础程序,比如  双字节四则运算,双字节排序…………并做成了自己方便用的子程序库方便日后复制调用,我现在的做法是:把程序分成多个子程序,这些子程序都可以方便修改RAM地址和端口地址,主程序就是调用多个子程序以整合成一个产品功能。

上面18b20的读写操作是网上找到的例程修改的,包括stc的1820例程,都不能在我的试验板上使用,跟着逐条研究修改,还用了罗辑分晰仪才成功,上面18b20的温度转换是我的自编的,估计还有bug和不合理的地方。,
因为汇编语言的阅读性差,所以我几乎每条指令后面都加了注释,以便日后更改。
因为不懂英文,我现在都不会Keil软件和PCB绘图软件,也不会c语言,我编程用的软件是南京伟福仿真器用的仿真软件,中文版的,对我来说很方便,好像他里面也是嵌套Keil内核。
很羡慕别人会用PCB绘图去某宝打样,而我只能用洞洞板。
再次感谢提点,未来我的计划是学c语言和PCB绘图软件。

使用特权

评论回复
11
linqing171| | 2018-1-1 18:35 | 只看该作者
广东梁百万 发表于 2018-1-1 17:06
自我介绍下,自幼喜欢捣鼓电器,后来读书是职业高中家电维修班,职业高中其间没有单片机课程,当时的老师 ...

太励志了。
我读书的时候也用 南京伟福。 南京是个神奇的地方。  除了南京伟福能做仿真器,还有小哨兵还原卡,还有 wch.cn 的USB芯片,还有涛行的烧写器。 比起中关村能有一千家打车软件,一年就倒闭的还剩几家,这种互联网的浮躁,南京的公司虽然不见得多大,但是很多都是真做技术的。
画PCB投板的话,不用某宝,去嘉立创就可以。不是广告,个人喜好,几十块钱一个板子,比焊接洞洞板花的时间多不了多少钱,还更容易产品化。
我在想要不要开发个纯中文的编程语言,模仿易语言之类的,不过是专用于8051和ARM的。

使用特权

评论回复
12
广东梁百万|  楼主 | 2018-1-1 21:19 | 只看该作者
linqing171 发表于 2018-1-1 18:35
太励志了。
我读书的时候也用 南京伟福。 南京是个神奇的地方。  除了南京伟福能做仿真器,还有小哨兵还 ...

如果是中文语句那就怪怪的,和易语言一样不见得好,如果是中文菜单和并且有详细中文帮助内容那就方便多了。

使用特权

评论回复
13
emco| | 2018-2-18 09:54 | 只看该作者
楼主高手,非常感谢。

使用特权

评论回复
14
zqx1000| | 2018-4-10 18:23 | 只看该作者
kankan

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

204

帖子

4

粉丝