矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

关于电源电路地的请教

[复制链接]
     
发表于 2018-12-16 20:11:12 | 显示全部楼层
本帖最后由 bg1trk 于 2018-12-16 20:24 编辑
pdshyh 发表于 2018-12-15 19:36
谢谢bg1trk版主指教,正在看各卖家提供的资料都差不多,都没弄过比较空洞,按您说的实际安装学习跟着教程 ...


washu老师的回帖有比较专业,通俗的啰嗦几句,以下都以51为例。

语言:这个不用解释,就是C、汇编之类的编程语言。写出来的代码是以文本的形式存在的,代码可以在IDE中编写,也可以用任意的文本编辑工具编写,例如系统自带的记事本,本质就是一个一个敲字符。区别是普通的文本编辑程序没有关键词加亮、语法检查等功能,使用很不方便。

编译器:这是软件,作用是将您用各种高级语言写出的程序“转换”成单片机能读得懂的二进制代码的工具,“转换”过程叫编译。编译结果是后缀名为HEX或BIN的二进制文件。各种单片机都有对应的编译器, for C51的编译器只针对51芯片,专人专用。有些编译器兼容很多芯片,编译前要手工选择对应的芯片类型、型号。

IDE:通俗理解就是包含上述两者和一些其他工具的集合。

以上都是软件,烧录器、下载线是硬件,是用来把编译后的HEX文件下载到单片机程序存储区的硬件设备。
程序下载(或者叫烧录)的方式有离线和在线两种。

离线下载:早先Atmel公司的系列51单片机都是“离线下载”,需要用到烧录器(也叫编程器)。烧录器与计算机连接的方式有并口、串口和USB几种。早先都用并口编程器,与计算机的连线是并口线(并口打印机用的那种线),接口是计算机的并口。后来进化到用串口,现在流行是USB接口。
程序编译好以后,用支持所用烧录器的烧录程序载入HEX文件,芯片插在烧录器插座上,就可以用烧录程序把HEX文件的内容写到芯片的程序存储区了。这种烧录方式要求要把芯片插到烧录器插座上,比较麻烦。

在线下载:就前面回复里说的ISP(在线系统编程)。现在流行的单片机芯片的程序存储都是Flash存储器,无需额外的电路就可改写数据。这类芯片都有几个管脚用作程序下载,用下载线将相应管脚与计算机连接,就可以下载程序了。下载线的接口有串口和USB口,串口下载线的本质是电平转换,接口芯片一般是MAX232之类的。USB口下载线其实就是USB转串口,用的芯片大多是CH340之类的,本质还是串口。
ISP下载不要求把芯片从板子上拿下来单独编程,只需用下载线把板子与计算机连接即可,使用方便。

51芯片仿制厂家众多,国内用的比较多的是宏晶的STC单片机(吐槽一下宏晶芯片奇葩的Datasheet),型号众多价格不贵。您要是想学51不妨用它入门,买一块系统板,配一条USB口的下载线,硬件就齐了。或是买学习板,下载线都是配套的,烧录程序资料里也有。开发环境用不着装庞大的IDE,KEIL 就挺好,安装文件只有50M大小。


这几年STM32、STM8比较流行,用STM8入门也是个不错的选择。站内短信提供给您一个连接,此套学习板的开发者是个嵌入系统工程师,板子上常用的东西基本配齐了,配套资料非常齐全。视频教程从环境搭建开始讲,软件的安装、破解、配置一步一步教,直至您成功下载、运行第一个程序。有寄存器和库两套编程教程,手把手教您使用各种资源,还有技术辅导群。个人感觉比那种不懂技术的商家强多了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-17 12:07:57 | 显示全部楼层
bg1trk 发表于 2018-12-16 20:11
washu老师的回帖有比较专业,通俗的啰嗦几句,以下都以51为例。

语言:这个不用解释,就是C、汇编之 ...

       谢谢bg1trk版主老师通俗讲解,确实编译器烧录器和下载线是硬件还是软件比较糊度,清楚了,还是接触时间短,需要一段时间消化,搭建实验板通过各个小实验进一步理解和认知,
       STC是国产宏晶品牌,以为是国外品牌,支持国货。
      看了http://m.elecfans.com/article/599548.html,stm32与pic、avr单片机的对比分析,avr单片机还支持basic语言。单片机东西太多,感谢指教!
      
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-17 12:42:09 | 显示全部楼层
本帖最后由 pdshyh 于 2018-12-17 12:59 编辑

回顾2016年重操旧业玩
1.HIFIDIY论坛/关于电洛铁焊接接线柱的求助/flyingsolo老师耐心细致讲解如何焊接大部件有文有图/2016.11
2 .HIFIDIY论坛›请教diyt套件功放问题/接地线的我见  / martymak老师短信邮件绘图指导,我认识了一点接地,关注功放接地问题,老师的第一封来信还在我邮箱保存/ 2016.11
3..关于diy电流表请教, 矿石收音机论坛/wanwenhao1老师让我认识了四线电阻测量...小电阻电压对比测量等请教讨论跨度两个年头。/ 2017.12
4.升级lm317稳压电源选用用什么稳压电路好 矿石收音机论坛/bg1trk版主老师,认识运放,制作lm358带切换板运放电路。细心通俗易懂的讲解受益匪浅。/2018.4.
5.再烧买什么表/请教HP3457A表的使用问题/washu老师对HP3457A、HP44491A卡、 HP  6626 电源、bz3标准电阻和编程各种问题的文图并茂专业讲解,让我同样受益匪浅,在二手仪表购买请教老师指点花费最多的,买到的仪表虽然几十年了宝刀不老各种参数还是那么靠谱。/2018.6
6.请教HP3457A表的使用问题/Edward老师让我知道仪器手册重要性,每每QQ请教都是有问必答。/2018.10
7.本帖/nengcai0313老师提供ADI公司的《良好接地指导原则》,让我知道了模拟/数字混合信号环境的接地技术,覆铜板搭棚,搞单点接地等受益匪浅,,
      单片机各位老师指教更是收获多多,吃水不忘挖井人,在此借这个平台在DIY道路一路走来,帮助我的各位老师表示感谢感谢!!!
回复 支持 反对

使用道具 举报

     
发表于 2018-12-20 11:36:07 | 显示全部楼层
pdshyh 发表于 2018-12-16 19:30
...在论坛看《考拉聊单片机1...》“...建议首选51,....其次考虑PIC,....。最后推荐AVR,这个玩意对没基础的初学者来说略显复杂,.......编程可以ISP倒也简单。(论坛2010年的文章)”,


我看了一下你说的这个“考拉聊单片机”,对其“ AVR 对没基础的初学者来说复杂、用 C 语言编程难度高”的说法感到莫名惊诧,总之不清楚他试图表述什么意思,而且现在你准备或其它坛友给你推荐的方案,难道不是用 C 语言吗?难道现在还准备让你学 8051 汇编?

AVR 如今不推荐的理由就一个,Atmel 作死,所以已经凉了。


回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-20 16:47:46 | 显示全部楼层
washu 发表于 2018-12-20 11:36
我看了一下你说的这个“考拉聊单片机”,对其“ AVR 对没基础的初学者来说复杂、用 C 语言编程难度高” ...

      washu 老师好,我最先看的是单片机入门不难------谈PIC系列http://www.crystalradio.cn/forum ... &fromuid=228929,写了一半,转而看“考拉聊单片机”也是一半, 崂山老师的PIC的工作原理如何点亮led灯写的不错,转回来又在这几天把51单片机的基础课件全部看完了,存储器以前部分看的比较细,以后的通信等等就粗略看到,proteus安装了,烧录软件stc-isp和驱动也都找到了,keil软件也安装好了,proteus软件按照搜的教程做一个简单单片机电路程序还没有在仿真软件烧录,正在摸索中,有喜欢弄明白在做的习惯,先仿真几个简单的基本电路,.....
      现在体会是能用老师们弄好的单片机应用电路和现成的固件就行了,自己做难度太大,先玩玩单片机基本例程仿真+实际搭建电路,...
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-21 11:27:42 | 显示全部楼层
本帖最后由 pdshyh 于 2018-12-21 11:30 编辑

学习led灯点亮下面是汇编语言吧?
“LOOP: SETB P1.0     ;P1.0输出高电平led灯灭
    LCALL DELAY   ;调用子程序 DELAY
    CLR P10     ;P1.0输出低电平 led灯亮
    LCALL DELAY   ;调用子程序 DELAY
    LJMP LOOP    ;转移LOOP
;以下子程序
DELAY: MOV R7,#250  ;R7赋值250
D1: MOV R6,#250    ;R6赋值250
D2: DJNZ R6,D2    ;一条件转移指令,先将工作寄存器R6中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到行标为D2的地方执行,否则,为“0”就不转移,继续执行下一条指令。
  DJNZ R7,D1     ;一条件转移指令,先将工作寄存器R6中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到行标为D1的地方执行,否则,为“0”就不转移,继续执行下一条指令。
  RET         ;程序就返回到LCALL指令的下面的一条指令继续执行
  END         ;结束伪指令”
c语言比较丰富找了一个和上面相近的如下
“#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P1^0;                 //将单片机的P1.0端口定义为led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);        
}
*******************************************************************************/
void main()
{
        while(1)
        {
                led=0;
                delay(50000); //大约延时450ms
                led=1;
                delay(50000); //大约延时450ms        
        }               
}”
不知道汇编语言是不是也是多种多样,有没有和上面相近的C语言程序,#include "reg52.h"  这个语句网上搜了还是不太理解,有的还是#include,没有 "reg52.h" ,不太明白。
回复 支持 反对

使用道具 举报

     
发表于 2018-12-21 14:05:06 | 显示全部楼层
pdshyh 发表于 2018-12-21 11:27
...不知道汇编语言是不是也是多种多样,有没有和上面相近的C语言程序


汇编和高级语言的实现逻辑不一样的。

给你看看高级语言转汇编和直接用汇编的差异

高级语言:
  1. $Device= m8                        ' used device
  2. $Stack = 32                                ' stack depth
  3. $Clock = 8                        ' adjust for used crystal

  4. Declare Sub Delay(Delaytime As Integer)

  5. DDRC.0 = 1

  6. Do                                               
  7.         PORTC.0 = Not PORTC.0
  8.         Delay(10000)
  9. Loop


  10. Sub Delay(Delaytime As Integer)
  11. Do
  12.         Delaytime = Delaytime - 1
  13. Loop While Delaytime > 0
  14. End Sub
复制代码


转汇编,你会发现实现同样功能,高级语言写成的代码转汇编比直接用会编写的啰嗦很多

  1. .include        "C:\FastAVR\inc\m8def.inc"
  2. ;
  3.                 .DSEG
  4.                
  5.                 .CSEG
  6. .ORG        0x0000

  7. _Reset:
  8.                 ldi                yl,byte1(RAMEND)
  9.                 out                SPL,yl
  10.                 ldi                yh,byte2(RAMEND)
  11.                 out                SPL+1,yh
  12.                 sbiw        yl,32

  13. ;******        USERS BASIC CODE **********************

  14. ;-Line--0011----DDRC.0 = 1--
  15.                 sbi                DDRC,0

  16. ;-Line--0013----Do                                                --
  17. L0000:

  18. ;-Line--0014----PORTC.0 = Not PORTC.0--
  19.                 in                zl,PORTC
  20.                 bst                zl,0                        ;store zl,bit 0 to T flag
  21.                 bld                zl,0x00
  22.                 ldi                zh,0x01
  23.                 eor                zl,zh
  24.                 bst                zl,0x00
  25.                 brtc        L0002
  26.                 sbi                PORTC,0
  27.                 rjmp        L0003
  28. L0002:
  29.                 cbi                PORTC,0
  30. L0003:

  31. ;-Line--0015----Delay(10000)--
  32.                 ldi                zl,byte1(10000)
  33.                 ldi                zh,byte2(10000)
  34.                 st                -Y,zh
  35.                 st                -Y,zl
  36.                 call        delay
  37.                 adiw        yl,2

  38. ;-Line--0016----Loop--
  39.                 rjmp        L0000
  40. L0001:

  41. ;-Line--0019----Sub Delay(Delaytime As Integer)--
  42. delay:

  43. ;-Line--0020----Do--
  44. L0005:

  45. ;-Line--0021----Delaytime = Delaytime - 1--
  46.                 ldd                r24,y+0
  47.                 ldd                r25,y+1
  48.                 ldi                zl,byte1(1)
  49.                 ldi                zh,byte2(1)
  50.                 sub                r24,zl
  51.                 sbc                r25,zh
  52.                 mov                zl,r24
  53.                 mov                zh,r25
  54.                 std                y+0,zl
  55.                 std                y+1,zh

  56. ;-Line--0022----Loop While Delaytime > 0--
  57.                 ldd                r24,y+0
  58.                 ldd                r25,y+1
  59.                 ldi                zl,byte1(0)
  60.                 ldi                zh,byte2(0)
  61.                 adiw        zl,1
  62.                 cp                r24,zl
  63.                 cpc                r25,zh
  64.                 brge        PC+0x02
  65.                 rjmp        L0006
  66.                 rjmp        L0005
  67. L0006:

  68. ;-Line--0023----End Sub--
  69. L0004:
  70.                 ret
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2018-12-21 14:23:37 | 显示全部楼层
pdshyh 发表于 2018-12-21 11:27
...#include "reg52.h"  这个语句网上搜了还是不太理解,有的还是#include,没有 "reg52.h" ,不太明白。


#include 是包含某个文件的意思,reg52.h 就是被包含的文件。

为什么要包含这个文件呢?因为编译器和单片机都不认识你说的 P1^0 啥意思(sbit led=P1^0),这个文件记录了这玩意,简单说就是寄存器的名字和寄存器在单片机硬件中地址的对应关系,因为即使是用汇编语言,同样也不会直接写寄存器的地址,而是写寄存器的代号(你那段汇编也是用 Pn 代表),编译器需要一个文件告诉它哪个名字的寄存器实际上在单片机的硬件中是哪个地址才能编译。

你的 51 编译器应该有这个文件,而且格式和 AVR 的也类似 比如这个用 GCC 写的 AVR 闪烁 LED,LED 接到 Port C 的第一个脚,那么 PORTC 是啥呢?m8def 告诉编译器,它是位于寄存器地址 15(十六进制)的一个 byte,当我要点亮 LED 的时候,往 PORTC 写 1,那么编译器就编译为往寄存器地址 00010101 写 00000001 这个意思。

cr10941.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-21 14:59:23 | 显示全部楼层
washu 发表于 2018-12-21 14:05
汇编和高级语言的实现逻辑不一样的。

给你看看高级语言转汇编和直接用汇编的差异  

谢谢washu 老师指教,我刚刚接触汇编语言是在51单片机课件中还有帖子里led灯的讲解,还是通过led灯得以认识c语言,先入为主,感觉汇编语言逻辑性强简练,c语言是高级语言肯定有它的优势所在,谢谢了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-21 15:27:14 | 显示全部楼层
washu 发表于 2018-12-21 14:23
#include 是包含某个文件的意思,reg52.h 就是被包含的文件。

为什么要包含这个文件呢?因为编译器 ...

      谢谢washu 老师,知道了,#include reg52.h 。 reg52.h头文件里面定义了单片机专用寄存器SFR的名称和物理地址,这样,在程序中就可以使用专用寄存器了。编译时就能找这些寄存器变成对应的物理地址。 我在51 编译器中找到了reg52.h,我原来以为 reg52.h是随便写一个名字就行,就像数据类型进行声明定义那样。
回复 支持 反对

使用道具 举报

     
发表于 2018-12-21 16:06:02 | 显示全部楼层
pdshyh 发表于 2018-12-21 14:59
谢谢washu 老师指教,我刚刚接触汇编语言是在51单片机课件中还有帖子里led灯的讲解,还是通过led灯得以认 ...

汇编并非逻辑性更强,而是汇编更贴近硬件,而这种贴近很喜欢被早期的单片机程序员津津乐道,其实是因为单片机太简单,寄存器就那么几个,指令就那么几条,记着也没太大难度。可是桌面开发除了底层比如系统内核,绝大多数程序员是不用汇编的,甚至高级一点的单片机程序员也不用汇编,比如 STM32 程序员也不用汇编,为什么呢,因为人家寄存器更多,指令也更多

高级语言除了更抽象之外还有一个就是编程的思想的区别,汇编语言的进行和流程控制以各种转跳为主;早期高级语言比如 C 语言以过程控制为主,而现代高级语言比如 C++,Visual Basic,Java... 以对象控制为主 --- 也就是说,你看那些 51 例程其实真的很古老了

同样是闪烁这个 LED,可以用微软的 C# 例程来看看现代编程的做法。C# 的语法几近于 C,你可以对比你那个 C 的例程看其区别

在面向对象的编程中,单片机的管脚被抽象为对象 IO(GPIO),我们对管脚的操作就是对这个对象的操作,比如配置它为输出:
pin.SetDriveMode(GpioPinDriveMode.Output);  <--- 实际上就是对端口方向(和功能)寄存器的写入

让 LED 点亮(或熄灭):
pin.Write(GpioPinValue.High);  <--- 实际上就是对端口值寄存器的写入


  1.     public sealed partial class MainPage : Page
  2.     {
  3.         private const int LED_PIN = 5;
  4.         private GpioPin pin;
  5.         private GpioPinValue pinValue;
  6.         private DispatcherTimer timer;

  7.         public MainPage()
  8.         {
  9.             InitializeComponent();

  10.             timer = new DispatcherTimer();
  11.             timer.Interval = TimeSpan.FromMilliseconds(500);
  12.             timer.Tick += Timer_Tick;
  13.             InitGPIO();
  14.             if (pin != null)
  15.             {
  16.                 timer.Start();
  17.             }        
  18.         }
  19.         private void InitGPIO()
  20.         {
  21.             var gpio = GpioController.GetDefault();

  22.             // Show an error if there is no GPIO controller
  23.             if (gpio == null)
  24.             {
  25.                 pin = null;
  26.                 GpioStatus.Text = "There is no GPIO controller on this device.";
  27.                 return;
  28.             }

  29.             pin = gpio.OpenPin(LED_PIN);
  30.             pinValue = GpioPinValue.High;
  31.             pin.Write(pinValue);
  32.             pin.SetDriveMode(GpioPinDriveMode.Output);

  33.         private void Timer_Tick(object sender, object e)
  34.         {
  35.             if (pinValue == GpioPinValue.High)
  36.             {
  37.                 pinValue = GpioPinValue.Low;
  38.                 pin.Write(pinValue);
  39.             }
  40.             else
  41.             {
  42.                 pinValue = GpioPinValue.High;
  43.                 pin.Write(pinValue);
  44.             }
  45.         }
  46.     }
复制代码
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-21 16:07:18 | 显示全部楼层
washu 发表于 2018-12-21 14:23
#include 是包含某个文件的意思,reg52.h 就是被包含的文件。

为什么要包含这个文件呢?因为编译器 ...

washu老师好网上搜的一个简单的加法程序。
#include <stdio.h>           
void main()                 
{
        int sum=0;
        int a,b;
        printf("请输入a的值:");
        scanf("%d",&a);
        printf("请输入b的值:");
        scanf("%d",&b);
        sum=a+b;

        printf("a+b的值为:%d\n",sum);  
}
(运行  输入a =2   输入b  =3   结果显示:5)
注:一个C语言程序必须有main函数,其余的函数可以根据以上函数的定义类型来定义,之后再main函数中进行调用使用即可。
请教1.stdio.h:标准I/O函数的原型,还是想让了解这个文件头文件在这里的作用。(c语言不习惯呀)
      2.void main() 在35楼和这个例子比还是不清晰。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-12-21 16:23:10 | 显示全部楼层
本帖最后由 pdshyh 于 2018-12-21 16:42 编辑
washu 发表于 2018-12-21 16:06
汇编并非逻辑性更强,而是汇编更贴近硬件,而这种贴近很喜欢被早期的单片机程序员津津乐道,其实是因为单 ...


       谢谢washu 老师,微软的 C# 例程弄清楚还是差距大,不请教您具体编程细节的问题了,请教现在学习单片机,用什么语言学习更合适,用什么软件学习。怎么样学习。您玩单片机很长时间了经验十分丰富,我都是刚刚接触。除了w系统计算机用的时间长还有公路工程设计软件,绘图cad软件用的比较早,也都是使用,....
回复 支持 反对

使用道具 举报

     
发表于 2018-12-21 17:54:04 | 显示全部楼层
pdshyh 发表于 2018-12-21 16:07
...
1.stdio.h:标准I/O函数的原型,还是想让了解这个文件头文件在这里的作用。(c语言不习惯呀)
      2.void main() 在35楼和这个例子比还是不清晰。            


你需要有一个标准的 C 编译器,就能找到 stdio.h,就好像你有 Keil 才有 reg51.h 一样

.h 文件也叫头文件,它通常包含程序中会使用到的一些函数(以及涉及到的变量、宏定义等),你在程序头部 inc 它们之后就不用再重复写这一大堆函数的声明了。stdio 顾名思义就是标准输入输出的意思,诸如从控制台读取输入的文字的 scanf、向控制台输出格式化过的文字的 printf 就包括在这个 stdio.h 里,你如果要在程序中使用这些函数而又不想自己实现它们,那么只需要在程序头部 inc 这个 stdio.h 就能用编译环境预先提供给你的这些库达到目的。

类似的,你之前的 51 闪烁 LED 荔枝里有一个 delay() 函数,而你看我给你的 AVR GCC 没有自己写这个函数,而是 inc 了一个 delay.h,这就是因为你用的 Keil 或别的编译器没有提供这个库,而 GCC 提供了这个库,所以 GCC 里可以直接 inc 一个 delay.h 就能使用 delayms 和 delayus 函数实现延迟。

而在比如 PC 平台的标准 C 上也是一样,标准 C 会包含 stdio.h 这样的文件给你,让你可以直接调用它在控制台输出文本、从控制台读取键盘输入等功能而不必自己实现 --- 因为 PC 平台是标准的,所以不管你用哪家 CPU,哪家显卡,哪家显示器,都能实现这个。单片机市场的标准化远逊于 PC,所以基本不会提供 stdio.h 给使用者,使用者如果试图在屏幕上输出一行文字,就得自己根据整个屏幕的操作指令,将 ASCII 文字转化为和屏幕上的点对应的二进制数据,然后用屏幕的操作指令写入屏内的显存...才行。

如果你对 stdio.h 有哪些内容有兴趣可以自己打开它看看,它肯定在你的 C 编译器的某个地方,否则你用不了它 我的 VS 没有安装 C++,所以我的电脑没有这个文件了。另外,stdio.h 只是诸如 printf() 的声明,具体比如 printf() 的内容又在另外的位置,比如在 printf.c 文件中,所以你想要搞清楚它们是如何实现的,需要阅读很多程序才行(而且我记得 printf() 里面还调用了很多其它函数)。

荔枝,用某种 Basic 语言在 AVR 单片机和 KS0108 控制器的 12864 点阵屏幕上实现输出一行 ASCII 文字(类似 printf 部分功能)的代码,by me
cr10942.png
回复 支持 反对

使用道具 举报

     
发表于 2018-12-21 18:15:03 | 显示全部楼层
pdshyh 发表于 2018-12-21 16:23
...请教现在学习单片机,用什么语言学习更合适,用什么软件学习。怎么样学习


因为那个考拉的帖子我昨天还在某裙说了这事,同样用死太惨 51 的大拿表示又不是 30 年前了还汇编

所以汇编语言首先排除。

然后是高级语言中选择哪个的问题,一般都选择 C,但前面我也提到,如今也有很多其它语言可以在单片机上使用,然而它们多少有硬件局限性,简单说就是太高级的语言可能只能在比较强的单片机上提供,比如 VB(面向对象的 Basic)和 C#,你要用这两种非常高级的语言,只能找树莓派了,STM32 都不行 所以选择 C 语言的好处是至少目前流行的所有单片机,都有 C,哪怕是 51 这种古老的单片机。

但你清楚我就不用 C 因为 C 语言对业余爱好者并不十分友好,以前是没得选,现在有丰富的选择,为什么一定要 C 呢,就为了“通用”?然而一个问题就是你学习单片机是为什么,为了工作么?如果不是,那么语言的通用性实际上非常不重要,否则诸如 Arduino、树莓派就不会那么流行。所以除了 C,选择 Arduino 也是不错的,它在业余爱好者中也非常流行,兼容的硬件从同样也比较老旧的 AVR,到时下非常流行的 ARM(STM32)都有,而且相比你那个连 Delay() 都要自己写的 Keil 51,Arduino 连很多常用器件比如 ADC 啦,DAC 啦,移位寄存器啦这个那个以及单片机内部资源比如 PWM 啦,IIC 总线啦都做好了库,你只需要直接用,就好像我那个 AVR 的 GCC 闪烁 LED 荔枝中,只要 inc 了 delay.h 就可以直接用 delayms 实现延迟而不必自己写一段 delay() 函数一样。

不过说实话我看人家的 C 提供的库也挺多的,所以其实我不太理解为什么老是看到你们的例程中连 delay() 都得自己写...是真的编译环境没提供,还是例程都是上个世纪 90 年代以前的然后天下文章一大抄?你看我写的 AVR 闪烁 LED 例程也是 C,就不自己写 delay(),说实话这一点我挺诧异的。

最后用什么软件怎么学这个问题实在是太多回答了,而且你似乎决定用 51 的样子,说实话我没法回答,我自己都不选它。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-25 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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