社区导航

 
查看: 1632|回复: 13

[分享] 【转载】学好单片机不得不看的十篇文章

[复制链接]

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

发表于 2018-5-23 15:26:54 | 显示全部楼层 |阅读模式
1——向51单片机说再见!
2——学什么单片机最有前途?
3——学单片机前,你需要掌握的一些预备知识
4——C 语言竟是这样调用硬件的
5——以前都搞错了,单片机C语言程序该这样写!
6——我们老师是这么教单片机的
7——单片机的一生(感觉在说大部分人)
8——闲说各家单片机的优缺点
9——学习单片机的八个步骤
10——63岁老人自学单片机,8年做出跳舞机器人

此帖出自单片机论坛


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:27:35 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:29 编辑

51单片机几大误区,向51单片机说再见!

51单片机的辉煌过去

  51单片机指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前国内的51单片机市场主要为国产宏晶的产品STC系列其号称低功耗,稳定与廉价的特点。

  学习51单片机的误区

误区1:51单片机是学习的基础

  “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片机可以供使用,国内更没有更高级的教材供参考,老师的水平也是参差不齐,而51单片机正符合这样的需求,不仅有大量的成型的教材,广泛的示例,当时工作的实际项目也是51单片机为主,于是51单片机理所当然的成为当时的学习基础。要知道笔者读本科的时候是2004年,即10年前的东西。按照莫尔定律,电子行业每18个月更新换代,10年前的技术现在已经更新了6代了——事实也确实如此。

  目前32位Crtex-M系列单片机的各种教程已经普及,其学习的难度不断降低。以意法半导体公司的STM32F系列单片机来说,意法半导体在推广产品初期大量赠送了核心板。免费赠送的核心板不仅有流行的32位Cortex-M系列微处理器,更在板上集成在线调试器。随机附赠的光盘或者链接更是提供了大量的示例源代码。我们只需要安装开发环境即可直接编译与下载调试。这时,如果再说51单片机是学习嵌入式的基础肯定是不合时宜了。

误区2:51单片机可以学习寄存器的操作

  51单片机可以学习寄存器的操作,这一点儿是不容置疑的。我们分析一下其更深层的原因。在MSC-51单片机的编程环境中,最初是以汇编语言为主要编程语言。要知道汇编语言就是直接操作寄存器的,汇编语言是无法做到C语言的函数调用与封装的。如果说51单片机是以操作寄存器为优点,我觉得更应该说51单片机操作寄存器是一种无奈,是只有一个选项的选择题。

  我们现在的Cortex-M系列单片机就无法学习寄存器了吗?显然不是。在硬件设计中,硬件的操作方式就是寄存器的操作,但是其实现却是可以不同。各微处理器提供的C语言库函数包其实质就是将操作寄存器的指令进行了C语言环境下的封装。我们这里用ST官方库函数举一个示例:

  void USART_Init (USART1, *USART_InitStruct);//实现串口1的初始化,简单明了,无需注释

  笔者在这里也想举一个示例来说明寄存器操作的步骤,但是操作寄存器实在是太复杂了,笔者不想去浪费时间去整理了。

  通俗易懂的C语言,方便移植的C语言与硬件平台相对应的编译器联合,就能完成硬件的操作。有了简单、方便的方式,我们为什么还要考虑繁琐,复杂的汇编语言与寄存器操作呢?

误区3:51单片机的成本低

  成本都是左右应用的主要因素。项目的立项主要考虑成本,销售的定价主要成本。低成本的方案才会在市场里占有优势。可是,51单片机真就是最低成本了吗?非也。现在按照功能划分,部分Cortex-m0系列的32位单片机的成本也能做3元人民币。其性能已经是51单片机的好几倍了,而且更容易开发与维护。

  还有另外一个成本:开发难度成本。51单片机不支持在线调试,有一些问题在编程初期没有发现,只有与硬件连接后才会显现出现来,例如控制操作中经常用到的延时。这时在线调试的巨大优势就体现出来了,它可以极其方便的查看微处理器当时的状态,使得问题的分析变得简单而透明。从而,有效降低开发的难度,缩短开发周期,节约开发资金。

误区4:51单片机入门简单

  51单片机入门简单?我对于这个观点持保留意见。想要入门51单片机,我不仅熟悉该款单片机外设,而且还要充分了解寄存器的某位的意义。对于时钟,定时器的配置必须了如指掌。这样无疑会增大我的学习难度与熟悉的周期。如果我们使用32位单片机的库函数模式,我们只需要具备C语言的知识,了解API函数,直接看已经注释过的寄存器意思即可,不需要了解其底层的硬件实现,更不需要了解某个寄存器某个指定位的意义了。这样,减少了我的工作量,从而降低了开发难度。你说是51单片机入门简单,还是32位Cortex内核微处理器简单?

  嵌入式系统的学习是非常枯燥而又有挑战性的事情。由于与实际的硬件直接连接,不仅要考虑编写的正确性,而且还要考虑硬件的可靠性。这时,简单、高效的软件编写就变向的降低我们开发难度与风险。51单片机已经是明日黄花,向前看才是发展。是时候向51单片机说再见了!


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:32:29 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:36 编辑

学什么单片机最有前途?
这是单片机初学者经常问的问题。对于这个问题,我想没有人敢下定论。因为每一种单片机各有所长,都适用于其所能充分发挥作用的领域,不存在优差之分。学单片机应该先学51单片机,学会了51单片机再去学其他单片机,这是学习单片机过来人的同感,也是公认的学习方法。为什么要先学51单片机?因为51单片发展最早,应用最广泛,特别是I/O口的操作非常简单,而且相关的学习资料最多、教材最成熟,学习起来得心应手,入门很快。有了这个基础再去学习其他单片机那就是小菜一碟了,只是对着芯片数据手册设置寄存器罢了,快则一两个星期,多则一个月就能掌握另一种单片机了。如果一开始就选择非51单片机学习,那将是“路漫漫其修远兮,你将艰难而求索!”

那学51单片机用C语言还是汇编语言好?当然是C语言了。因为:1.C语言是高级语言,代码移植性好,易于维护;2.编程灵活,随心所欲;3.语言层次分明,思路清晰,可读性强。4. C语言是目前最流行的单片机编程语言,例程代码多,便于参考,单片机技术发展之快,应用之广,学习群体日益庞大,这和keil C51开发环境的问世是分不开的。5.C语言是大众编程语言,是其他编程语言的基础,学会了C语言,对于进一步深造的选择就很自由了。汇编语言是早期单片机学习使用的语言,优点是执行指令比C语言稍快外,其他方面笔者不敢恭维。

学会51单片机以后,就可以根据你从事的工作或者你的目标选择以下一种或多种继续深造。

1.AVR单片机-----速度快,一个时钟周期执行一条指令,而普通的51单片机需要12个时钟周期执行一条指令。当然,Atmel公司出品的AT89LP系列单片机也是一个时钟执行一条指令,但目前还未普及。AVR单片机比51单片机多了USB通信模块、SPI通信模块、I2C通信模块、PWM模块、AD转换模块等,但在C语言编程方面对I/O的操作比51麻烦得多。

2.PIC单片机------品种齐全,应用领域广泛,片内资源也很丰富,也是很受欢迎的单片机。比51单片机多SPI通信模块、I2C通信模块、PWM模块、AD转换模块等片内资源。4个时钟周期执行一条指令,速度看似比51单片机快,事实上并非如此,PIC单片机最高时钟频率一般为8MHZ,而51单片机最高时钟频率可达到33MHZ 。速度上PIC单片机并不占优势,而抗干扰能力则也比51单片机略强。C语言编程方面对I/O的操作要比51麻烦。

3.MSP430单片机-----16位单片机,速度快,一个时钟周期执行一条指令,超低电压低功耗,适合用于电池供电设备。

4.Motorola单片机-----抗干扰能力极强,适用于恶劣环境,这是以降低速度为代价的。

5.DSP技术------用于音频、视频、通信等快速数字处理领域,速度超快,编程算法也比较复杂。

6.FPGA技术------难度和单片机差不多,应用领域逐渐广泛。

7.嵌入式系统-----应用于非PC机控制以外的复杂的智能控制系统,以及智能通信设备、掌上电脑、学习设备、娱乐设备等,应用领域也很广泛。学习难度也较大,需要有操作系统、硬件、驱动原理等方面的知识。山寨版的手机、掌上电脑等满街泛滥都是嵌入式系统发展惹的祸。

8.其他单片机
,如德州仪器单片机,合泰单片机,NEC单片机等。

要说学哪一种单片机最有前途,笔者也不敢妄加断言。不管选择那一种,前途光明与否都由你的造诣深度来决定,精则兴,不精则废。


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:38:05 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:39 编辑

你知道到吗,C语言竟是如何调用硬件的?

大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?

网友北极

c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言编译成汇编指令,CPU直接执行汇编指令。

所以这个问题就变成,汇编指令是如何操作硬件的?

如果把硬件平台限制在x86环境下,那么汇编指令操作硬件基本上只有两种方式:

方式一:

通过向内存空间写数据。硬件会把硬件上的各种寄存器(外行可以理解为访问硬件的接口或者操作硬件的工具)映射到某一块内存地址空间上,之后只要用汇编指令,甚至C语言去读写这一段内存地址空间(并非真正操作物理内存),就可以达到操作硬件的目的了。

如果题主还有WindowsXP环境(虚拟机也可以),就可以用汇编指令直接操作显存:

MOV AX,B800

MOV ES,AX

XOR DI,DI

MOV CX,0800

MOV AX,5555

REPZ STOSB

硬件的各种寄存器会被映射到某一块物理内存中,这种方式称为MMIO,在Windows的设备管理器里,右键点设备,看属性-》资源里,不少硬件设备都有“内存范围”的参数,这里的内存范围就表示这个硬件的资源可以通过访问这一段内存来控制它。



方式二:

x86汇编中,还有两个特殊的指令是IN和OUT,这是x86平台独有的,上面图里的I/O范围,就是用IN/OUT这两个指令来访问和控制的。

以上两种访问硬件的方式,第一种是可以用C语言实现的,上面一段汇编,本质上类似于C语言代码:

char ptr = 0xB8000;

int i;

for (i = 0; i 《0x800; i++)

{ptr + i = 0x55;

}

第二种IN/OUT方式没有直接的C语言语法对应,需要自己封装汇编。

那么为什么平时很难用C语言操作硬件呢?这是因为平时写的代码大多数都在保护模式下,保护模式下,直接访问物理地址会受到限制,C语言操作的地址都是虚地址。

对于Windows来说,要访问物理地址,需要工作在内核模式,也就是的写驱动才行。

而在显存方面,首先,题主要先明白物理地址和虚拟地址的概念。

原来的8086cpu设计的时候,地址空间有一块区域(640K-1M)之间,有一块作为显存使用

这里你说的预留的地址,是指物理地址,这一段地址的准确范围是000A0000-000BFFFF,不管是32位还是64位CPU,这一段物理内存地址一直都保留给显存使用,不区分32位还是64位,也不区分保护模式还是实模式。


可见这一段内存至今仍然是留给显卡使用的。

那么现在为什么不能直接用这段内存了?

因为现在的软件都运行在保护模式下,访问的地址都是虚拟地址,而并非物理地址,包括你使用cmd命令打开的环境,都是虚拟地址,虽然32位XP里能用debug命令向000B8000上写数据并能显示在cmd的界面里,但本质上,这都是虚拟出来的。

如果要想用这段显存怎么办?

自己写一个简易的操作系统,不启动显卡的各种图形加速功能,CPU进入保护模式后在GDT里映射一个4G的数据段,与物理地址一致,那么向000B8000上写数据,就会像过去DOS一样显示在屏幕上,所以保护模式下也可以访问这一段内存。所以,保护模式下,也可以用它。

显卡那么多显存是怎么映射的?



有很多内存地址被映射给显存了,就是通过这种映射关系,把一些物理地址留给显存,使得CPU能像访问内存一样访问显存资源。

当然,实际情况是,2G显存未必完全映射,而是只映射一部分地址,显卡有一些开放的寄存器能够控制哪部分显存映射过来,这样就能使得CPU在使用比较少的物理地址范围的情况下,访问全部的显存。

还有一个很有意思的事情:在虚拟机里,找到映射的高地址部分的第一块内存区域,写一个能直接访问物理地址的程序(比如一个驱动),去读这一块内存,然后写到文件里,再用屏幕截图,也写到文件里,会发现截图的内容和显存里读出来的内容基本上是一样的。

网友awayisblue

要回答你的问题,我们需要要知道:

硬件是一种什么样的存在

什么是驱动。

C语言怎么操作硬件

我就不严格去定义这些概念了,我就以一个例子来通俗地讲解一下吧。

首先讲硬件:

先介绍一款单片机芯片STM8。

这款芯片里面有cpu, 内存,寄存器(先不要觉得看到新名词压力大,继续往下看)等等,相当于我们的电脑了,但还要外接其它硬件。

这里你需要知道的概念是:

芯片的引脚跟寄存器是相对应的,寄存器是8位的内存单元(对,存在于内存上面),当你往这个内存单元里面写入数据时,芯片的引脚的电压会发生变化,比如说我写入的是01100001,则芯片上与之对应的8个引脚的电压状态(分为高电平与低电平两种)会输出:低高高低低低低高。

cpu可以执行代码指令,指令可以操作内存。

结论:所以从上面两点可以我们可以知道,cpu可以执行指令,使芯片的引脚电平(电压)发生变化。

关于这款显示器,我们需要知道的是:

它是有引脚的,这些引脚可以跟到前面介绍的那款单片机芯片的引脚相连。

该显示器有自带的内存,用于存储要显示的字符,显示器从该内存里面读取字符来来显示。

单片机芯片与该显示器相连后,可以通过引脚往该显示器的内存里写数据(通过多个引脚电平的高低不同来代表不同的数据,比如说:低高高低低低低高 代表01100001,这个数据写在显示器的内存里面,被显示器所显示,当然,会根据ASCII来显示数字对应的字符,01100001对应的字符是‘a’),除了接收数据的引脚外,还有控制显示器的引脚(这个我们会在驱动那里介绍,继续往下看)。

结论:单片机芯片与显示器相连,可以通过引脚输出的电平来控制显示器的字符显示。

那么,综合上面,也就是说,单片机芯片cpu可以通过执行指令来控制显示器的字符显示。

而这里,题主所说的硬件,指的就是这个显示器了。

接下来讲驱动:

那么,什么是驱动呢?驱动无非就是硬件跟软件的中间层,但我们不纠结这种关系,直接来看一下,对于我们这个例子,驱动指的是什么。首先我们要知道:

显示器支持很多种操作,比如说清除显示,光标移动,读取数据,写数据等等。

这些操作数据引脚和控制引脚来实现。

引脚可以通过单片机芯片来控制。

结论:我们可以通过在单片机芯片里面写显示器的“驱动”程序来屏蔽掉硬件(显示器硬件)层。

于是这里驱动程序,指的是显示器所支持操作的程序表示。比如说清除显示,我们可以编写一个clear()函数,光标移动,我们编写一个move_cursor()函数,读取数据和写数据分别为read()和write(),然后分别实现就可以了(通过向寄存器里写数据的形式,进而控制引脚的电平变化,再而控制显示器,这个过程前面已有介绍)。这些函数就是驱动程序了。为什么上面说驱动程序可以屏蔽掉硬件呢?因为程序员可以使用前面的驱动程序来直接操作显示器(硬件),而不用知道太多关于硬件的事情,而一般的驱动程序也可以由厂家来提供。

再说明一点:一般这些驱动程序可以用汇编写(出于运行效率的考虑),也可以用C语言来编写的,比如说我上面的例子,就可以直接用C语言来编写。当然C语言内联汇编的形式也可以。

最后讲C语言怎么操作硬件:

相信到这里,C语言是怎么操作硬件的已经比较明白了。

这里总结一下:

C语言由CPU运行(实际上是先编译成机器码存在芯片里面然后执行),可以去操作内存。

内存里有一段是跟寄存器相对应的,而寄存器是跟芯片的引脚相对应的,于是操作该段内存就能控制芯片引脚的电压变化。

硬件(比如说显示器)有引脚(或者说排线,这些也是一样的东西),这些引脚跟芯片的引脚相连可以接受芯片的控制。

可以把对某个硬件的操作做成一系列操作函数,这些操作函数就是驱动程序了。

于是我们的C语言只要去调用这个驱动程序就可以直接操作硬件了。(当然驱动程序也可以由C语言来编写,所以C语言操作硬件并不一定要经过驱动程序)。

网友Chow Anod

北极已经说的很到位了。我补充一些知识点:

1 语言层面上,C能直接操作的“硬件”只有内存地址。虽然C支持register关键字,但是不能指定某个特定的寄存器,所以只有内存地址。而C中操作内存地址的方式就是指针。例如:

char p = 。..;p = 。..;

2 根据1反推,可以明白如果要开放给C来操作某个硬件,最直接的方案就是设计硬件的时候预先分配好一些固定的地址的用途,然后实际项目中往这些固定地址写入合法的数据。这样就可以通过类似

uint32_t p = SCREEN_ADDR;p = RGBA(0xff,0xff,0xff,0xff);

这样的代码来实现对硬件的操作了。

3 那这个地址怎么拿到呢?什么样的数据才是合法的呢?要解答这些问题,就需要查阅具体设备的spec了。例如这个一眼看过去就能的明白的例子(一眼没看明白请反复阅读以完全理解上面第二点内容):

PS:x86架构的代码不能这么写,原因见北极的回答。

网友北极

我们是用电脑的键盘来输入的指令,每一个指令都对应一个ASCII码,而这里的ASCII码就是有序的电压的高低(或电流的有无,下面只提电压的高低),即我们输入的是电压的高低,你所看到代码是这些电压的高低控制显示器所显示的图像,其实电脑也不知道它是什么,只知道这样显示。

结论:代码其实就是存储在存储器(内存、硬盘或者闪存等等)中有序的电压的高低。

再说编译:

编译是一个有序的电压的高低向另一种有序的电压高低的一种转换过程,下面以52单片机为例,我们编译是从表示ASCII码的那种有序电压高低转换为52单片机能够识别的另一种规定好的有序电压高低,即表示HEX文件的电压高低。

结论:编译出的结果还是电脑中存储的有序电压高低。

到单片机烧录:

接下俩就是烧录,理解了上面两点就很容易理解下面的内容,烧录就是电脑中的有序电压高低通过数据线传输到单片机中的ROM中。

接下来ROM就可以释放其中的电压来控制外围的电路。

总结:从代码的编辑到最后对电路的控制都是电压在起作用,只是为了方面我们而给我们展现的形式不一样而已,而其本质都是电压,这样也就不存在转换。

理解这句话:世界上没有软件,软件只是对硬件的一种反映,就像意识是对世界的一种反映是一样的!

相信这样就很容易理解了。

看到有人赞同了我的观点,很开心,针对题目我再补充一点:

只要你提到0/1,提到软件,这个问题就没法理解。..因为软件【包括0/1】和硬件始终存在一道无法跨越的鸿沟;

你说你在单片机中写0,请问你是如何写0的?在键盘上敲个0?实际还是电平【和我们理解的数字没关系】,那个0只是你在电脑显示器上电平的呈现形式,那个所谓的0【实质是电平】可以传输到单片机中的ROM中,电平控制电平没什么疑问吧,这样就输出低电平了。


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:41:15 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:43 编辑

以前都搞错了,单片机C语言程序该这样写!


写单片机程序也是程序,也要遵循写软件的一些基本原则,不是为了完成功能那么简单。我看过的所有的C语言单片机书籍基本都不注重模块化思想,完全是拿着C当汇编用,简直是在糟蹋C语言!

如下问题,几乎所有的单片机书籍中都大量存在(更别说网上的和现实中的代码了,书上都写的那么差劲,学的人能好到哪里去):
1、变量到处定义,根本不管变量的生命周期是否合适(请回答:全局变量、局部变量、静态变量、volatile变量有什么区别联系?)
2、变量名称极不规范,根本从名字上看不出来这个变量类型是什么,到底想干什么。
3、函数定义几乎不用参数,全都是void
4、语句写的一点都不直观,根本就是在用汇编。比如:想取一个字长的高字节和低字节,应该定义一个宏或是函数来做,如#define HIBYTE(w) ((BYTE)((DWORD)(w) >> 8)),以后直接用HIBYTE()多直观,难道非得用(BYTE)((DWORD)(w) >> 8)代表你的移位操作的水平很高吗?
5、最重要的一点,没有建立模块化的编程思想。一个程序往往要很多部分协同工作,需要把不同的功能分离出来单独创建一个.h和.c的文件,然后在头文件中把可以访问的函数暴露出来。
6、不思考曾经做过的程序是否还有改进的余地,写程序如果只是为了写而写,一辈子也长进不了多少



CT-->网上搜资料的时候搜到这贴,做为一个从事单片机开发工作蛮久了的人,觉得楼主写得还是挺好,最少有自己的思想,特意注册ID来回复谈谈自己的观点。
------------------------------------------

写单片机程序也是程序,也要遵循写软件的一些基本原则,不是为了完成功能那么简单。我看过的所有的C语言单片机书籍基本都不注重模块化思想,完全是拿着C当汇编用,简直是在糟蹋C语言!
------------------------------------------
CT-->呵呵,我猜想你看的的这些书应该是一些以介绍单片机原理和应用的书籍,这些书侧重部分是教会新人如何去用单片机,所以在程序方面自然会存在一些弊病;另外有些书啊,可能是一些实际工作经验并不是很丰富、但会写文章的人组织出来的,当然就别对其抱太多期望。
CT-->给你推荐一本《ARM嵌入式系统开发——软件设计与优化》北航出版社的,相信你看了会说“好书还是有的”。其实不是单片机这样,PC编程的书也一样,国内VC的书不少,几本有台湾侯俊杰的《深入浅出MFC》那么用心写了呢?

如下问题,几乎所有的单片机书籍中都大量存在(更别说网上的和现实中的代码了,书上都写的那么差劲,学的人能好到哪里去):
1、变量到处定义,根本不管变量的生命周期是否合适(请回答:全局变量、局部变量、静态变量、volatile变量有什么区别联系?)
2、变量名称极不规范,根本从名字上看不出来这个变量类型是什么,到底想干什么。
3、函数定义几乎不用参数,全都是void
4、语句写的一点都不直观,根本就是在用汇编。比如:想取一个字长的高字节和低字节,应该定义一个宏或是函数来做,如#define HIBYTE(w) ((BYTE)((DWORD)(w) >> 8)),以后直接用HIBYTE()多直观,难道非得用(BYTE)((DWORD)(w) >> 8)代表你的移位操作的水平很高吗?
5、最重要的一点,没有建立模块化的编程思想。一个程序往往要很多部分协同工作,需要把不同的功能分离出来单独创建一个.h和.c的文件,然后在头文件中把可以访问的函数暴露出来。
6、不思考曾经做过的程序是否还有改进的余地,写程序如果只是为了写而写,一辈子也长进不了多少

欢迎拍砖!

------------------------------------------
CT-->你列出的这些问题确实是写单片机程序的人存在的普遍问题,因为单片机程序没有PC编程那样强调软件工程的一些概念,所以这些问题写单片机程序的人先天性就会比PC程序的要严重。但近些年随着嵌入式的流行,从事嵌入式编程的人在这些问题方面也逐步向PC程序靠拢,没有之前那么严重。

CT-->1.中的问题感觉你略有夸大,这些都是C的基本概念,如果不清楚只能说是对C的掌握太差,但volatile恐怕不是你想像的那么简单,我现在回问你在单片机和PC程序中到底什么情况下volatile才真正起作用呢?

CT-->2.
同上,和单片机关系不大,就是单片机汇编编程也要求变量名定义尽量直观。

CT-->3.这一点如果你看到某些经验工程师也这么写不要轻易下结论是人家程序风格不好,同PC比单片机可用的资源实在太少,而且程序的实时性要求更高,所以写有的时候写成void是为了避免参数传递产生的冗余代码,而是直接将参数放在全局变量中,这也是为什么有时候明明局部变量就可以的却定义成全局变量的原因之一。大一点的单片机产品的函数绝对不是你所见的样子,给你随便找一个例子看看:)
INT32 DV_startPlay(UINT8 *filename,UINT8 *buf_a,UINT8 *buf_b,UINT8 *buf_c,UINT32 buf_size,UINT8 *audBuf,UINT32 audSize,JPGBufInfo JpgBufInfo, UINT32 scale);

CT-->4.还是同1.2.,和是不是做单片机出身无关,而是人,也随便给你找一个台湾公司的单片机的头文件给你看看。
#define HI_BYTE(n) (UInt16)((n >> 8) & 0xFF)       /* n : 16 bits */
#define LO_BYTE(n) (UInt16)(n & 0xFF)         /* n : 16 bits */
#define BYTE2WORD(hi, lo) (UInt16)((hi << 8) | lo)

#define HI_WORD(n) (UInt16)((n >> 16) & 0x0FFFF)   /* n : 32 bits */
#define LO_WORD(n) (UInt16)(n & 0x0FFFF)   /* n : 32 bits */
#define WORD2LONG(hi, lo) (UInt32)(((UInt32)hi << 16) | lo)

/*****************************************************************************/
/* Derived Data Structure                                           */
/*****************************************************************************/
typedef union
{
    UInt16 WordCode;
    struct
    {
        UInt16  _byte0      : 8;     /* LSB byte code */
        UInt16  _byte1      : 8;     /* MSB byte code */
    } ByteCode;
} UWORD;

typedef union
{
    Int16        WordCode;
    struct
    {
        UInt16 _byte0      : 8;     /* LSB byte code */
        Int16 _byte1      : 8;     /* MSB byte code */
    } ByteCode;
} SWORD;

typedef union
{
    UInt32 LongCode;
    struct
    {
        UInt16  _word0      : 16;     /* LSB word code */
        UInt16  _word1 : 16;     /* MSB word code */
    } WordCode;
    struct
    {
        UInt16  _byte0      : 8;       /* bit 7  ~  0 */
        UInt16  _byte1      : 8;       /* bit 15 ~  8 */
        UInt16  _byte2      : 8;       /* bit 23 ~ 16 */
        UInt16  _byte3      : 8;       /* bit 31 ~ 24 */
    } ByteCode;
} ULONG;

typedef union
{
    Int32    LongCode;
    struct
    {
        UInt16  _word0      : 16;     /* LSB word code */
        Int16   _word1      : 16;     /* MSB word code */
    } WordCode;
    struct
    {
        UInt16  _byte0      : 8;       /* bit  7 ~  0 */
        UInt16  _byte1      : 8;       /* bit 15 ~  8 */
        UInt16  _byte2      : 8;       /* bit 23 ~ 16 */
        Int16   _byte3      : 8;       /* bit 31 ~ 24 */
    } ByteCode;
} SLONG;

#define BYTE0           ByteCode._byte0
#define BYTE1           ByteCode._byte1
#define BYTE2           ByteCode._byte2
#define BYTE3           ByteCode._byte3
#define WORD0           WordCode._word0
#define WORD1           WordCode._word1

#define ByteCode(x) x._byte1 << 8 + x._byte0
#define WordCode(x) (x._byte3 << 24 + x._byte2 << 16) + \
  (x._byte1 << 8 + x._byte0)

#define Byte0(x) x._byte0
#define Byte1(x) x._byte1
#define Byte2(x) x._byte2
#define Byte3(x) x._byte3
呵呵,是不是比你想的更周全?

CT-->5.模块化是任何一个有经验的单片机软件工程是都梦想实现的事情,但实际中很难做到这一点,和PC编程不同,PC的代码只要不换编程语言就可以在不同项目中直接使用,而单片机不同的项目常常是不同的硬件平台,可以说绝大部分都无法移植,象楼主的数码管驱动的代码,思路是非常好,放到实际中用处却不大,就算是有两个项目都要数码管显示,首先不能保证IO口就一定可以分给你是同一组P0;其次也不能保证一定是并行驱动,有可能需要串转并来实现。所以将其做为模板的实际意义不大,只能是当作一个类似应用经验笔记的东西,把自己的思想记录下来,相信楼主不会否认代码不重要,重要的是思想的观点。

CT-->6.严重同意。

CT-->
感觉你是用51的单片机做一些工具或演示类的东西,你对TIMER的方法去做量产产品可能存在问题,等下我和你分析。但你的思维方式确实很好,要留意的是再好的方法也不是万能的,产品需要结合实际。         


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:45:38 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:48 编辑

我们老师是这么教单片机的

看到不少网友都在问怎样提高自己的能力,我在这里想谈一下我自己当年的学习过程。
我学的是计算机系的通讯工程专业,主要的发展方向是做计算机网络偏软件这一块,这点从我的毕业设计课题《宾馆客房管理系统》就能看出来。
因为带到通讯,所以学校里也教数电模电单片机什么的。其中《单片机和通讯接口》这门课我学到了很多东西,可以说,整个大学觉得最有收获的就是这门课。
我的老师上课很有特性,首先没有教材,
理由是现在技术一日千里,等到教材出来就已经淘汰了。我们直接拿磁盘从老师的电脑上拷课件,然后打印。通常讲到单片机这门课,许多人学的时候都会觉得枯燥,因为很多都是一成不变的在讲8051,大段大段的源代码讲的大家昏昏欲睡,而我们的老师在整个单片机的教学过程中,从来没有提过8051这个东东,她可以说不是在上课,而是在介绍新技术,让大家都听得津津有味,大大提高了学生的积极性。
绝的是我们老师给我们布置的作业,总共有四次,作业从布置到上交有2周时间。


第一次作业,拷给我们一篇IC资料,全英文的,打印了三十几页,然后“微笑地”对我们说,作业很“少”,请大家把其中介绍XX控制字的那一段翻译一下,很少,就两段。当时我们很开心,上课听故事,下课作业就只要翻译两段英文。回去以后发现被卖了,三十几页,哪两段是介绍那个控制字的???最后基本把三十几页啃完后才在最后找到。哭倒一片。




第二次作业和第三次作业是都做一个单片机产品设计,作业题目就是《具有XX功能的产品》,具体怎么做让我们上网去查,要我们写出实现的硬件架构和软件运算流程,所用到的IC必须注明网址,要随机抽查,看看我们是不是有“天才”会自己开发IC,并说有很多IC可以实现这个功能,如果你们每一个IC都一样,我就知道你们抄袭作业,后果自负,然后就夹了包跑了。我们什么都不懂,只能去校园bbs广发英雄贴,然后在高手指点下去老古开发网、21IC找资料,或者用google大海捞针地翻,因为工作量大,最主要是看英文资料比较慢,作业又不能一样,然后就几个人合作,一个人专门找传感器方面的资料,一个人专门找数据处理IC方面的资料,一个专门找数据通信接口方面的IC,因为同样的产品,资料中的单词相同的比较多,可以提高速度,最后三个人合作了三款东东交差。




第四次是最BT的,让我至今记忆犹新,要做一个远程粮库温控系统,20个粮库,4*5的排列方式,每个粮库为20米边长的正方形,粮库间距10米,每个粮库要12个测温点,第一排粮库左边20米有一个房间监控所有粮库温度。数据要用10 Base T双绞线传输。要求我们设计粮库端数据采集器的温度采集、数模转换、数据前期处理的硬件架构和软件运算流程,并简短介绍相关IC;网络传输的硬件架构,因为粮库距离超过了10 Base T双绞线直接传输的有效距离;后台服务器要求我们写出所用服务器配置,操作系统,用什么数据库,数据库的关系图,用什么语言写后台处理程序,后台处理程序的运算流程,如果温度超标还要能自动发出警报,最后还要你说明,你为什么选用这个操作系统、数据库和后台程序语言,要和其他的比较一下,写出你的选用理由。这个作业算作50分成绩,同时和前面第二第三次作业一样,抄袭没门。同学抱怨BT,老师很轻松的口气说,你们大一学了C和C++,大二学了数电模电,大三学了DSP、数据库、系统集成、计算机原理和汇编,现在我只是让你们学会综合运用而已,前面没学好的,现在补补,不要出去说老师没有教。

工作到现在,觉得这个老师的四次作业,让我们非常受益,

1.我们不怕看英文资料,特别是IC方面的;
2.我们学会了怎样获取最新技术和资讯;
3.我们锻炼了团队合作,完成作业的时间限制就相当于现在抢占市场一样拖不得,怎样分工合作大家双赢才是最主要的;
4.就是我们已经养成了由面找点的习惯,每接触到一个电子产品,就会很快在大脑中出现这个产品的整个系统框架,然后逐一了解每个功能。而不是对每一个功能了解后,再去把他们联系起来。
5.毕业后感到在学校还学了不少东西^_^。


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:48:58 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-24 11:26 编辑

单片机的一生(感觉在说大部分人)

[导读]某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试),然后打预防针(绝缘处理),没有问题后作记录(QC pass),你的父母来接你回去(客户验收)。
某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试),然后打预防针(绝缘处理),没有问题后作记录(QC pass),你的父母来接你回去(客户验收)。

回家后你有了自己的新床(PCB),家里条件好,给你铺六张毛巾被(六层板),可惜上面小窟窿太多(过孔太多),父母把奶瓶给你,你终于获得了外部能量 (Power Supply),否则你的自身能量会耗尽(Battery too Low)。

每天清晨,你尚在休眠模式(IDL)下运行时,一阵铃声吵醒你(wake up,激活),你感觉很饿,于是大哭(Alarm Ring),父母马上来喂你,你不哭了(discard Alarm,解除报警),但很不争气地撒尿了(current output,电流输出)。

父母给你收拾完,开始教你说话,但你的大脑还很简单(initialprocedure,初始化程序),后来你开始学走路,结 果步调不稳(步进电机驱动错误),一跑就坐到地上了(RUN fail,运行失败)。好在你的父母很耐心地教你(调试阶段),你终于可以走了(调试通过)。

你逐渐长大,吃的也多了,给你的食物老是不够(功耗太大,power wastetoo heavy),你偷偷打开冰箱狂吃一顿,结果吃的太多不消化了(过载,overload),差点绷断肠子(route burn,烧断走线),还好你终于没事了,不敢吃那么多了(reduce power waste,降低功耗)。

后来你上学了,接受好多新的知识(new procedure),但是没有实际经验(未调试的),结果工作时发现那些知识不能照用,还要更多地学习别人的经验(Copy procedure,拷贝程序),不过你还是不断发现臭虫(BUG),只好请教灭虫专家来解决(调试高手)。

终于你的工作稳定了,你开始进入日复一日的工作状态(Endless Loop),你很烦,于是老是出错误(out of order,程序跑飞),结果老板开始盯紧你(软件陷阱),你被当场抓住修理一通,马上老老实实干活了(程序恢复)。

终于有个姑娘闯入你的生活(interrrupt,中断),使你忘记别的一切(优先级最高),你完全浸入爱河(进入中断服务子程序),大手大脚地花钱 (Large 模式),很快就结婚了(双CPU运行),你马上发现你的储蓄不够用了(RAM resource toolow),需要精简节约(compact模式),婚假也结束了,你又回去上班了(RETI,退出中断服务程序)。

后来日子越过越枯燥,老婆批评你脑 袋不够用(MIPS太低),不会算计(没有浮点运算能力),你对她的话一耳进一耳出(FIFO),你对老婆也爱理不理了(优先级降低),这时一个小姑娘勾 引你,你马上动心(抗干扰能差),幸好你老婆及时发现,严防紧守,你放弃了企图(丢弃乱码)。

日子恢复平静,一晃几十年过去,你发现你身边的年轻人都用全 新的知识装备着,他们都是在ARM大学毕业的,开着Linux的车子,大把花着票子(海量存储)。你低头看自己,发现自己只是在51大学毕业,开着汇编的 破车,手里钱少的可怜(256 字节内存)。你被迫到人才市场找工作,发现自己已经是多年前的旧货,降价处理了,你这样的都是一麻袋一麻袋的。

你长吁短叹,终于选择退休,靠养老金活着, 开始疾病缠身,你的牙齿有了问题(IO口驱动力下降),你说话不清楚(TXD发射失败),耳朵也不灵(RXD接收不灵),你的胃也不好,存不住食物 (ALE锁存失败),你终于因心肌梗死送到医院,医生手持电击手柄给你通电(高压测试),但你无法苏醒(复位失败),医生只好拔掉你的输液管(关闭电 源),你看了这个乱七八糟的世界最后一眼,终于POWER DOWN了。


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:50:54 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:53 编辑

闲说各家单片机的优缺点


经常会在网上看到各家推广单片机的人员宣传他们代理的单片机,比如pic,avr,c8051等,当然从宣传推广的角度,总是要多说些他说宣传推广的单片机的优点,这样才能让众多不是专家的工程师,学生,公司采购人员,老板对其感兴趣,进而受到诱惑而使用他们的单片机。
可以总结下:无论什么厂商的单片机,在宣传的时候提到的优点基本上有以下几条:
1.高性能。比如avr的单片机就说它是单机器周期的指令集,性能高,喜欢与8051的12T相比,说快了12倍

2.抗干扰能力强。这个尤其是pic的宣传者,说它是具有最好抗干扰能力的单片机


3.破*解困难,比如avr喜欢在这方面说事,说它什么什么熔丝技术,让人家无法破*解


4.低功耗。这点当然msp430是一流的,但我看到几乎所有的单片机宣传都说自己是低功耗的

剩余的就全是不靠谱的瞎扯了,比如在“为什么选择avr“中居然列出了超过20条理由,其中几乎所有的都是这些:"
(1)为什么选用AVR单片机? Flash程序存储器可擦写1000次以上,不再有报废品产生。PIC 有的是OTP,只能烧录一次。AVR程序存储器数据为16位组织,也可按8位理解。PIC是12/14位程序 存储器,作寄存器转移和算术、逻辑运算带来不便。


(2)为什么选用AVR单片机? 高速度(50ns)、低功耗!硬件应用Harward结构,具有预取指令功能, 使得指令可以在一个时钟周期内执行。PIC要4个时钟周期执行一条指令。MSC-51要12个时钟周期 执行一条指令。


(3)为什么选用AVR单片机? 超功能精简指令!具有32个通用工作寄存器(相当于8051中的32个累 加器,克服了单一累加器数据处理造成的瓶颈现象),有128B~4KB个SRAM,可灵活使用指令运算。


(4)为什么选用AVR单片机? 工业级产品!具有大电流(灌电流)10~20mA或40mA(单一输出),可直 接驱动SSR或继电器;有看门狗定时器(WDT),安全保护,防止程序走飞,提高产品的抗干扰能力。


(5)为什么选用AVR单片机? 程序写入可以并行写入(用万用编程序器),也可用串行在线ISP擦 写。也就是说不必将IC拆下拿到万用编程上烧录,而可直接在电路板上进行程序修改、烧录等操 作,方便产品现场升级。有ISP、JTAG及自编功能,这是今后单片机编程的发展方向 。


(6)为什么选用AVR单片机? AVR的I/O口是真正的I/O口,能正确反映I/O口的真实情况。I/O口 有输入/输出, 三态高阻输入,也可设定内部拉高电阻作输入端的功能,便于作各种应用特性所需 (多功能I/O口)


(7) 为什么选用AVR单片机? 高度保密(LOCK)!
–不可**的Lock bit技术
–不象Mask ROM那样可通过电子显微镜**–Flash单元深藏于芯片内部 –可多次烧写的Flash且具有多重密码保护锁死(LOCK)功能,因此可快速完成产品商品化,并可多 次更改程序(产品升级)而不必浪费IC或电路板,大大提高产品质量及竞争力。


(8)为什么选用AVR单片机? AVR内带模拟比较器,I/O口可作A/D转换用,可组成廉价的A/D转换器。


(9)为什么选用AVR单片机?可重设启动复位。AVR系列有内部电源开关启动计数器,可将低电平复 位(/RESET)直接接到Vcc端。当电源开时,由于利用内部RC的看门狗定时器,可延迟MCU启动执行程 序。这种延时使I/O口稳定后执行程序,以提高单片机工作可靠性。有的还有内部复位电压检测电
路BOD,而检测电压可调。


(10)为什么选用AVR单片机?具有休眠省电功能(POWER DOWN)及闲置(IDLE)低功耗功能。一般耗 电在1~2.5mA,典型功耗情况,WDT关闭时为100nA


(11)为什么选用AVR单片机? 像8051一样,有多个固定中断向量入口地址,可快速响应中断。而 PIC只有一个中断入口,要查询后才能响应中断,失去了最佳响应中断时间。

(12)为什么选用AVR单片机? AT90S1200/2343/ATtiny15等部分AVR器件具有内部RC振荡器- 1MHz的工作频率,使该类单片机成为无外加元器件即可工作,就是一片芯片,可谓简单方便,作加密 器件使用更妙。


(13)为什么选用AVR单片机? 计数器/定时器,C/T有8位和16位,可作比较器;计数器外部中断和 PWM(也可当D/A)用于控制输出,有的有3-4个PWM,作电机无级调速是理想器件。


(14)为什么选用AVR单片机?有串行异步通讯UART接口,不占用定时器和SPI传输功能,因其高速故 可以工作在一般标准整数频率,而波特率可达576K。


(15)为什么选用AVR单片机? AT90S4414/AT90S8515具有可扩展外部数据存储器达64KB。它们 的引脚排列及功能与8051相似,即可替代替8051系列单片机(8751或8752)的应用系统。仅差复位 电平,只需对调复位电阻、电容位置。还增加很多新功能,WDT,A/D,PWM等


(16)为什么选用AVR单片机? 工作电压范围宽(2.7~6.0V),电源抗干扰性强。 AT90LXX为低电 压器件(2.7~6.0V), AT90SXX电压为 (4.0~6.0V),最低器件ATtiny12己到1.8V ~ 5.5V。


(17)为什么选用AVR单片机? AT90S4434/8535具有8路10位A/D;AT90S2333/4433具有6路10位 A/D;功能更强的ATmega103/128有Flash 128KB,EEPROM 4KB,RAM 4KB,I/O端口48个,中断源16 个 ,外中断8个,SPI,UART,8路10位A/D,ISP。


(18)为什么选用AVR单片机? 并具有较大容量、可擦写10万次的EEPROM,对掉电后数据保存带来 方便,来电后能记住掉电时的工体状态,EEPROM(64B~4KB) 。


(19)为什么选用AVR单片机? 新的高档AVR ATmega16/32/64/128还具有JTAG边界扫描、仿真、 编程功能,不会造成以往仿真通过,脱机不行的现象。


(20)为什么选用AVR单片机? AVR 微处理器---可以对自己编程..ATmega161为使用便利性而设 计

–写入新代码时无需外部器件
–小扇区:128字节
–Boot区可变
–Read-While-Write技术
–减少编程时间
–受控于硬件的编程方法
–打开通向新世界的大门
–通过任何接口进行编程(并行编程器、ISP、JTGA、 UART 、自编程)–重复编程无需外部器件
–100%安全的远程加密更新方式


(21)为什么选用AVR单片机? 从高级语言C代码,看各种单片机性能比较: 从一个小C函数为例:

/* Return the maximum value of a table of 16 integers */
;返回最大值的表格的16位整数
int max(int *array);数组*array
{
char a;
int maximum=-32768;最大的=-32768
for (a=0;a<16;a++)
if (array[a]>maximum)
maximum=array[a];
return (maximum);返回
}


性能比较:

AT90S8515 8 MHz
80C51 24 MHz
68HC11A8 12 MHz
PIC16C74 20 MHz
编译结果结论:
8 MHz AVR ——224 MHz 80C51
HC11:代码效率高,但是处理能力只有AVR的1/10,功耗却高 2.5倍
PIC 速度快, 但是在相同功耗下AVR性能比其高3.5倍


(22)为什么选用AVR单片机?AVR使用众多功能强大的高级语言

● IAR AVR C编译器 编译器与AVR同步设计,支持C和EC++ ,Demo版只生成调试文件,
● ICC AVR C 编译器 支持无SRAM器件;增加组软件模块;Icc Demo版30天是完全版, 30天后转 限2KB版
● Code Vision AVR C编译器 有组软件模块,Demo版为限2KB版
● GNU C编译器 网友联盟自由免费版,升级慢
● BASCOM-AVR Demo版为限2KB版


(23)为什么选用AVR单片机?AVR有各种档次的开发工具

评估工具
–AVR Studio
–STK500
–GNU GCC 编译器高性能开发工具
–AVR Studio
–STK500
–ICE10 / ICE30/ICE200
–IAR C
低成本开发工具
–AVR Studio
–ICE200 / JTAGICE
–Imagecraft C
- 本站开发AVR mega16/32 学习开发板


(23)为什么选用AVR单片机?有了AVR基础,我们学习FPSLIC(=AVR+FPGA+SRAM),使我国单片机开发 进入芯片级开发。"

上面只是拿一个宣传avr单片机的,在网上广为流传的帖子为例来说,倒不是对avr本身有什么意见,也不是说其他厂商单片机就比它好。


我可以说,上述90%是废话,是没话找话,是忽悠不大懂单片机的人的胡扯的话。比如第23条:真高,居然把学习avr和发展我国芯片设计技术扯到一块了,这也太能扯蛋了,试问按照写这个帖子老兄的意思,难道学pic,8051就对进入芯片级开发没有帮助?推而广之,或许我放个屁也对中国芯片产业产生影响。


第22条,大意是avr可以用高级语言开发,这也算avr的优点?什么单片机不能用高级语言开发,举个例子出来?


第21条:也是胡扯,把avr与motorola的68HC11A8 比,你怎么不和intel的酷睿比啊?68HC11A8 是什么年代的?它热卖的时候,你avr还不知道在哪娘肚子里呢,与8051比也是同样,传统8051确实不怎么样,但要说8MHZ avr相当与224MHZ 8051我不相信,不知道作者是怎么得出这个结论的。


第20条:大意是可以isp,这个我想目前大多数单片机都具有这个功能吧。avr并没有什么特别之处,也没什么突出之处,请不要把一个已经成为基本功能的东西还拿出来作为亮点在忽悠


第17-19条:什么avr具有jtag,具有spi,adc等等作为亮点在说,同样,现在几乎所有单片机都具备上述功能,而且据我了解,avr在这方面表现一般,很多单片机具有更多路adc,更高精度adc,更多路spi,i2c,uart等等,比如TI msp430,飞思卡尔s08


第8-16条,跟上面一样,说的全是基本功能,说的全是所有单片机都具备的功能,什么具有定时器,什么具有adc,什么uart不占用定时器,什么低功耗模式。。。。,打住打住,这算是你要吹嘘的优点吗?找找看现在的单片机哪个没有这些功能,当然你如果硬是用古老的8051或者moto的68hc,因为不是一个年代的,比较没什么意义。据我所知,avr在这方面很一般,很多单片机比它强,有更多的uart,更好的低功耗模式,更多更灵活的定时器。。。,看看飞思卡尔的s08系列就知道了。


第1条尤其古怪,竟然说avr是flash的,pic是otp的,这真是胡扯,pic也有flash的,几乎所有厂商的单片机都同时有flash版本,otp版本,甚至rom版本的,avr真不该拿这个说事


2-7这几条,基本上是说高速高性能,虽然说avr确实是接近1mips/mhz,但avr的性能并不是多突出的,这涉及到体系结构的问题,avr通常在3.3v时候只能最高跑8MHZ,5V跑16mhz,这是非常低效的,大多数单片机都比它快!我甚至怀疑,为什么avr的主频做不高,很可能是它的架构有致命伤,本来就做不高,当然这个只是我的怀疑,否则为什么不做个40MHZ的atmeag16?


上面那么多,其实就是想说大多数这些宣传的东西都市胡扯的,很不专业,很多误导,上述avr的所有23条优点都不是优点,因为msp430,s08都具备,甚至比它更好。


比上述更胡扯蛋的,甚至是无耻的就是stc单片机的宣传,号称相当于480mhz的传统8051,说永不可解密,说什么intel统一x86,宏晶统一8051,如此狂妄无知无耻的宣传语真是让人无语


当然从宣传角度来说,中国向来是没有什么诚信的国家,电视上,媒体上各种广告都普遍虚假宣传,虚夸成分很重,这是中国国情,从这个角度说,那些宣传单片机的人这么写没有什么不对,因为行情就是这样。如果是我去宣传,也会这么做,不过我会注意不会那么离谱,肯定比这些人写的真实些,水分少很多。




回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:54:27 | 显示全部楼层
单片机的一生(感觉在说大部分人)

某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试),然后打预防针(绝缘处理),没有问题后作记录(QC pass),你的父母来接你回去(客户验收)。

回家后你有了自己的新床(PCB),家里条件好,给你铺六张毛巾被(六层板),可惜上面小窟窿太多(过孔太多),父母把奶瓶给你,你终于获得了外部能量 (Power Supply),否则你的自身能量会耗尽(Battery too Low)。

每天清晨,你尚在休眠模式(IDL)下运行时,一阵铃声吵醒你(wake up,激活),你感觉很饿,于是大哭(Alarm Ring),父母马上来喂你,你不哭了(discard Alarm,解除报警),但很不争气地撒尿了(current output,电流输出)。

父母给你收拾完,开始教你说话,但你的大脑还很简单(initialprocedure,初始化程序),后来你开始学走路,结 果步调不稳(步进电机驱动错误),一跑就坐到地上了(RUN fail,运行失败)。好在你的父母很耐心地教你(调试阶段),你终于可以走了(调试通过)。

你逐渐长大,吃的也多了,给你的食物老是不够(功耗太大,power wastetoo heavy),你偷偷打开冰箱狂吃一顿,结果吃的太多不消化了(过载,overload),差点绷断肠子(route burn,烧断走线),还好你终于没事了,不敢吃那么多了(reduce power waste,降低功耗)。

后来你上学了,接受好多新的知识(new procedure),但是没有实际经验(未调试的),结果工作时发现那些知识不能照用,还要更多地学习别人的经验(Copy procedure,拷贝程序),不过你还是不断发现臭虫(BUG),只好请教灭虫专家来解决(调试高手)。

终于你的工作稳定了,你开始进入日复一日的工作状态(Endless Loop),你很烦,于是老是出错误(out of order,程序跑飞),结果老板开始盯紧你(软件陷阱),你被当场抓住修理一通,马上老老实实干活了(程序恢复)。

终于有个姑娘闯入你的生活(interrrupt,中断),使你忘记别的一切(优先级最高),你完全浸入爱河(进入中断服务子程序),大手大脚地花钱 (Large 模式),很快就结婚了(双CPU运行),你马上发现你的储蓄不够用了(RAM resource toolow),需要精简节约(compact模式),婚假也结束了,你又回去上班了(RETI,退出中断服务程序)。

后来日子越过越枯燥,老婆批评你脑 袋不够用(MIPS太低),不会算计(没有浮点运算能力),你对她的话一耳进一耳出(FIFO),你对老婆也爱理不理了(优先级降低),这时一个小姑娘勾 引你,你马上动心(抗干扰能差),幸好你老婆及时发现,严防紧守,你放弃了企图(丢弃乱码)。

日子恢复平静,一晃几十年过去,你发现你身边的年轻人都用全 新的知识装备着,他们都是在ARM大学毕业的,开着Linux的车子,大把花着票子(海量存储)。你低头看自己,发现自己只是在51大学毕业,开着汇编的 破车,手里钱少的可怜(256 字节内存)。你被迫到人才市场找工作,发现自己已经是多年前的旧货,降价处理了,你这样的都是一麻袋一麻袋的。

你长吁短叹,终于选择退休,靠养老金活着, 开始疾病缠身,你的牙齿有了问题(IO口驱动力下降),你说话不清楚(TXD发射失败),耳朵也不灵(RXD接收不灵),你的胃也不好,存不住食物 (ALE锁存失败),你终于因心肌梗死送到医院,医生手持电击手柄给你通电(高压测试),但你无法苏醒(复位失败),医生只好拔掉你的输液管(关闭电 源),你看了这个乱七八糟的世界最后一眼,终于POWER DOWN了。



回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:55:18 | 显示全部楼层
本帖最后由 tiankai001 于 2018-5-23 15:56 编辑

学习单片机的八个步骤

学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。

第一步:数字I/O的使用

使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。


第二步:定时器的使用
学会定时器的使用,就可以用单片机实现时序电路,时序电路的功能是强大的,在工业、家用电气设备的控制中有很多应用,例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。 最初使用的时候,可以做一个简单的例子,比如定时500ms,让led闪烁。定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。

第三步:中断
单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事情,例如,按钮按下时的下降沿。要使单片机在程序正常运行过程中,对快速动作做出反应,就必须使用单片机的中断功能,该功能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行正常的程序。中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断),需要设置哪些寄存器才能使某种中断起作用,中断开始时,程序应该干什么,中断完成后,程序应该干什么等等。中断学会后,就可以编制更复杂结构的程序,这样的程序可以干着一件事,监视着一件事,一旦监视的事情发生,就中断正在干的事情,处理监视的事情,当然也可以监视多个事情,形象的比喻,中断功能使单片机具有吃着碗里的,看着锅里的功能。
    以上三步学会,就相当于降龙十八掌武功,会了三掌了,可以勉强护身。

第四步:与PC机进行RS232通信
现在单片机基本都有UART接口,很多都具有两个UART接口。当单片机与PC机进行串口通信时,UART接口与电脑的RS232接口之间需要使用一个类似MAX232的芯片进行电平转换。UART接口的使用是非常重要的,通过该接口,可以使单片机与PC机之间交换信息,虽然RS232通信并不先进,但是对于接口的学习是非常重要的。正确使用UART接口,需要学习通信协议,PC机的RS232接口编程等等知识。试想,单片机实验板上的数据显示在PC机监视器上,而PC机的键盘信号可以在单片机实验板上得到显示,将是多么有意思的事情啊!

第五步:学会A/D转换
目前性能较好的单片机都带有片上的ADC,支持多通道,分辨率也从8位,10位到12位或更高。通过这些A/D转换器可以使单片机操作模拟量,显示和检测电压、电流等信号。学习时注意模拟地与数字地、参考电压、采样时间,转换速率,转换误差等概念。使用A/D转换功能的简单的例子是设计一个电压表。

第六步:学会SPI、I2C接口和液晶显示器接口
这些接口的使用可以使单片机更容易连接外部设备,在扩展单片机功能方面非常重要。

第七步:学会比较、捕捉、PWM功能
这些功能可以使单片机能够控制电机,检测转速信号,实现电机调速器等控制起功能。
如果以上七步都学会,就可以设计一般的应用系统,相当于学会十招降龙十八掌,可以出手攻击了。

第八步:学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计
学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计是非常重要的,因为这是当前产品开发的发展方向。

到此为止,相当于学会15招降龙十八掌,但还不到打遍天下无敌手的境界。即使如此,也算是单片机大虾了。



回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 15:57:18 | 显示全部楼层
63岁老人自学单片机,8年做出跳舞机器人(我们还有什么理由不努力?)

李祖臣,63岁,8年前,为实现梦想,他自学单片机、电脑知识,在书店一泡就是一天。朋友曾说他是"三分钟热血"的想法,可是,8年后,几百次尝试,老李终于造出模特机器人,能跳舞,能摆POSE!

提起老李,住在长春市汽开区54街区的老邻居都知道,这是一个机器人发烧友,为啥说是发烧友,因为他退休后利用8年时间,研究出来一台仿模特机器人,这个机器人最厉害的就是能随着音乐跳舞,动作幅度大,关节灵活,“高兴”起来甚至还会转圈,所有参观过的邻居们都对这台机器人赞叹不已。

制作机器人的初衷是想让模特动起来

老李名叫李祖臣,今年63岁,8年前开始,他就开始一门心思钻研机器人,利用多年时间,终于在不久前完成了这项领他魂牵梦绕的“工程”。“还没给她起名字,她目前的名称应该叫仿模特机器人。”老李说,他从小就喜欢创造,喜欢机器人,而制造机器人的想法则源于十几年前。

“当时我陪爱人去逛商场,就看见商店里摆着不少模特,但这些模特只能看,也不会动,展示不出来衣服上身之后的效果,然后我就想,以后退休了要亲自研究一台模特机器人。”老李说,2007年他从单位下岗后,他就开始着手研制机器人。

“我年轻时是从事机械加工方面的工作,有一些经验,但要说自己造一个机器人,知识储备肯定不够。”老李说,在最开始的日子里,他几乎泡在网络和书店里,一点点的摸索着。“研究机器人很耗钱的,我买的零件都不便宜,光电机就烧了十几部。”

老李说,原本他以为研究这样一台机器人,只需要一两年,但没想到,这一钻研,就是整整8年时间。“这几年我大部分时间都放在机器人上面了,做梦都想着怎么改进。”老李说,这个机器人在他眼里,就如同自己的女儿,“我有个儿子,没有姑娘,我跟老伴儿说,我自己给自己造了一个女儿。”

机器人能跳舞“高兴”起来还转圈

在老李家中,新文化记者见到了老李的这个“宝贝”机器人。高一米七,身体纤瘦,长发大眼带着假发,身穿粉色连衣裙,离远看去,真如同商店内的模特一般。“她会的可多了,摆姿势,跳舞,啥都会……”说话间,老李按动了手中的遥控器,而眼前这个仿模特机器人真的跳起了舞蹈。

伴随着歌曲《我的祖国》,这个机器人竟然从头跳到尾,不仅双臂摆动着不同的姿势,就连腰部和腿部也动了起来,跳到“高兴”处,甚至还转起了圈来。“我这台机器人最厉害的就是这点,我上网查过其他的类似机器人,动作都比较呆板,腰部以下几乎没有动作,我这个机器人不同,腰部也会动,动作幅度都很大。”老李称,他自认为自己的这台机器人,已经属于全国领先的技术范畴。

“她现在会跳十多种舞蹈,主要编程这块,都是我自学的。”老李说,如今这部机器人算是初步成型,但后期还有很大的改进空间。“现在能够很好的运转了,过去实验阶段,每次通电我都双手冒汗,就害怕出现问题,把电机烧了……”

执着得到家人支持目前正在申请专利

自从机器人成功研制出来以后,老李邀请来了不少亲朋前来参观,大家都对他的发明惊叹不已。“现在是研究出来了,当初研究的时候,家人其实是不同意的。”老李说,他刚退休那年,工资很低,家里过得比较紧,但他仍执意研究机器人,“老伴儿赚钱养家,我就一心扎在了机器人上面,刚开始儿子觉得家里都是零件,太乱,不同意我研究,后来也被我的毅力感动了。”老李说,他自己的性格比较倔强,一般认准的事都会坚持到底。在老李家的阳台上,新文化记者看见满地的机器人零件,老李表示,这只是其中一小部分,自己已经处理掉了很多。“我觉得只要我活着,就得研究这个,不把这个机器人做好,让我干什么都没意思。”

“市面上没有买这种机器人的,未来她的用途很大,比如摆在商店里能帮助顾客试衣服,大型活动可以让她去当迎宾……”老李说,未来他还会继续改造这台机器人,目前阶段他正在给这台仿模特机器人申请专利,“目前还没申请下来,但我相信她未来的市场空间很大。”


回复

使用道具 举报

1315

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-23 16:40:41 | 显示全部楼层
厉害啊,我从没有看过一篇啊,

点评

牛人都是给别人看自己写的东西,不用看别人写的东西  详情 回复 发表于 2018-5-23 16:50


回复

使用道具 举报

6471

TA的帖子

4955

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-5-23 16:50:07 | 显示全部楼层
star_66666 发表于 2018-5-23 16:40
厉害啊,我从没有看过一篇啊,

牛人都是给别人看自己写的东西,不用看别人写的东西


回复

使用道具 举报

1315

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-23 19:12:06 | 显示全部楼层
是吗?


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-20 20:54 , Processed in 0.365636 second(s), 17 queries , Gzip On, Redis On.

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