文章目录
单片机有如下类型:51、AVR、MSP430、STM8、STM32、DSP、Linux、FPGA。
作为初学者,首推51单片机。因为其操作简单,入门资料最丰富,上手较快。在学习 51 单片机的时,不能仅仅当做51 来学习,要当做“单片机”来学,要把单片机的内部资源都搞清楚、弄明白,每个内部资源模块的用法理解透彻,这样当遇到一个从没有用过的单片机,也能快速知道如何下手去使用它。
单片机是一门实用技术。学习单片机需要在实践中成长,不断地练习。
学完单片机能做什么
单片机的应用非常广泛,电子、电气、自动化、通信等领域都有大量的应用。生活中常见的电子产品如:智能小车、LED 点阵屏、四轴飞行器、电子密码锁、门铃、超市储物柜、智能电饭煲、智能台灯、智能风扇等。工业领域的应用主要体现在单片机的控制、通信方面。
学习单片机应该学 C 还是汇编语言?
在实际开发中,目前至少有 95%以上的工程师是使用 C 语言做单片机开发的,只有在一些特殊要求的场合才会用到汇编,所以这里强烈建议大家使用 C 语言开发。
我们先来看下开发板各功能模块,如下:


上面我们介绍了开发板各个模块的功能,下面我们看看如何使用这款开发板。
首先,拿到开发板,我们要安装下 USB 转串口 CH340 驱动,对于大多数电脑系统,将 USB 线连接电脑和开发板的 USB 接口后会自动检测安装 CH340 驱动,如果您的电脑没有自动安装 CH340 驱动,没关系,我们可以手动安装,打开资料目录:“\5–开发工具\2-开发板 CH340 驱动”,如下:

双击 SETUP.EXE 应用程序,出现如下界面,点击安装即可。

一段时间后,如果安装成功会显示如下界面:(前提:必须使用 USB 线将电脑 USB 口和开发板 USB 接口连接)。

驱动安装成功后可以打开打开资料目录“\5–开发工具\3-程序下载软件\PZ-ISP.exe”软件,查看串口号是否显示有“CH340”字样的串口,如果有则证明驱动安装成功,否则失败。如下:

安装好 CH340 驱动后,我们就可以下载程序了,在下载程序前先确认下开发板上的 USB 转 TTL 串口模块上的 P5 端子短接片是否短接好(即 P31T 与 URXD连接,P30R 与 UTXD 连接),出厂的时候该短接片默认已经短接好,如下所示:

PZ-ISP 是普中自主研发的自动下载软件,可一键下载,操作非常简单,推荐大家使用 PZ-ISP 软件下载程序。打开此软件选择对应的 51 单片机类型进行程序下载。具体操作如下:





.HEX文件,点击“打开”即可选择好需要下载的程序,操作如下:

可使用普中 51 仿真器插入单片机座进行在线调试,但是需要在 KEILC51 软件内设置。会在后续的“51工程模块创建”中详细说明。
下面补充介绍51仿真器驱动安装方法。





PZ51 Tracker Driver,并选中Run to main()
Settings,设置参数
Utilities选项卡中,选择驱动
选择start debug,结果如下:

将普中 51 仿真器插入单片机座进行在线调试。
最后,程序下载成功后即可观察到实验现象。以“点亮第一个LED显示灯”为例,其实验现象为:

一台能够工作的计算机要有这样几个部件构成:CPU(进行运算、控制)、 RAM(数据存储_掉电会丢失)、ROM(程序存储_掉电不丢失)、输入/输出设备(例如:串行口、并行输出口等)。而在单片机中,这些部件全部被做到一块集成电路芯片中,所以就称为单片机(也称微控制器MCU)。
51 单片机是对所有兼容 Intel 8031 指令系统的单片机的统称。80C51 是 MCS-51 系列中的一个典型品种;其它厂商以 8051 为基核开发出的CMOS 工艺单片机产品统称为 80C51 系列。当前常用的 国产80C51 系列单片机主要产品有:STC(国产宏晶)单片机:STC89C51、STC89C52、STC89C516、STC90C516 等众多品牌。
80C51 芯片管脚图如下所示:

上图中左图是 51 单片机非常经典的管脚图,通常采用的是 DIP-40 封装。其内部资源如下:
- CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器。
- RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
- ROM:用以存放程序、一些原始数据和表格;
- I/O 口:四个 8 位并行 I/O 口,既可用作输入,也可用作输出
- T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在计数模式;
- 五个中断源的中断控制系统;
- 一个全双工 UART(通用异步接收发送器)的串行 I/O 口,用于实现单片机之间或单片机与微机之间的串行通信;
- 片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为 6M—12M。
其内部结构图如下所示:

总线(BUS)是单片机各部件之间传送信息的公共通道。单片机中有内部总线和外部总线两类,内部总线是 CPU 内部之间的连线,外部总线是指 CPU 与其它部件之间的连线;外部总线有三种: 数据总线 DB(Data Bus),地址总线 AB(Address Bus)和控制总线 CBControl Bus)。我们学习的是定时计数器、并行I/O口、串行通信口和中断系统。

上图可看到芯片表面印有 STC89C52RC 40I-PDIO40 1947H0XN52.X90C 丝印,下面我们了解下芯片表面丝印的含义:
- C 表示商业级,温度范围为 0~+70 度。
- I 表示工业级,温度范围为-40~+85 度。
- A 表示汽车级,温度范围为-40~+125 度。
- M 表示军用级,温度范围为-55~+150 度。
STC89C51 是 STC 推出的新一代超强抗干扰/高速/低功耗的 51 单片机,它是采用 8051 核的 ISP(In System Programming)在系统可编程芯片,指令代码完全兼容传统的 8051 单片机,最高工作时钟频率为 80MHz,片内含 4K Bytes 的可反复擦写 1000 次的 Flash 只读程序存储器,器件兼容标准 MCS-51 指令系统及80C51 引脚结构,芯片内集成了通用 8 位中央处理器和 ISP Flash 存储单元,具有在系统可编程(ISP)特性,配合 PC 端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。STC89C51 系列单片机是单时钟/机器周期(1T)的兼容 8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成 MAX810 专用复位电路。其特性功能主要如下:
下图我们可以看到 51 单片机不同封装的引脚图,


在讲解各引脚含义之前,我们首先应该学会如何在实物上区分引脚序号,基于 8051 内核的单片机,若引脚数相同,或封装相同,它们的引脚功能是相同的,其中用的较多的是 40 脚 DIP 封装的 51 单片机,也有 20,28,32,44 等不同引脚数的 51 单片机。
无论哪种芯片,单片机也好,其他不知名的芯片也好,当我们观察它的表面时,大都会找到一个凹进去的小圆坑,或是用颜色标记的一个小标记(圆点或三角或其他小图形),这个小圆坑或者小标记所对应的引脚就是这个芯片的第 1 脚,然后逆时针方向数下去,即 1 到最后一个引脚。对于 DIP 封装,小圆坑在芯片上方正中间位置,对应左边第一个脚位为 1;对于 PLCC 封装,小圆坑在芯片上方正中间位置,对应脚位为 1;在实际焊接或绘制电路板时,大家务必要注意它们的脚位标号,否则若焊接错误则导致产品无法正常工作。

下面我们以上图 PDIP 封装引脚图为例介绍各个引脚的功能,40 引脚我们按其功能类别可分为四类:
- VCC(40 脚)、GND(20 脚):电源引脚,不同型号单片机接入对应电压,常压为+5V,低压为+3.3V,大家在使用时要查看其芯片所要求的电压。
- XTAL1(19 脚)、XTAL2(18 脚):外接时钟引脚。XTAL1 为片内振荡电路的输入端,XTAL2 为片内振荡电路的输出端。8051 的时钟有两种方式,一种是片内时钟振荡方式,即需在这两个引脚处外接石英晶振和振荡电容,振荡电容的值一般取 10p~30p;另一种是外部时钟方式,即将 XTAL1 接地,外部时钟信号从 XTAL2脚输入。通常使用第一种方式
- RST(9 脚):复位引脚。当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始化操作,即单片机从头开始执行程序。
- PSEN(29 脚):程序存储器允许输出控制端。在读外部程序存储器时 PSEN低电平有效,以实现外部程序存储器单元的读操作,由于现在我们使用的单片机内部已经有足够大的 ROM,所以几乎没有人再去扩展外部 ROM,因此这个引脚大家只需了解即可
- ALE/PROG(30 脚):在扩展外部 RAM 时,ALE 用于控制把 P0 口的输出低 8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。ALE 有可能是高电平也有可能是低电平,当 ALE 为高电平时,允许地址锁存型号,当访问外部存储器时,ALE 信号负跳变(即由正变负)将 P0 口上低 8 位地址信号送入锁存器;当ALE 为高电平时,P0 口上的内容和锁存器输出一致。关于锁存器后面我们会有介绍。在没有访问外部存储器期间,ALE 以 1/6 振荡周期频率输出(即 6 分频),当访问外部存储器时,以 1/12 振荡周期输出(12 分频)。从这里可以看到,当没有扩展外部 RAM 时,ALE 会以 1/6 振荡周期的固定频率输出,因此可以作为外部时钟,或作为外部定时脉冲使用。PROG 为编程脉冲的输入端,单片机的内部有程序存储器(ROM),它的作用是用来存放用户需要执行的程序,那么我们怎样才能将写好的程序存入这个 ROM 中呢?实际上,我们是通过编程脉冲输入才写进去的,这个脉冲的输入端口就是 PROG。现在绝大多数单片机都已经不需要编程脉冲引脚往内部写程序了,比如我们使用的 STC 单片机,它可以直接通过串口往里面写程序,只需要三条线与计算机相连即可。而且现在的单片机内部都已经带有丰富的 RAM,所以也不需要再扩展 RAM 了,因此 ALE/PROG 引脚用于不大,大家了解即可
- EA/Vpp(31 脚):EA 接高电平时,单片机读取内部程序存储器。当扩展有外部 ROM 时,当读取完内部 ROM 后自动读取外部 ROM。EA 接低电平时,单片机直接读取外部 ROM。我们没有外扩 ROM,并且需要单片机直接读取内部程序存储器,因此 EA/Vpp 脚直接接高电平。
- P0 口(39 脚~32 脚):双向 8 位三态 I/O 口,每个口可独立控制。51 单片机 P0 口内部没有上拉电阻,若输出高时为高阻态,不能正常输出高电平,因此该组 I/O 口,每个口可独立控制。51 单片机 P0 口内部没有上拉电阻,若输出高时为高阻态,不能正常输出高电平,因此该组 I/O 口在使用时务必要外接上拉电阻,一般我们选择接入 10K 欧上拉电阻。
- P1 口(1 脚~8 脚):准双向 8 位 I/O 口,每个口可独立控制,内部自带上拉电阻,这种接口输出没有高阻态,输入也不能锁存,故不是真正的双向 I/O 口。之所以称它为“准双向”是因为该口在作为输入使用前,要先向该口进行写 1 操作,然后单片机内部才可正确读出外部信号,也就是要使其先有个“准”备过程,所以才称为准双向口。对 52 单片机 P1.0 引脚的第二功能未 T2 定时器/计数器的外部输入,P1.1 引脚的第二功能为 T2EX 捕捉、重装触发,即 T2 的外部控制端
- P2 口(21 脚~28 脚):准双向 8 位 I/O 口,每个口可独立控制,内部自带上拉电阻,与 P1 口相似。
- P3 口(10 脚~17 脚):准双向 8 位 I/O 口,每个口可独立控制,内部自带上拉电阻。作为第一功能使用时就当做普通 I/O 口,与 P1 口相似。作为第二功能使用时,各引脚的定义如下:
从图中可知,P3 口的每一个引脚均可独立定义为第一功能的输入/输出或第二功能
51 单片机主要用于“控制”,通过串口可以和 WFIF/GPS/蓝牙等模块实现无线控制,通过 AD 接口可以采集光敏/烟雾传感器/可燃气体传感器等模拟信号,还可以使用 AD 设计简易示波器。当然还包括直流电机、交流电机、步进电机、伺服电机、变频电机、电磁铁、电磁阀、LED、LCD 等等,进而由这些去驱动各种设备,应用于家电、机械加工、制造、航空航天等各行各业。
日常生活中可采用 51 单片机设计的电子产品:智能手环,微型四轴飞行器,平衡车、扫地机、移动 POST 机,智能电饭锅,3D 打印机、机器人等。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po