产品选型

51单片机 diy 单片机实例分享,自制电感和电容测量仪

小编 2024-10-10 产品选型 23 0

单片机实例分享,自制电感和电容测量仪

电子爱好者进行制作时经常需要绕制电感,而一般的数字万用表通常又没有电感测量挡,所以无法测量绕好的电感的电感量。本文介绍一种用单片机制作的电感和电容测量仪(见图23.1),可以有效地解决这一问题。

测量原理

本测量仪采用谐振法测量电感和电容,其方法是用谐振回路的谐振特性来进行测量,其测量原理可用如图23.2所示的电路进行说明。

图23.1 电感和电容测量仪

测量电感Lx时,配用标准电容C1,用Lx和C1组成谐振回路,测量出回路的谐振频率f即可计算出Lx的电感量;测量电容Cx时,配用标准电感L1,用L1和Cx组成谐振回路,测量出回路的谐振频率f即可计算出Cx的电容量。

上述测量方法也有一个缺陷:当Lx或Cx很小时,谐振频率f会很大,测量比较困难,为此我们可以采用如图23.2所示的改进型电路,分别用L1和C1作“垫底”,降低了测量时的谐振频率。

假设由 L1和C1 组成的谐振回路谐振频率为f1,测量Lx时,Lx和L1串联,测得(L1+Lx)和C1组成的谐振回路谐振频率为f2,则根据下式可计算出Lx的电感量:

Lx=[(f1/f2)2-1]L1

测量Cx时,Cx和C1并联,测得L1和(C1+Cx)组成的谐振回路谐振频率为f2,则可根据下式可计算出Cx的电容量:

Cx=[(f1/f2)2-1]C1

硬件电路

测量仪电路如图23.2所示。电路由LC振荡电路、单片机电路、显示电路等部分组成。

CD4069是6非门CMOS集成电路,其中非门F1、F2和C2、R1、R2等组成两级放大电路。第一级放大电路中,R2是负反馈偏置电阻,将F1输出端的直流电位钳制在VCC/2,使F1工作在线性放大区域。第二级放大电路没有加反馈电阻,直接用第一级放大电路输出的直流电压作偏置电压,以提高放大器的增益。放大电路通过正反馈回路R3、C3与L1、C1谐振电路一起组成正弦波振荡电路,非门F3用于信号整形,把F2输出的正弦波转换成矩形波输入到单片机ATmega8的T1脚,由单片机进行脉冲计数,从而测出LC回路的谐振频率。通过单片机对数据进行计算处理后,由LCD1602液晶屏显示测量结果。

图23.2 测量仪电路原理图

S1为测量转换开关,当S1转向L时测量电感,转向C时测量电容。S2是归0按钮。

LCD1602采用4线制传递数据,只使用了数据端口D4~D7。

当开关S1在电容挡但没有测量电容Cx,或在电感挡并且用短路线代替Lx时,电路的振荡频率约为503kHz,我们把这个频率称为基准频率。测试电容或电感时,被测试元件的电容量或电感量越大,对应的振荡频率越低。当被测电容的电容量为10μF(或电感的电感量为1H)时,对应的振荡频率约为5.03kHz。

电阻R5的阻值控制LCD1602液晶屏的对比度,R5阻值越小,液晶屏对比度越大。LED和LED+是液晶屏背光发光二极管的供电端口。

程序设计

测量仪的电路比较简单,而功能的实现更重要地依赖于程序的设计。程序的设计和优化需要花费更多的精力。

程序由频率测量、测试数据的计算处理、LCD1602液晶屏驱动显示三大部分组成。频率测量部分用定时器T/C1作脉冲计数,定时器T/C2产生测量脉冲频率的闸门时间。这里闸门时间选择0.5s,定时器T/C1累计的脉冲数乘以2即得脉冲频率。闸门时间选择0.5s是为了提高LCD1602显示数据刷新速度,如果闸门时间选1s,则刷新速度偏慢。

测试数据的计算处理部分主要利用前面给的两个公式计算出测量结果,并经过数据预处理后,输出到显示电路显示读数。

LCD1602的数据传输采用4线制,8位数据分两次传送,先传高4位,后传低4位,因为传递的数据量不大,所以你感觉不到4线制速度传输和8线制有什么区别。

安装调试

制作所需元器件的清单见表23.1。

C1、L1要选用精度比较高的元件,有条件的可用万能电桥进行筛选。L1如买不到成品电感也可自制,磁芯用Φ8×10的工字磁芯,用Φ0.42的漆包线绕55.5圈。

安装前先将程序的目标文件写入单片机ATmega8L,熔丝位的设置如图23.3所示。

图23.3 熔丝位的设置

电路板的装配图如图23.4所示。LCD1602的接口排座焊接在电路板上,排针焊接在LCD1602模块上如图23.5所示。

表23.1 元器件清单

图23.4 电路板装配图

安装完成后,用一根USB线将电源接口连到电脑USB插座上,接通测量仪的电源,将S1置于电容挡,测量端不接电容,这时LCD1602第二行显示的是基准频率f1,如图23.6所示。基准频率如果超出503kHz±5kHz的范围,说明L1、C1中有元件误差较大,需进行相应的调整。如果L1是自绕的,出现误差的可能性相对较大,可适当增减其圈数,直至满足要求。

接通电源后,以电容挡为例,虽然我们在测试端并没有接任何电容,但LCD1602第一行显示的电容量读数并不为零,如图23.6所示,我们称其为初始值,这是由基准频率略有漂移造成的。这时如果测量小容量的电容,误差就比较大,当初始值后有“-”号时,测量值是实际值减去了初始值,即读数比实际容量小了。反之,测量值是实际值加上了初始值,即读数比实际容量大了。

对于上述问题,我在程序中也作了考虑,只要在不接测试电容的情况下按一下S2就可以归0了,其实质就是基准频率作了修正,并把修正结果存入EEPROM,掉电后不会丢失。归0后的显示数据如图23.7所示。

电容挡归0后,电感挡就不需要归0了,因为电容挡归0就相当于在电感挡测试端接了一个短路线,等同于电感挡归0(在S1置于电感挡,S2归0时其测试端必须接短路线),分析一下电路就明白了。

图23.5 排针的焊接

如果使用中发现测量误差较大,可通过程序进行修正,具体做法如下:找一个精度高的1000pF电容进行测量,假设读数为950pF,则计算1000/950≈1.05,我们将其称为修正系数,将计算公式Cx=[(f1/f2)2-1]C1改为Cx=[(f1/f2)2-1]C1×1.05,用这个公式计算就能减小测量误差了。为了简化程序中的计算,我采取把程序中的语句“unsigned int C1=1000”改为“unsigned int C1=1050”的方法,效果是一样的。

再找一个精度高的100μH电感进行测量,假设读数为94,则计算100/94≈1.06,把程序中的语句“unsigned char L1=100”改为“unsigned char L1=106”,同样也能减小测量误差。

把重新编译好的目标文件烧写到ATmega8L,再进行测量,精度就提高了。

用本测试仪测量电容的实例如图23.8所示(测量对象分别为240pF云母电容和0.47μF安规电容),测量电感的实例如图23.9所示(测量对象分别为10μH电感和电子节能灯的电感线圈)。

当测量值超过量程时,读数显示“OVE”,测电感时电感测试端不接电感(相当于电感量为无穷大),读数也显示“OVE”。

图23.6 基准频率的测量结果

图23.7 按S2归0后的显示数据

使用这个电感和电容测量仪时有一个问题需要注意,即电感或电容的参数会受测试频率的影响。例如,具有磁芯的电感,由于受磁芯的频率特性影响,不同的测试频率,其结果可能有所不同,用这个测量仪测的数据和用信号源频率为1000Hz的万能电桥测的数据可能会不一致。笔者认为,用更接近实际工作频率的测试频率可以得到比较符合实际的测试结果。由于本测试仪工作频率比较高,不适合测量电解电容器。笔者测量一个10μF的电解电容器,对应测试频率为6.5kHz,读数为6.26μF,误差很大。

图23.8 电容的测量结果

图23.9 电感的测量结果

MCS51单片机开发工具DIY

刘楚浩

摘要:本文详细介绍了利用AT89S8252单片机的在系统编程功能,用Visual Basic6.0(以下简称VB)在Windows环境下开发制作一款MCS51单片开发工具的方法。内容涉及VB编程、PC机并口控制及单片机在系统编程等内容。

关键词:VB编程AT89S8252 在系统编程 DIY

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

一、当前常用开发模式介绍

目前基本上有两种开发模式:

1,用仿真器优点:方便,可以设置断点,可以观察存贮器及寄存器的内容

缺点:价格昂贵,且仿真器终究不是单片机,有时代码在仿真器上能通过,但在单片机中不能正常工作,反而增加了调试的难度。

2,用编程器优点:价格相对便宜,通常一款编程器可编多种器件。

缺点:操作相当不便,每次要将芯片在目标板与编程器之间转移,并且还要在编译操作界面与编程器操作界面之间切换,大部份时间在做简单的重复的工作。

二、一种新的开发模式介绍及芯片选择

本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式)。由于利用了芯片的在系统编程功能,因此不需要移动芯片,在软件设计时设计成一旦代码文件被重新编过即自动下载到芯片并自动复位运行,真正的“所编即所得”。

目前很多单片机都支持在系统编程,MCS51系列单片机支持在系统编程的也很多,但大多数是支持通过PC机的串口对单片机进行编程。这样有三个不方便的地方:一是如果项目本身要与PC机串行通讯就不方便;二是要增加一片MAX232电平转换芯片;三是有的芯片要按特定的步骤进入下载模式,编程过程需要手工干预。

经过比较,Atmel公司生产的AT89S8252是一种比较理想的芯片,适合我们用来制作开发工具。此芯片有如下特点:

l 与MCS51兼容

l 内含8K可擦写1000次的程序存贮器,2K可擦写超过100000次的数据存贮器及256字节8位宽内部RAM

l 可通过SPI接口在系统串行编程,与MCS51兼容

l 串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间

l 低电压下载,无需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串行编程命令介绍

4、 AT89S8252串行编程时序图

四、硬件设计:

a) 通过计算机并口与单片机SPI口连接

b) 为了保护计算机并口,增加一片74HC244作为隔离

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

(原理图文件为mcu51diy.sch)

五、用VB编程进行并口控制介绍

打印端口的基地址一般为0x278,0x378或0x3BC,这可以从控制面板中查到。为了方便读者,下面以表格形式列出常用打印端口脚位及寄存器位元说明。

在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

2, 在窗体上放置控件并设置控件的相关属性如下图及表所示:

3, 首先编定程序起动及退出的相关代码,起动时将Timer1关闭,在Text1及Text2中显示相关提示信息,并加入允许端口操作命令,退出时发出关闭端口操作命令。双击窗体空白处,在出现的代码窗中输入如下代码:

Private Sub Form_Load()

If InitializeWinIo = False Then

MsgBox "错误,无法开启端口!"

End

End If

Timer1.Enabled = False

Text1.Text = "*.HEX"

Text2.Text = "请选择目标文件!"

Beep

End Sub

双击“退出“按钮,在出现的代码窗中输入如下代码:

Private Sub Exit_Click()

Call ShutdownWinIo

End

End Sub

另外,为了使用方便,在代码窗的“通用”区定义打印端口基地址常数及定义一个存贮文件更新时间的变量;由于每个人的计算机配置不一样,对于快速的计算机可能需要延时同步,所以设置一个Delay延时常数。具体代码如下:

Const ptraddress = &H378 ‘此数值应根据机器的实际值填写

Const Delay = 2’当你的机器太快时加大此数值

Dim file_date‘用于存贮文件更新时间

4, 接下来我们要创建一个最基本的子程序,即字节输出子程序:

形式:outbyte(data As Integer)

功能:将一字节数据写入指定的单片机程序存贮器地址中,高位在前

入口:字节数据data

Private 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‘延时

Next 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 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 Sub

5, 根据字节输出子程序构建程序存贮器字节写入子程序

形式:w_c_b(codeaddress As Integer, codedata As Integer)

功能:将数据codedata写入单片机程序存贮器codeaddress地址

入口:codeaddress-程序存贮器地址

codedata-数据

<此子程序兼容了AT89S53芯片的写入>

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 codedata

End Sub

6, 构建读单片机程序存贮器数据函数

形式:r_c(codeaddress As Integer) 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))) '合并命令与高地址字节

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 Delay

Next i

DIO_OutputByte ptraddress, 2 ^ 7 '输出时钟低电平

Next con1

r_c = X

End Function

7, 双击“打开文件”按钮,键入下述代码(获取目标文件的路径及文件名并保存到Text1文本框中)。

Private Sub OpenFile_Click() '打开文件按钮

On Error GoTo errhandler

CommonDialog1.Filter = "*.HEX|*.hex"

CommonDialog1.FilterIndex = 2

CommonDialog1.ShowOpen

If CommonDialog1.FileName <> "" Then

Text1.Text = CommonDialog1.FileName

End If

errhandler:

End Sub

8, 由于在进行任何操作之前都要发送允许编程命令 ,因此构建一个允许编程子程序。

功能:打开74HC244并发出允许编程命令,使芯片进入编程状态

Private Sub StartProg() '发送串行编程命令

DIO_OutputByte ptraddress, 0 '打开74hc244,点亮编程指示灯

TimeDelay (20)

DIO_OutputByte ptraddress, 2 ^ 7 '设置RST为高

TimeDelay (20)

outbyte &HAC

outbyte &H53

outbyte &H53

End Sub

9, 根据上面所构建的子程序及函数,可以编写出下载文件子程序的代码了。双击“下载代码”按钮,在代码窗中键入如下代码。

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

StartProg

Do While Not EOF(FileNumber)

Line Input #FileNumber, inbuf

If Left$(inbuf, 1) <> ":" Then

Text2.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)) <> 0 Then

o = Val("&h" + Mid$(inbuf, 4, 4))

For i = 10 To Val("&h" + Mid$(inbuf, 2, 2)) * 2 + 8 Step 2

w_c_b o, Val("&h" + Mid$(inbuf, i, 2))

ii = ii + 1

Dim t As Long

t = GetTickCount

TimeDelay (3)

Text2.Text = Str$(ii) + " Bytes"

o = o + 1

DoEvents

Next i

End If

NEXT_LOOP:

Loop

err:

DoEvents

DIO_OutputByte ptraddress, 2 ^ 3

Close FileNumber

Beep

End Sub

10, 构建校验文件子程序:双击“校验文件”按钮,在代码窗中输入如下代码:

Private Sub Veri_Click() '校验文件

FileNumber = FreeFile

If Text1.Text = "*.hex" Or Text1.Text = "" Then

Text2.Text = "请选择目标文件!"

GoTo err

End If

Open (Text1.Text) For Input As FileNumber

StartProg

Do While Not EOF(FileNumber)

Line Input #FileNumber, inbuf

If Left$(inbuf, 1) <> ":" Then

Text2.Text = "非Inter格式Hex文件,请重新选择!"

GoTo err

End If

'-------------------------------------------

If Val("&h" + Mid$(inbuf, 8, 2)) > 1 Then

GoTo NEXT_LOOP

End If

'--------------------------------------------

Dim i As Integer

Dim o As Integer

If Val("&h" + Mid$(inbuf, 2, 2)) <> 0 Then

o = Val("&h" + Mid$(inbuf, 4, 4))

For i = 10 To Val("&h" + Mid$(inbuf, 2, 2)) * 2 + 8 Step 2

If r_c(o) <> Val("&h" + Mid$(inbuf, i, 2)) Then

oo = oo + 1

End If

o = o + 1

ii = ii + 1

Text2.Text = Str$(ii) + " Bytes"

DoEvents

Next i

End If

NEXT_LOOP:

Loop

If oo = 0 Then

Text2.Text = "文件检验通过"

Else

Text2.Text = "文件检验共发现" + Str$(oo) + "字节错误!"

End If

err:

DIO_OutputByte ptraddress, 2 ^ 3

Close FileNumber

Beep

End Sub

11, 编写写保密位子程序,双击“写保密位”按钮,在代码窗中键入如下代码:

Private Sub WriteS_Click()

Dim temp As Integer

StartProg

outbyte &HAC

temp = &HFF

If LB1.Value = 1 Then

temp = temp And &H7F

End If

If LB2.Value = 1 Then

temp = temp And &HBF

End If

If LB3.Value = 1 Then

temp = temp And &HDF

End If

outbyte temp

outbyte temp

Text2.Text = "OK!"

TimeDelay (20)

DIO_OutputByte ptraddress, 2 ^ 3

End Sub

12, 文件更新后自动下载功能处理代码如下:

Private Sub check1_click() '文件更新后自动重下载

If Check1.Value = 1 Then

Timer1.Enabled = True

If Text1.Text <> "*.hex" And Text1.Text <> "" Then

file_data = FileDateTime(Text1)

End If

Else

Timer1.Enabled = False

End If

End Sub

Private Sub Timer1_Timer() '文件是否更新检查

Timer1.Enabled = False

On err GoTo err1

If Text1.Text <> "*.hex" And Text1.Text <> "" Then

If file_date <> FileDateTime(Text1) Then

Prog_Click

file_date = FileDateTime(Text1)

End If

End If

err1:

Timer1.Enabled = True

End Sub

至此,全部程序编写完成,程序能实现基本的下载、校验、写保密位及文件更新后自动重写功能。

八、结束语

虽然上述程序能实现各种基本的功能,但并不完善,并未考虑各种异常情况,读者可根据实际情况进行完善。编程功力较差的朋友可直接到笔者的网站(http://www.mcudiy.com)下载相对较完善的程序。如果充分理解了上述程序,那么DIY一个AVR及PIC单片机的开发工具也非难事。其实,在笔者的网站有“MCS51/AVR/PIC三合一下载器”供爱好者下载,之所以单独叙述MCS51开发工具,仅仅是为了叙述简单及容易理解。

参考资料:

《AT89S8252数据手册》http://www.atmel.com

《利用Visual Basic实现串并行通信技术》 范逸之、陈立元、孙德萱、程正孚编著

清华大学出版社2001年

《Visual Basic6.0入门与提高》张树兵、戴红、陈哲、编著

清华大学出版社2001年

相关问答

51 八位 单片机 开发板怎么做?

1.通过购买相应的材料和器件,以及编程软件,可以制作出51八位单片机开发板。2.首先,需要准备好51单片机芯片、电路板、电阻、电容、晶振等器件,以及USB转串...

可不可以用 51单片机 制作一个手机-ZOL问答

不建议直接用51单片机来做手机,因为51系列是低级的嵌入式处理器,主要用于简单的控制任务。要制作手机这种复杂电子设备,需要的是像ARMCortex或高通骁龙这样的...

基于proteus的 51 系列 单片机 怎样运行仿真?

你好!很高兴为你解答,下面给你仔细介绍!proteus是一个仿真软件,可以在proteus里面仿真51单片机的实验,这样解决了自己制作和焊接单片机的电路,把编写好多...

51单片机 还能流行多久?有没有小型化和免焊结技术改进的必要?

从理论上讲,虽然很多厂商还在不断改进但51系列在性能和价格上都已经没有什么优势。比如八位的STM8s003功能比很多51强,库函数支持也不错,只卖一块多。CM0,...

51单片机 是什么内核?

答单片机内核是就是51单片机的CPU内核,字面意思就是51单片机内核构造的指令集51单片机是指80年代Intel开发的8051单片机内核的统称,就是因为这个“8051”有个5...

51单片机 电子时钟课程设计程序 急急急急。。。。。。。。。

下面是具体的设计:数字时钟的设计与制作摘要:本系统是采用555构成的多协振荡器、74LS90芯片组合做成的数子时钟系统。其中用555构成的多协振荡器产...

51单片机 如何创建程序?

目前,较为常见的51单片机创建程序工具是WAVE6000和keiI4,其中最主要的是keil4,其创建步骤如下:第一步,在工具界面中点击file→新建TXT文本。第二步,将新...

51单片机 如何建立步骤?

目前进行STC89C51/52、AT89S51/521、双击启动keil软件2、启动新建工程3、给新建工程命名和保存4、选择单片机型号,我们以STC89C52为例,依次选择“Atmel”-.....

51单片机 做电子钟,自动校时方面最简单的能用什么方法?

[回答]一、数字钟的组成与基本原理一、课程名称:数字电子钟的设计。二、内容:设计并制作一台数字电子钟,完成设计说明书。三、设计内容及要求:设计内容:要...

熟悉C语言 51单片机 想在物联网嵌入式方面发展,需要再学习储备哪些知识?

你好,我是富士山下,目前从事嵌入式软件工作。下面简单说一下我的看法。对于你说的熟悉,不知道是熟悉到哪种程度了,说说我的观点。熟悉C语言的程度应该还是不...

猜你喜欢