ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:93.15KB ,
资源ID:11568631      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11568631.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(at89s8252isp1.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

at89s8252isp1.docx

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

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

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

4、过SPI接口在系统串行编程,与MCS51兼容 串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间 低电压下载,无需12V编程电压三、AT89S8252串行编程介绍1、 AT89S8252串行编程模式介绍当芯片的RST引脚置高电平时,所有程序和数据存贮器可以通过SPI总线接口SCK,MOSI(input),MISO(output)编程。RST变高以后,在编程或擦除操作之前必须首先发送一条编程允许命令。在串行编程模式下,芯片会在字节编程之前自动插入一个擦除周期。因此,除非芯片的代码保护位被编程,编程之前不需要执行全片擦除命令。SPI接口之SCK时钟频率须低于晶振频率的1/40。2、 A

5、T89S8252串行编程步骤a) 在XTAL1与XTAL2之间连接一个3-24MHz的晶振,在VCC与GND之前加上电源电压,将RST置高,等待10ms。b) 发送串行编程允许命令c) 发送写/读/擦除等命令及数据,串行数据高位在前,低位在后,数据在时钟的上升沿锁定d) 如果上一步是写命令等待至少2.5mse) 需要时重复C,D两步f) 将RST置低,芯片开始运行3、 AT89S8252串行编程命令介绍命令输入格式功能说明Byte1Byte2Byte3编程允许1010 11000101 0011xxxx xxxx在RST变高后允许串行编程全片擦除1010 1100xxxx x100xxxx x

6、xxx程序和数据存贮器全部擦除读程序存贮器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 1100123x x111xxxx xxxx写锁定位,123分别为LB1,2,3,将相应位置0则锁定该位4、 AT89S8252串行编程时序图四、硬件设计:a) 通过计算机并口与单片机SPI口连接b) 为了保护计算机并口,增加一

7、片74HC244作为隔离实用的原理图如下:(原理图文件为mcu51diy.sch)五、用VB编程进行并口控制介绍 打印端口的基地址一般为0x278,0x378或0x3BC,这可以从控制面板中查到。为了方便读者,下面以表格形式列出常用打印端口脚位及寄存器位元说明。硬件脚位地址及位元说明本例中作用2基地址第0位数据位0未用3基地址第1位数据位1未用4基地址第2位数据位2RST、MISO控制位5基地址第3位数据位3SCK、MOSI控制位6基地址第4位数据位4SCK7基地址第5位数据位5MOSI8基地址第6位数据位6未用9基地址第7位数据位7RST10基地址+1 第6位0=认可信号MISO11基地址+

8、1 第7位0=忙碌未用12基地址+1 第5位1=纸张用完未用18-25地地在Windows环境下最简单易学的语言恐怕非VB莫属,所以我们的开发工具也选用VB作为编程语言。但由于Windows的保护,VB无法直接读写打印端口,因此我们需要另外的程序模块来实现打印端口的的直接读写。在Internet网上可以找到许多的此类模块,并且相当多的模块可以免费使用。经过试用,笔者推荐使用Winio v2.0,该模块支持Win9X/NT/2000/XP( Yariv Kaplan ),并且带有详细的帮助、例子程序及源码。使用时将Winio.sys、Winio.dll、Winio.vxd及Winio.bas四个

9、文件拷贝到工作目录下,在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为要读

10、取的字节数,读取成功返回“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 BooleanDeclare Function ShutdownWinIo

11、 Lib 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 格式文件介绍 由于一般的

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

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

14、。将工程保存在MCS51文件夹中,文件名为MCS51.vbp。在“工程”菜单中单击“添加模块”将Winio.bas添加到MCS51工程中。把模块中与本例无关的函数声明删除,增添延时子程序及输入输出处理代码。完成后的Winio.bas代码如下:Option ExplicitDim Result As BooleanDim Portval As LongDeclare Function GetPortVal Lib WinIo.dll (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean

15、Declare Function SetPortVal Lib WinIo.dll (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As BooleanDeclare Function InitializeWinIo Lib WinIo.dll () As BooleanDeclare Function ShutdownWinIo Lib WinIo.dll () As BooleanPublic Declare Function GetTickCount Lib kernel32 () As Lo

16、ng延时 TT ms 子程序Sub TimeDelay(TT As Long) Dim t As Long t = GetTickCount() Do DoEvents If GetTickCount - t = TTEnd 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

17、的端口的值Public Function DIO_InputByte(ByVal Address As Integer) As Integer Result = GetPortVal(Address, Portval, 1) DIO_InputByte = PortvalEnd Function2, 在窗体上放置控件并设置控件的相关属性如下图及表所示:名称Caption说明或其它WriteS写保密位LB1LB1第一位保密位LB2LB2第二位保密位LB3LB3第三位保密位OpenFile打开文件打开HEX文件Prog下载代码Veri校验代码Eras全片擦除Exit退出Text1此框用于保存文件名

18、Text2此框用于显示相关信息Timer1Interval=500用于定时检测文件是否更新CommonDialog1公用对话框控件(需从部件菜单项添加comdlg32.ocx控件)3, 首先编定程序起动及退出的相关代码,起动时将Timer1关闭,在Text1及Text2中显示相关提示信息,并加入允许端口操作命令,退出时发出关闭端口操作命令。双击窗体空白处,在出现的代码窗中输入如下代码:Private Sub Form_Load() If InitializeWinIo = False Then MsgBox 错误,无法开启端口! End End If Timer1.Enabled = Fals

19、e Text1.Text = *.HEX Text2.Text = 请选择目标文件! BeepEnd Sub 双击“退出“按钮,在出现的代码窗中输入如下代码: Private Sub Exit_Click() Call ShutdownWinIo EndEnd Sub另外,为了使用方便,在代码窗的“通用”区定义打印端口基地址常数及定义一个存贮文件更新时间的变量;由于每个人的计算机配置不一样,对于快速的计算机可能需要延时同步,所以设置一个Delay延时常数。具体代码如下: Const ptraddress = &H378 此数值应根据机器的实际值填写 Const Delay = 2当你的机器太快

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

21、ext i If (data And 2 con) = 2 con Then 如果数据位为1则输出1 DIO_OutputByte ptraddress, (2 7 + 2 5) For i = 1 To Delay Next i DIO_OutputByte ptraddress, (2 7 + 2 5 + 2 4) 输出时钟高电平 For i = 1 To Delay Next i DIO_OutputByte ptraddress, (2 7 + 2 5) 输出时钟低电平 Else DIO_OutputByte ptraddress, 2 7 如果数据位为0则输出0 For i = 1

22、To Delay Next i DIO_OutputByte ptraddress, (2 7 + 2 4) 输出时钟高电平 For i = 1 To Delay Next i DIO_OutputByte ptraddress, 2 7 输出时钟低电平 End If For i = 1 To Delay Next i Next con End Sub5, 根据字节输出子程序构建程序存贮器字节写入子程序形式:w_c_b(codeaddress As Integer, codedata As Integer)功能:将数据codedata写入单片机程序存贮器codeaddress地址入口:code

23、address-程序存贮器地址 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 (codeaddress And &HFF) outbyte codedataEnd Sub6, 构建读单片机程序存贮器数据函数形式:r_c(codeaddress As In

24、teger) As Integer功能:返回单片机存器贮器地址codeaddress处的数据入口:codeaddress-程序存贮器地址出口:r_c返回值Private Function r_c(codeaddress As Integer) As Integer 读代码字节 Dim i As Integer Dim con1 As Integer Dim X As Integer X = 0 outbyte (codeaddress And &HFF00) / (2 8) * 8) And &HF8 Or 1 Or (codeaddress And &H2000) / (2 11) 合并命令

25、与高地址字节 outbyte (codeaddress And &HFF) For con1 = 7 To 0 Step -1 DIO_OutputByte ptraddress, 2 7 输出时钟低电平,RST高 For i = 1 To Delay Next i DIO_OutputByte ptraddress, (2 7 + 2 4) 输出时钟高电平,RST高 For i = 1 To Delay Next i If (DIO_InputByte(ptraddress + 1) And &H40 Then 采集数据 X = X + 2 con1 End If For i = 1 To

26、Delay Next i DIO_OutputByte ptraddress, 2 7 输出时钟低电平 Next con1 r_c = XEnd Function7, 双击“打开文件”按钮,键入下述代码(获取目标文件的路径及文件名并保存到Text1文本框中)。 Private Sub OpenFile_Click() 打开文件按钮 On Error GoTo errhandler CommonDialog1.Filter = *.HEX|*.hex CommonDialog1.FilterIndex = 2 CommonDialog1.ShowOpen If CommonDialog1.Fil

27、eName Then Text1.Text = CommonDialog1.FileName End Iferrhandler: End Sub8, 由于在进行任何操作之前都要发送允许编程命令 ,因此构建一个允许编程子程序。功能:打开74HC244并发出允许编程命令,使芯片进入编程状态 Private Sub StartProg() 发送串行编程命令 DIO_OutputByte ptraddress, 0 打开74hc244,点亮编程指示灯 TimeDelay (20) DIO_OutputByte ptraddress, 2 7 设置RST为高 TimeDelay (20) outbyte

28、 &HAC outbyte &H53 outbyte &H53End Sub9, 根据上面所构建的子程序及函数,可以编写出下载文件子程序的代码了。双击“下载代码”按钮,在代码窗中键入如下代码。Private Sub Prog_Click() ii = 0 oo = 0 If Text1.Text = *.hex Or Text1.Text = Then Text2.Text = 未选择文件或文件不存在,请重新选择目标文件! GoTo err End If FileNumber = FreeFile Open Text1.Text For Input As FileNumber StartPro

29、g Do While Not EOF(FileNumber) Line Input #FileNumber, inbuf If Left$(inbuf, 1) : ThenText2.Text = 非Inter格式Hex文件,请重新择!”GoTo err End If Dim i As Integer Dim o As Integer o = 0 For i = 2 To Val(&h + Mid$(inbuf, 2, 2) + 5) * 2 Step 2 检查文件 o = (o + Val(&h + Mid$(inbuf, i, 2) And &HFF Next i If o 0 Then Text2.Text = 文件检查未通过,请重新编译文件! GoTo err End If - If Val(&h + Mid$(inbuf, 8, 2) 1 Then GoTo NEXT_LOOP End If - If Val(&h + Mid$(inbuf, 2, 2)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1