收藏 分享(赏)

MCS51单片机开发工具DIY.doc

上传人:HR专家 文档编号:7557536 上传时间:2019-05-21 格式:DOC 页数:14 大小:208KB
下载 相关 举报
MCS51单片机开发工具DIY.doc_第1页
第1页 / 共14页
MCS51单片机开发工具DIY.doc_第2页
第2页 / 共14页
MCS51单片机开发工具DIY.doc_第3页
第3页 / 共14页
MCS51单片机开发工具DIY.doc_第4页
第4页 / 共14页
MCS51单片机开发工具DIY.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐精品文档碱性玫瑰精 整理2011 年 10 月 2 号如需购买 碱性玫瑰精 ,请留下以下联系方式备用电话:0317-7896222 0317-7896333 传真:0317-7727900河北省东光宏浩染料 网址:联系人:刘雨桐本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐MCS51 单片机开发工具 DIY刘楚浩摘要:本文详细介绍了利用 AT89S8252

2、 单片机的在系统编程功能-;用 Visual Basic6.0(以下简称 VB)在 Windows 环境下开发制作一款 MCS51 单片开发工具的方法。内容涉及 VB 编程、PC 机并口控制及单片机在系统编程等内容。关键词:VB 编程 AT89S8252 在系统编程 DIY目前介绍单片机应用的文章很多-;但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程-;所以单片机爱好者(尤其是初学者)往往更希望看到单片机开发工具制作方面的文章。本文正是因此而作-;旨在帮那些 DIY 爱好者开发制作出适合自己的开发工具。一、当前常用开发模式介绍目前基本上有两种开发模式:1-;用仿真器 优

3、点:方便-;可以设置断点- ;可以观察存贮器及寄存器的内容缺点:价格昂贵-;且仿真器终究不是单片机 -;有时代码在仿真器上能通过-;但在单片机中不能正常工作 -;反而增加了调试的难度。2-;用编程器 优点:价格相对便宜-;通常一款编程器可编多种器件。缺点:操作相当不便-;每次要将芯片在目标板与编程器之间转移-;并且还要在编译操作界面与编程器操作界面之间切换- ;大部份时间在做简单的重复的工作。二、一种新的开发模式介绍及芯片选择本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式) 。由于利用了芯片的在系统编程功能-;因此不需要移动芯片 -;在软件设计时设计成一旦代码文件被重新编过即自动

4、下载到芯片并自动复位运行-;真正的“所编即所得” 。目前很多单片机都支持在系统编程-;MCS51 系列单片机支持在系统编程的也很多-;但大多数是支持通过 PC 机的串口对单片机进行编程。这样有三个不方便的地方:一是如果项目本身要与 PC 机串行通讯就不方便;二是要增加一片 MAX232 电平转换芯片;三是有的芯片要按特定的步骤进入下载模式-;编程过程需要手工干预。经过比较-;Atmel 公司生产的 AT89S8252 是一种比较理想的芯片-;适合我们用来制作开发工具。此芯片有如下特点: 与 MCS51 兼容 内含 8K 可擦写 1000 次的程序存贮器 -;2K 可擦写超过 100000 次的

5、数据存贮器及256 字节 8 位宽内部 RAM 可通过 SPI 接口在系统串行编程- ;与 MCS51 兼容 串行编程时有自动擦写周期-;在调试大程序时可以分段下载- ;节约时间 低电压下载-;无需 12V 编程电压本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐三、AT89S8252 串行编程介绍1、 AT89S8252 串行编程模式介绍当芯片的 RST 引脚置高电平时-;所有程序和数据存贮器可以通过 SPI 总线接口SCK- ;MOSI (input)-;MISO (output) 编程。RST

6、 变高以后-;在编程或擦除操作之前必须首先发送一条编程允许命令。在串行编程模式下-;芯片会在字节编程之前自动插入一个擦除周期。因此-;除非芯片的代码保护位被编程- ;编程之前不需要执行全片擦除命令。SPI 接口之 SCK 时钟频率须低于晶振频率的1/40。2、 AT89S8252 串行编程步骤a) 在 XTAL1 与 XTAL2 之间连接一个 3-24MHz 的晶振- ;在 VCC 与 GND 之前加上电源电压-;将 RST 置高- ;等待 10ms。b) 发送串行编程允许命令c) 发送写/读/擦除等命令及数据-;串行数据高位在前- ;低位在后-;数据在时钟的上升沿锁定d) 如果上一步是写命令

7、等待至少 2.5mse) 需要时重复 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 位地址读数据存贮器

8、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、 AT89S8252 串行编程时序图四、硬件设计:串行时钟输入SCK/P1.7SS串行数据输入MOSI/P1.5SS串行数据输出MISO/P1.6SSMSBMSB LSBLSB本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买

9、 染料 及包装机械 请致电:0317-7723188 刘雨桐a) 通过计算机并口与单片机 SPI 口连接b) 为了保护计算机并口-;增加一片 74HC244 作为隔离实用的原理图如下:(原理图文件为 mcu51diy.sch)五、用 VB 编程进行并口控制介绍打印端口的基地址一般为 0x278-;0x378 或 0x3BC-;这可以从控制面板中查到。为了方便读者-;下面以表格形式列出常用打印端口脚位及寄存器位元说明。在Windows 环境下最简单易学的语言恐怕非 VB 莫属- ;所以我们的开发工具也选用 VB 作为编程语言。但由于 Windows 的保护- ;VB 无法直接读写打印端口 -;因

10、此我们需要另外的程序模块来实现打印端口的的直接读写。在 Internet 网上可以找到许多的此类模块- ;并且相当多的模块可以免费使用。经过试用-;笔者推荐使用 Winio v2.0-;该模块支持Win9X/NT/2000/XP(http:/Yariv Kaplan)- ;并且带有详细的帮助、例子程序及源码。使用时将 Winio.sys、Winio.dll、Winio.vxd 及 Winio.bas 四个文件拷贝到工硬件脚位 地址及位元 说明 本例中作用2 基地址第 0 位 数据位 0 未用3 基地址第 1 位 数据位 1 未用4 基地址第 2 位 数据位 2 RST、MISO 控制位5 基地

11、址第 3 位 数据位 3 SCK、MOSI 控制位6 基地址第 4 位 数据位 4 SCK7 基地址第 5 位 数据位 5 MOSI8 基地址第 6 位 数据位 6 未用9 基地址第 7 位 数据位 7 RST10 基地址+1 第 6 位 0=认可信号 MISO11 基地址+1 第 7 位 0=忙碌 未用12 基地址+1 第 5 位 1=纸张用完 未用18-25 地 地本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐作目录下-;在 VB 中直接添加 Winio.bas 模块即可。本例中用到的函数有四

12、个-;分别说明如下: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”- ;失败返回

13、“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 BooleanDeclare Function ShutdownWinIo Lib

14、 “WinIo.dll“ () As BooleanDeclare Function GetPortVal Lib “WinIo.dll“ (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As BooleanDeclare Function SetPortVal Lib “WinIo.dll“ (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean六、Inter HEX 格式文件介绍由于一般

15、的编译软件产生的用于写入芯片的文件都是 Inter HEX 格式的文件-;Inter HEX 文件属于文本文件-;可以用记事本查看 -;一个 Inter HEX 文件的一行称为一个记录- ;每个记录都是由 16 进制字符组成的-;两个字符表示一个字节的值- ;Inter HEX 文件通常由若干条记录组成-;每个记录都具有如下的形式:LLAAAATTDDDDCC“:”-是记录的起始标志LL -记录长度-;表示该记录中的数据字节数AAAA-数据装入的首地址(16 位)TT-记录类型 -;00 表示数据记录-;01 表示文件结束- ;(注意:有的编译软件会产生大于 01 的记录类型-;本应用中对大于

16、 01 记录类型的记录忽略掉即可)DD-数据值(字节)CC-校验和(将其本身与记录中除起始标志外的所有字节相加应为 0-;不为 0 则有错)七、VB 编程详细说明(由于各子程序的流程都较简单-;所以直接给出源码而并未画出流程图-;程序采用由底至顶的设计方法):1, 为了使用方便-;我们分别写一个方便易记的输入函数及输出子程序- ;并且由于在很多情况下都要用到延时指令-;所以我们也要写一个延时子程序(延时子程序调用 WinAPI,有关方面的内容请读者参阅 MSDN-;此处不进行详细介绍) 。首先在“我的文档”内新建一个名为 MCS51 的文件夹-;将Winio.sys、Winio.dll、Win

17、io.vxd 及 Winio.bas 拷贝到 MCS51 文件夹。启动 VB6-;新建一标准 EXE 工程。本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐将工程保存在 MCS51 文件夹中-;文件名为 MCS51.vbp。在 “工程”菜单中单击“添加模块”将 Winio.bas 添加到 MCS51 工程中。把模块中与本例无关的函数声明删除-;增添延时子程序及输入输出处理代码。完成后的 Winio.bas 代码如下:Option ExplicitDim Result As BooleanDim Po

18、rtval As LongDeclare Function GetPortVal Lib “WinIo.dll“ (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As BooleanDeclare Function SetPortVal Lib “WinIo.dll“ (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As BooleanDeclare Function InitializeWinIo Li

19、b “WinIo.dll“ () As BooleanDeclare Function ShutdownWinIo Lib “WinIo.dll“ () As BooleanPublic Declare Function GetTickCount Lib “kernel32“ () As Long延时 TT ms 子程序Sub TimeDelay(TT As Long)Dim t As Longt = GetTickCount()DoDoEventsIf GetTickCount - t = TTEnd Sub将 DataOut 输出到地址为 Address 的端口子程序Public Sub

20、DIO_OutputByte(ByVal Address As Integer, ByVal DataOut As Integer)Portval = DataOutResult = SetPortVal(Address, Portval, 1)End Sub返回地址为 Address 的端口的值Public Function DIO_InputByte(ByVal Address As Integer) As IntegerResult = GetPortVal(Address, Portval, 1)DIO_InputByte = PortvalEnd Function2, 在窗体上放置控

21、件并设置控件的相关属性如下图及表所示:本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐3, 首先编定程序起动及退出的相关代码-;起动时将 Timer1 关闭- ;在 Text1 及 Text2中显示相关提示信息-;并加入允许端口操作命令 -;退出时发出关闭端口操作命令。双击窗体空白处-;在出现的代码窗中输入如下代码:Private Sub Form_Load()If InitializeWinIo = False ThenMsgBox “错误-;无法开启端口!“EndEnd IfTimer1.Ena

22、bled = FalseText1.Text = “*.HEX“Text2.Text = “请选择目标文件! “名称 Caption 说明或其它WriteS 写保密位LB1 LB1 第一位保密位LB2 LB2 第二位保密位LB3 LB3 第三位保密位OpenFile 打开文件 打开 HEX 文件Prog 下载代码Veri 校验代码Eras 全片擦除Exit 退出Text1 此框用于保存文件名Text2 此框用于显示相关信息Timer1 Interval=500 用于定时检测文件是否更新CommonDialog1 公用对话框控件(需从部件菜单项添加 comdlg32.ocx 控件)本文档由 碱性

23、玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐BeepEnd Sub双击“退出“按钮-;在出现的代码窗中输入如下代码:Private Sub Exit_Click()Call ShutdownWinIoEndEnd Sub另外-;为了使用方便-;在代码窗的“通用”区定义打印端口基地址常数及定义一个存贮文件更新时间的变量;由于每个人的计算机配置不一样-;对于快速的计算机可能需要延时同步-;所以设置一个 Delay 延时常数。具体代码如下:Const ptraddress = &H378 此数值应根据机器的实际值填

24、写Const Delay = 2当你的机器太快时加大此数值Dim file_date 用于存贮文件更新时间4, 接下来我们要创建一个最基本的子程序-;即字节输出子程序:形式:outbyte(data As Integer)功能:将一字节数据写入指定的单片机程序存贮器地址中-;高位在前入口:字节数据 dataPrivate Sub outbyte(data As Integer) 输出字节Dim Delay As IntegerDim i As IntegerFor con = 7 To 0 Step -1DIO_OutputByte ptraddress, 2 7 输出时钟低电平-;RST 高

25、For i = 1 To Delay 延时Next iIf (data And 2 con) = 2 con Then 如果数据位为 1 则输出 1DIO_OutputByte ptraddress, (2 7 + 2 5)For i = 1 To DelayNext iDIO_OutputByte ptraddress, (2 7 + 2 5 + 2 4) 输出时钟高电平For i = 1 To DelayNext iDIO_OutputByte ptraddress, (2 7 + 2 5) 输出时钟低电平ElseDIO_OutputByte ptraddress, 2 7 如果数据位为

26、0 则输出 0For i = 1 To DelayNext iDIO_OutputByte ptraddress, (2 7 + 2 4) 输出时钟高电平For i = 1 To DelayNext iDIO_OutputByte ptraddress, 2 7 输出时钟低电平End IfFor i = 1 To DelayNext iNext con本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐End Sub5, 根据字节输出子程序构建程序存贮器字节写入子程序形式:w_c_b(codeaddre

27、ss As Integer, codedata As Integer)功能:将数据 codedata 写入单片机程序存贮器 codeaddress 地址入口:codeaddress-程序存贮器地址codedata-数据Private Sub w_c_b(codeaddress As Integer, codedata As Integer) 写代码字节outbyte (codeaddress And &HFF00) / (2 8) * 8) And &HF8 Or 2 Or (codeaddress And &H2000) / (2 11) 合并命令与高地址字节outbyte (codeadd

28、ress And &HFF)outbyte codedataEnd Sub6, 构建读单片机程序存贮器数据函数形式:r_c(codeaddress As Integer) As Integer功能:返回单片机存器贮器地址 codeaddress 处的数据入口:codeaddress-程序存贮器地址出口:r_c 返回值Private Function r_c(codeaddress As Integer) As Integer 读代码字节Dim i As IntegerDim con1 As IntegerDim X As IntegerX = 0outbyte (codeaddress And

29、 &HFF00) / (2 8) * 8) And &HF8 Or 1 Or (codeaddress And &H2000) / (2 11) 合并命令与高地址字节outbyte (codeaddress And &HFF)For con1 = 7 To 0 Step -1DIO_OutputByte ptraddress, 2 7 输出时钟低电平-;RST 高For i = 1 To DelayNext iDIO_OutputByte ptraddress, (2 7 + 2 4) 输出时钟高电平- ;RST 高For i = 1 To DelayNext iIf (DIO_InputBy

30、te(ptraddress + 1) And &H40 Then 采集数据X = X + 2 con1End IfFor i = 1 To DelayNext iDIO_OutputByte ptraddress, 2 7 输出时钟低电平Next con1r_c = XEnd Function7, 双击“打开文件”按钮-;键入下述代码(获取目标文件的路径及文件名并保存到Text1 文本框中) 。本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐Private Sub OpenFile_Click()

31、打开文件按钮On Error GoTo errhandlerCommonDialog1.Filter = “*.HEX|*.hex“CommonDialog1.FilterIndex = 2CommonDialog1.ShowOpenIf CommonDialog1.FileName “:“ ThenText2.Text = “非 Inter 格式 Hex 文件-;请重新择!”GoTo errEnd IfDim i As IntegerDim o As Integero = 0本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:031

32、7-7723188 刘雨桐For i = 2 To Val(“&h“ + Mid$(inbuf, 2, 2) + 5) * 2 Step 2 检查文件o = (o + Val(“&h“ + Mid$(inbuf, i, 2) And &HFFNext iIf o 1 ThenGoTo NEXT_LOOPEnd If-If Val(“&h“ + Mid$(inbuf, 2, 2) “:“ ThenText2.Text = “非 Inter 格式 Hex 文件-;请重新选择!“GoTo errEnd If-If Val(“&h“ + Mid$(inbuf, 8, 2) 1 ThenGoTo NEX

33、T_LOOPEnd If-Dim i As IntegerDim o As IntegerIf Val(“&h“ + Mid$(inbuf, 2, 2) Val(“&h“ + Mid$(inbuf, i, 2) Thenoo = oo + 1End Ifo = o + 1ii = ii + 1Text2.Text = Str$(ii) + “ Bytes“DoEventsNext iEnd IfNEXT_LOOP:LoopIf oo = 0 ThenText2.Text = “文件检验通过 “ElseText2.Text = “文件检验共发现 “ + Str$(oo) + “字节错误!“End

34、 Iferr:DIO_OutputByte ptraddress, 2 3Close FileNumberBeepEnd Sub11, 编写写保密位子程序-;双击“写保密位”按钮-;在代码窗中键入如下代码:Private Sub WriteS_Click()Dim temp As IntegerStartProgoutbyte &HACtemp = &HFFIf LB1.Value = 1 Thentemp = temp And &H7F本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐End IfI

35、f LB2.Value = 1 Thentemp = temp And &HBFEnd IfIf LB3.Value = 1 Thentemp = temp And &HDFEnd Ifoutbyte tempoutbyte tempText2.Text = “OK!“TimeDelay (20)DIO_OutputByte ptraddress, 2 3End Sub12, 文件更新后自动下载功能处理代码如下:Private Sub check1_click() 文件更新后自动重下载If Check1.Value = 1 ThenTimer1.Enabled = TrueIf Text1.T

36、ext “ Thenfile_data = FileDateTime(Text1)End IfElseTimer1.Enabled = FalseEnd IfEnd SubPrivate Sub Timer1_Timer() 文件是否更新检查Timer1.Enabled = FalseOn err GoTo err1If Text1.Text “ ThenIf file_date FileDateTime(Text1) ThenProg_Clickfile_date = FileDateTime(Text1)End IfEnd Iferr1:Timer1.Enabled = TrueEnd S

37、ub至此-;全部程序编写完成-;程序能实现基本的下载、校验、写保密位及文件更新后自动重写功能。八、结束语虽然上述程序能实现各种基本的功能-;但并不完善-;并未考虑各种异常情况-;读者可根据实际情况进行完善。编程功力较差的朋友可直接到笔者的网站(http:/)下载相对较完善的程序。如果充分理解了上述程序 -;那么 DIY一个 AVR 及 PIC 单片机的开发工具也非难事。其实-;在笔者的网站有 “MCS51/AVR/PIC本文档由 碱性玫瑰精 整理提供 代专利下载 1 元/篇 QQ 1410007848买 染料 及包装机械 请致电:0317-7723188 刘雨桐三合一下载器”供爱好者下载-;之所以单独叙述 MCS51 开发工具-;仅仅是为了叙述简单及容易理解。参考资料:AT89S8252 数据手册 http:/利用 Visual Basic 实现串并行通信技术 范逸之、陈立元、孙德萱、程正孚编著清华大学出版社 2001 年Visual Basic6.0 入门与提高 张树兵、戴红、陈哲、编著清华大学出版社 2001 年联系人:刘楚浩Email: rand_联系电话:0755-83281915 82490993 深圳市华强北路宏大电子通讯市场 4A52 柜台

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报