Wavemcu.com - 健波硬件工作室

匿名投稿 投稿指南 RSS订阅 站长资讯通告:     2008年8月16日:新站点正在测试当中,如发现问题,请E-mail给站长!  [EasyWave  2008年8月16日]        
搜索: 您现在的位置: 健波硬件工作室 >> 编程器家园 >> 国内编程器 >> 正文

MCS51单片机开发工具DIY

2008-06-10 13:50:46 来源:网络收集 作者:刘楚浩 点击:

核心提示:目前介绍单片机应用的文章很多,但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程,所以单片机爱好者(尤其是初学者)往往更希望看到单片机开发工具制作方面的文章。本文正是因此而作,旨在帮那些DIY爱好者开发制作出适合自己的开发工具。

摘要:本文详细介绍了利用AT89S8252单片机的在系统编程功能,用Visual Basic6.0(以下简称VB)在Windows环境下开发制作一款MCS51单片开发工具的方法。内容涉及VB编程、PC机并口控制及单片机在系统编程等内容。
 
关键词:VB编程   AT89S8252   在系统编程   DIY
 
目前介绍单片机应用的文章很多,但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程,所以单片机爱好者(尤其是初学者)往往更希望看到单片机开发工具制作方面的文章。本文正是因此而作,旨在帮那些DIY爱好者开发制作出适合自己的开发工具。
一、当前常用开发模式介绍
目前基本上有两种开发模式:
1,用仿真器
         优点:方便,可以设置断点,可以观察存贮器及寄存器的内容,缺点:价格昂贵,且仿真器终究不是单片机,有时代码在仿真器上能通过,但在单片机中不能正常工作,反而增加了调试的难度。
2,用编程器 
        优点:价格相对便宜,通常一款编程器可编多种器件。缺点:操作相当不便,每次要将芯片在目标板与编程器之间转移,并且还要在编译操作界面与编程器操作界面之间切换,大部份时间在做简单的重复的工作。
 
二、一种新的开发模式介绍及芯片选择
       本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式)。由于利用了芯片的在系统编程功能,因此不需要移动芯片,在软件设计时设计成一旦代码文件被重新编过即自动下载到芯片并自动复位运行,真正的“所编即所得”。
       目前很多单片机都支持在系统编程,MCS51系列单片机支持在系统编程的也很多,但大多数是支持通过PC机的串口对单片机进行编程。这样有三个不方便的地方:一是如果项目本身要与PC机串行通讯就不方便;二是要增加一片MAX232电平转换芯片;三是有的芯片要按特定的步骤进入下载模式,编程过程需要手工干预。
经过比较,Atmel公司生产的AT89S8252是一种比较理想的芯片,适合我们用来制作开发工具。此芯片有如下特点:
        与MCS51兼容
        内含8K可擦写1000次的程序存贮器,2K可擦写超过100000次的数据存贮器及256字节8位宽内部RAM
        可通过SPI接口在系统串行编程,与MCS51兼容
        串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间
        低电压下载,无需12V编程电压
 
三、AT89S8252串行编程介绍
 
1、  AT89S8252串行编程模式介绍
当芯片的RST引脚置高电平时,所有程序和数据存贮器可以通过SPI总线接口[SCK,MOSI(input),MISO(output)]编程。RST变高以后,在编程或擦除操作之前必须首先发送一条编程允许命令。在串行编程模式下,芯片会在字节编程之前自动插入一个擦除周期。因此,除非芯片的代码保护位被编程,编程之前不需要执行全片擦除命令。SPI接口之SCK时钟频率须低于晶振频率的1/40。
 
2、  AT89S8252串行编程步骤
a)         在XTAL1与XTAL2之间连接一个3-24MHz的晶振,在VCC与GND之前加上电源电压,将RST置高,等待10ms。
b)        发送串行编程允许命令
c)        发送写/读/擦除等命令及数据,串行数据高位在前,低位在后,数据在时钟的上升沿锁定
d)        如果上一步是写命令等待至少2.5ms
e)         需要时重复C,D两步
f)         将RST置低,芯片开始运行
 
3、  AT89S8252串行编程命令介绍
命令
输入格式
功能说明
Byte1
Byte2
Byte3
编程允许
1010 1100
0101 0011
xxxx xxxx
在RST变高后允许串行编程
全片擦除
1010 1100
xxxx x100
xxxx xxxx
程序和数据存贮器全部擦除
读程序存贮器
aaaa a001
地址低8位
xxxx xxxx
读程序存贮器,a为高5位地址
写程序存贮器
aaaa a010
地址低8位
8位数据
写程序存贮器,a为高5位地址
读数据存贮器
00aa a101
地址低8位
xxxx xxxx
读数据存贮器,a为高3位地址
写数据存贮器
00aa a110
地址低8位
8位数据
写数据存贮器,a为高3位地址
写锁定位
1010 1100
123x x111
xxxx xxxx
写锁定位,123分别为LB1,2,3,将相应位置0则锁定该位
 
4:AT89S8951串行编程时序图
四、硬件设计:
a)         通过计算机并口与单片机SPI口连接
b)        为了保护计算机并口,增加一片74HC244作为隔离

实用的原理图如下<已经过实践检验,放心使用>:

 
五、用VB编程进行并口控制介绍
  打印端口的基地址一般为0x278,0x378或0x3BC,这可以从控制面板中查到。为了方便读者,下面以表格形式列出常用打印端口脚位及寄存器位元说明。
硬件脚位
地址及位元
说明
本例中作用
2
基地址第0位
数据位0
MOSI
3
基地址第1位
数据位1
未用
4
基地址第2位
数据位2
5
基地址第3位
数据位3
SCK
6
基地址第4位
数据位4
 
7
基地址第5位
数据位5
MOSI
8
基地址第6位
数据位6
未用
9
基地址第7位
数据位7
RST
10
基地址+1 第6位
0=认可信号
MISO
11
基地址+1 第7位
0=忙碌
未用
12
基地址+1 第5位
1=纸张用完
未用
18-25
 
 
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模块即可。本例中用到的函数有四个,分别说明如下:
1、           Initialize():允许端口控制函数,在使用端口输入输出函数之前调用一次,成功返回“1”,失败返回“0”,
2、           Shutdown():关闭端口控制函数,在退出程序时执行一次,成功返回“1”,失败返回“0”,
3、           GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean:读取端口函数,PortAddr 为端口地址, Portval为端口值,bSize为要读取的字节数,读取成功返回“1”,失败返回“0”,
4、           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
 
六、Inter HEX 格式文件介绍
       由于一般的编译软件产生的用于写入芯片的文件都是Inter HEX格式的文件,Inter HEX文件属于文本文件,可以用记事本查看,一个Inter HEX文件的一行称为一个记录,每个记录都是由16进制字符组成的,两个字符表示一个字节的值,Inter HEX文件通常由若干条记录组成,每个记录都具有如下的形式:
       :LLAAAATTDD…DDCC
       “:”-是记录的起始标志
       LL -记录长度,表示该记录中的数据字节数
       AAAA-数据装入的首地址(16位)
TT-记录类型,00表示数据记录,01表示文件结束,(注意:有的编译软件会产生大于01的记录类型,本应用中对大于01记录类型的记录忽略掉即可)
       DD-数据值(字节)
       CC-校验和(将其本身与记录中除起始标志外的所有字节相加应为0,不为0则有错)
 
七、VB编程详细说明(由于各子程序的流程都较简单,所以直接给出源码而并未画出流程图,程序采用由底至顶的设计方法):
1,  为了使用方便,我们分别写一个方便易记的输入函数及输出子程序,并且由于在很多情况下都要用到延时指令,所以我们也要写一个延时子程序(延时子程序调用WinAPI,有关方面的内容请读者参阅MSDN,此处不进行详细介绍)。
首先在“我的文档”内新建一个名为MCS51的文件夹,将Winio.sys、Winio.dll、Winio.vxd及Winio.bas拷贝到MCS51文件夹。启动VB6,新建一标准EXE工程。
将工程保存在MCS51文件夹中,文件名为MCS51.vbp。在“工程”菜单中单击“添加模块”将Winio.bas添加到MCS51工程中。把模块中与本例无关的函数声明删除,增添延时子程序及输入输出处理代码。完成后的Winio.bas代码如下:
Option Explicit
Dim Result As Boolean
Dim Portval As Long
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
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Public Declare Function GetTickCount Lib "kernel32" () As Long
'延时 TT ms 子程序
Sub TimeDelay(TT As Long)
  Dim t As Long
  t = GetTickCount()
  Do
    DoEvents
    If GetTickCount - t < 0 Then t = GetTickCount
  Loop Until GetTickCount - t >= TT
End Sub
'将DataOut 输出到地址为Address的端口子程序
Public Sub DIO_OutputByte(ByVal Address As Integer, ByVal DataOut As Integer)
    Portval = DataOut
    Result = SetPortVal(Address, Portval, 1)
End Sub
'返回地址为Address 的端口的值
Public Function DIO_InputByte(ByVal Address As Integer) As Integer
  Result = GetPortVal(Address, Portval, 1)
  DIO_InputByte = Portval
End Function
具体的界面见下图:

具体的代码以及原理图本站软件下载频道有下载,读者可以自己尝试自己增加功能和编写代码!
Tags: 编程器  
责任编辑:EasyWave
  • 调用插件
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】   
    姓 名: * Oicq:
    评 分: 1分 2分 3分 4分 5分
    评论内容:
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用健波硬件工作室服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  • 关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 帮助