老生常谈的话题又来了。我觉得我看过很多关于单片机开发的各种经验,但不一定适合你。读一百遍书意味着看自己,我们在追求知识的道路上永无止境。
做AT89C5X(51、52、55等。)时间最长,可能知道的比较多,主要讲实际应用中的经验教训。这本书可以参考北航的一本专题书AT89系列,还不错,建议大家买。AT89C我认为这是一台非常标准的51单片机,4个P口,1个串口,RAM只有标准的128Byte,Flash也只有4K,功能齐全,我就以它为基础,所以开发过程中遇到的问题。复位源问题最常用的复位方法是电阻加电容,AT89C51是高电平复位,不稳定,可用于产品调试,因为我们通常使用模拟器,许多模拟器会输出复位信号,屏蔽目标板产生的复位信号,所以调试复位信号没有问题,我公司使用长沙菊阳模拟器,技术先进,仿真AT89系列芯片没有问题,但也很稳定。
这里有一个非常重要的问题要说,你有时会遇到这样一个问题:你的程序在模拟中没有问题,但在录音后没有。结合我的经验有两个原因。首先,顺序可能会改变。众所周知,我不多说。另一个原因是复位信号。具体情况如下:
(1)复位电路存在问题,无法正常生成复位信号。因为模拟器可能会在调试过程中为您提供复位信号,而离开模拟器后就没有了;
(2)看门狗的问题。一些51芯片具有看门狗复位功能,如At89c55WD,当程序打开看门狗时,有时程序初始化内容太多,经常产生复位信号,特别是使用C语言编程功能,有时虽然你显然在程序开始时关闭看门狗,但程序仍然会复位,这是因为C语言执行效率低于汇编,似乎有几行代码,有时需要很长时间,因此,使用开门狗时一定要注意这个问题。这个问题在使用模拟器时很容易被忽略,因为即使你的程序中看门狗复位,模拟器(菊阳模拟器可以打开/屏蔽此功能)也经常屏蔽复位信号,因此程序仍将正常运行。当你在操作前烧毁程序时,你发现新调试的程序不能正常工作,因为你的程序不断复位,注意用示波器观察RST脚可能看不到复位信号,因为看门狗复位不影响RST脚的电平。芯片内部没有看门狗,但电路中有看门狗CPU对于监控芯片,它通常可以提供复位信号,复位信号有多种原因。如果发现上述情况,可以用示波器检查RST看看脚是否有电平变化。因此,建议在开发51产品时尽量使用CPU监控芯片,方向X5045就是非常好用的,因为它还带有Eprom在许多场合也可以使用功能MAX708等专用复位芯片稳定方便。
1.计算和选择与发光二极管串联的电阻(电阻排放)。发光二极管的正常发光电流为3~10mA,发光二极管上的压降为1.7V(轨管) R=(5-1.7)/3~10 (k) 2、单片机TTL高电平: 5V;低电平:0V。 RS232串口电平高电平-12V ;低电平: 12V。可以通过MAX232电平转换芯片,转换之间的电平。 3.单片机上电IO口腔寄存器为高电平,其余为低电平。 四、三极管开关功能:B、E间接正向电压,E、C是导通的。 5、蜂鸣器: 1) 有源蜂鸣器可以直接连续发出额定电压。 2)像电磁扬声器一样,无源蜂鸣器需要连接到音频输出电路才能发出声音。 3)有源蜂鸣器带振荡源,无源蜂鸣器带振荡源。 4)有源蜂鸣器的理想信号是直流电。
5)无源蜂鸣器的理想信号为方波信号。 方波发声函数:void beep() { fmq=0; delay 500us(); fmq=1; delay 500us(); } 6、计算单片机指令周期:
指令周期(us) = 12 / 晶振频率(Mhz)
选用12M的晶振,一个指令周期为1us 7、89C51的芯片最高支持24M的晶振
上面只是笔者粗陋的小见解,笔者和大家都会感觉到不是很过瘾,它山之石可以攻玉,我们还需向更多的前辈学习,笔者经过整理前人的经验总结,看到了很多值得很大家一起分享的一些开发经验!目前介绍单片机应用的文章很多,但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程,如果采用传统的开发模式,则要购买价格昂贵的仿真器、编程器等开发工具来作实验。其实由于芯片功能的日益完善,我们可以利用芯片的在系统编程(ISP)功能制作出实用而低价的开发工具。下面就帮助DIY爱好者开发制作出适合自己的开发工具。
目前,基本上有两种开发模式可供选择:用仿真器、用编程器。 ① 用仿真器。方便,可以设置断点,可以观察存储器及寄存器的内容。价格昂贵,不同类型的单片机要购买不同的仿真器;仿真器终究不是单片机,有时代码在仿真器上能通过,但在单片机中不能正常工作,反而增加了调试的难度。 ② 用编程器。价格相对便宜,通常一款编程器可编程多种器件。操作相当不便,每次要将芯片在目标板与编程器之间转移,并且还要在编译操作界面与编程器操作界面之间切换,大部分时间在做简单的重复工作。
本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式)。由于利用了芯片的在系统编程功能,因此不需要移动芯片。在软件设计时设计成:一旦代码文件被重新编过,即自动下载到芯片,并自动复位运行,是真正的“所编即所得”。目前很多单片机都支持在系统编程。8051系列单片机支持在系统编程的也很多,但大多数是支持通过PC机的串口对单片机进行编程。这样有四个不方便的地方:一是项目本身与PC机串行通信不方便;二是要增加1片MAX232电平转换芯片;三是有的芯片要按特定的步骤进入下载模式,编程过程需要手工干预;四是有的芯片需要固件(定制的程序)的支持,如果不小心损坏了固件,则芯片的在系统编程功能也没有了。经过比较,Atmel公司生产的AT89S8252是一种比较理想的芯片,适合制作开发工具。此芯片有如下特点: ◆ 与8051兼容; ◆ 内含8KB可擦写1000次的程序存储器,2KB可擦写超过100 000次的数据存储器及256字节8位宽内部RAM; ◆ 可通过SPI接口在系统串行编程,与8051兼容 ◆ 串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间; ◆ 低电压下载,无需12V编程电压。
(1) AT89S8252串行编程模式当芯片的RST引脚置高电平时,所有程序和数据存储器可以通过SPI总线接口[SCK,MOSI(input),MISO(output)]编程。RST变高以后,在编程或擦除操作之前必须首先发送一条编程允许命令。在串行编程模式下,芯片会在字节编程之前自动插入一个擦除周期。因此,除非芯片的代码保护位被编程,编程之前不需要执行全片擦除命令。SPI接口之SCK时钟频率须低于晶振频率的1/40。(2) AT89S8252串行编程步骤 ① 在XTAL1与XTAL2之间连接一个3~24MHz的晶振;在VCC与GND之前加上电源电压,将RST置高,等待10ms。 ② 发送串行编程允许命令。
③ 发送写/读/擦除等命令及数据,串行数据高位在前,低位在后,数据在时钟的上升沿锁定。 ④ 如果上一步是写命令,至少等待2.5ms。
⑤ 需要时重复③、④两步。
⑥ 将RST置低,芯片开始运行。
(3) AT89S8252串行编程命令,AT89S8252串行编程命令如表1所列。
表1
(4) AT89S8252串行编程时序图,AT89S8252串行编程时序如图1所示。 图1① 通过计算机并口与单片机SPI口连接; ② 为了保护计算机并口,需要增加1片74HC244作为隔离。 实用的原理图如图2所示。(已经过实践检验,可放心使用。) 图2打印端口的基地址一般为0x278、0x378或0x3BC,可以从控制面板中查到。为了方便读者,表2列出了常用打印端口引脚及寄存器位元的说明。 表2
在Windows环境下最简单易学的语言恐怕非VB莫属,所以我们的开发工具也选用VB作为编程语言。但由于Windows的保护,VB无法直接读写打印端口,因此我们需要另外的程序模块来实现打印端口的直接读写。在Internet网上可以找到许多此类模块,并且相当多的模块可以免费使用。
经过试用,笔者推荐使用Winio v2.0。该模块支持Win9X/NT/2000/XP(http://www.internals.com Yariv Kaplan ),并且带有详细的帮助、例子程序及源码。使用时,将Winio.sys、Winio.dll、Winio.vxd及Winio.bas四个文件拷贝到工作目录下,在VB中直接添加Winio.bas模块即可。本例中用到的函数有四个,分别说明如下。
① IniTIalize():允许端口控制函数。在使用端口输入输出函数之前调用一次,成功返回“1”,失败返回“0”。 ② Shutdown():关闭端口控制函数。在退出程序时执行一次,成功返回“1”,失败返回“0”。
③ GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean:读取端口函数,PortAddr 为端口地址, Portval为端口值,bSize为要读取的字节数。读取成功时返回“1”,失败时返回“0”。
④ SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean:写端口函数。PortAddr 为端口地址, Portval为要写的值,bSize为要写入的字节数。写入成功返回“1”,失败返回“0”。
四个函数在Winio.bas模块中的声明如下: Declare FuncTIon IniTIalizeWinIo Lib “WinIo.dll” () As Boolean Declare FuncTIon ShutdownWinIo Lib “WinIo.dll” () As Boolean Declare Function GetPortVal Lib “WinIo.dll” (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean Declare Function SetPortVal Lib “WinIo.dll” (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean
由于一般编译软件产生的用于写入芯片的文件都是Intel HEX格式的文件。Intel HEX文件属于文本文件,可以用记事本查看。一个Intel HEX文件的一行称为一个记录,每个记录都是由十六进制字符组成的,两个字符表示一个字节的值。Intel HEX文件通常由若干条记录组成,每个记录都具有如下的形式:
:LLAAAATTDD.。.DDCC “:”——记录的起始标志; LL——记录长度,表示该记录中的数据字节数; AAAA——数据装入的首地址(16位); TT——记录类型,00表示数据记录,01表示文件结束;(注意:有的编译软件会产生大于01的记录类型,本应用中对大于01记录类型的记录忽略掉即可。) DD——数据值(字节); CC——校验和。(将其本身与记录中除起始标志外的所有字节相加应为0,不为0则有错。)
虽然上述程序能实现各种基本的功能,但并不完善,并未考虑各种异常情况,读者可根据实际情况进行完善。
由于AT89S8252的价格还是较贵,所以现在市场上较难买,不过Atmel公司推出的替代AT89C51/52的AT89S51/52也有在系统编程功能,且价格便宜。其在系统编程的实现方法与AT89S8252类似,对本例部分程序稍作修改即可支持该器件。笔者制作的“MCS51/AVR/PIC三合一下载器”增加了对AT89S51/52的支持。
因为C语言执行效率比汇编低,看似几行代码,有时候要很长时间的,所以在使用开门狗时一定要注意这个问题。而这个问题在使用仿真器时容易被忽视,因为即使你的程序里看门狗复位了,但是仿真器(菊阳仿真器可以开启/屏蔽这个功能)往往会屏蔽了这个复位信号,所以程序仍然会正常运行的。
当你把程序烧好后再运行时,你却为发现刚调试好的程序却无法正常运行了,那是因为你的程序一直在不停复位了,注意用示波器观察RST脚可能看不到复位信号的,因为看门狗复位并不影响RST脚的电平。
再一种情况就是芯片内部不带看门狗,但是电路中有CPU监控芯片的,它往往是可以提供复位信号的,而且是多种原因的复位信号,如果你发现上述情况,就可以用示波器查看RST脚看是否有电平变化。
所以建议大家做51产品开发时尽量使用CPU监控芯片,向X5045就是非常好用的,因为它还带有Eprom功能,这在很多场合使用的到的,也可以用MAX708等专用复位芯片了,既稳定又方便。
1.在你正觉得STM32F3还缺点儿啥时,STM32G4来了!
2.戏说二十余国产操作系统之天理命数
3.在做5G项目的嵌入式工程师,请留意META-DX1!
4.LabVIEW这么“反人类”的东西,到底哪些人在用?月薪2万+的人,笑笑不说话...
5.鸿蒙将至,安卓安否?
6.5G基站为何建得比4G多?
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。