回 帖 发 新 帖 刷新版面

主题:[原创]VB通过串口控制单片机读写24C02源代码下载

///////////VB程序///////////
Const READIIC   As Byte = &H1
Const WRITEIIC  As Byte = &H2
Const RESETIIC  As Byte = &H0

Option Explicit

Dim buff(0 To 32) As Byte           '缓冲区
Dim filebuff(0 To 255) As Byte      '发送文件缓冲区
Dim recebuff(0 To 255) As Byte      '接收文件缓冲区

Dim mycount As Integer              '计数器

Private Sub Command1_Click()

Me.Enabled = False
mycount = 0
'发送写命令和数据
buff(0) = WRITEIIC
Dim i As Integer
For i = 1 To 32
    buff(i) = filebuff(i - 1)
Next i
Mcom.Output = buff

End Sub

Private Sub Command2_Click()
Me.Enabled = False
'发送读命令和数据
mycount = 0
buff(0) = READIIC
Mcom.Output = buff
End Sub

Private Sub Command3_Click()

Dim buff() As Byte
Dim i As Integer
Dim str As String
'打开对话框
CD1.InitDir = "c:\"
CD1.ShowOpen
Text3.Text = CD1.FileName

If Len(Text3.Text) = 0 Then Exit Sub

Command1.Enabled = True
'打开文件
Open Text3.Text For Binary As #1
If LOF(1) = 0 Then End
'--------------------------------
If (LOF(1) > 0) And (LOF(1) < 256) Then
    ReDim buff(0 To LOF(1)) As Byte
    Get 1, , buff()
    
    For i = 0 To LOF(1) - 1
        filebuff(i) = buff(i)
    Next i
    
    For i = LOF(1) To 255
        filebuff(i) = 0
    Next i
    
    
Else
    Get 1, , filebuff()
End If

For i = 0 To 255
If filebuff(i) > 15 Then
    str = str & Hex(filebuff(i)) & "H "
Else
    str = str & "0" & Hex(filebuff(i)) & "H "
End If
Next i
Text1.Text = str
Close #1

End Sub


Private Sub Form_Load()
If Mcom.PortOpen = False Then Mcom.PortOpen = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Mcom.PortOpen = True Then Mcom.PortOpen = False
End Sub

Private Sub Mcom_OnComm()
Dim str As String
Dim aa As Variant
Dim i As Integer
'接收数据
If Mcom.CommEvent = 2 Then
    aa = Mcom.Input
    For i = 1 To 32
    recebuff(mycount * 32 + i - 1) = aa(i)
    Next i
    mycount = mycount + 1
    If mycount = 8 Then
        mycount = 0
        For i = 0 To 255
        If recebuff(i) > 15 Then
            str = str & Hex(recebuff(i)) & "H "
        Else
            str = str & "0" & Hex(recebuff(i)) & "H "
        End If
        Next i
        Text2.Text = str
        Me.Enabled = True
    Else
        For i = 1 To 32
            buff(i) = filebuff(mycount * 32 + i - 1)
        Next i
        Mcom.Output = buff
        
    End If
    
End If
End Sub

////////////////////////////////////////////////////////////////////
51单片机端的代码[em9]
//////////////////main.c////////////////////////////
#include"reg51.h"
#include"absacc.h"
#include"stdio.h"
//波特率:4.8K
#define     RESETIIC    0
#define     READIIC        1
#define     WRITEIIC    2
//IIC读写函数
extern unsigned char     Read24c02_OneByte(unsigned char addr) ;
extern     void         Write24c02_OneByte(unsigned char addr,unsigned char ddata);


void init();
void send();
unsigned char buff[33];            //串口缓冲区
//数据结构
/*
  buff[0]------------------命令:0 复位编程器,1 读IIC ,2 写IIC
  buff[1]-buff[32]---------数据
*/
unsigned Address=0;
unsigned char flag=0;
void main()
{
 unsigned char index;
 init();

 while(1)
 {
  while(flag)
  {
   flag=0;
   if(buff[0]==RESETIIC)
   {//0 复位编程器
     for(index=0;index!=33;index++) buff[index]=0;
    Address=0;
   }
   if(buff[0]==READIIC)
   {//1 读IIC
     for(index=1;index!=33;index++) buff[index]=Read24c02_OneByte(Address++);
    send();
   }
   if(buff[0]==WRITEIIC)
   {//2 写IIC
     for(index=1;index!=33;index++) Write24c02_OneByte(Address++,buff[index]);
    send();
   }
  }
 }
}


void init()
{
 unsigned char i;
 TMOD=0x20;     //Timer1 模式2
 TH1=0xF3;     //
 TL1=0xF3;     //
 TR1=1;         //启动Timer1
 PCON|=0x80; //波特率加倍
 SCON=0x50;     //设置串口
 TI=0;
 for(i=0;i!=33;i++) buff[i]=0;
 ES=1;
 EA=1;

}

void com_isr() interrupt 4
{
 unsigned char i;
 EA=0;
 RI=0;
//接收33个字节
 buff[0]=SBUF;
 for(i=1;i!=33;i++)
 {
  while(!RI);RI=0;
  buff[i]=SBUF;
 }

 flag=1;
 EA=1;

}

//发送33个字节
void send()
{
 unsigned char i;
 EA=0;
 for(i=0;i!=33;i++)
 {
  SBUF=buff[i];
  while(!TI);TI=0;
 }
 EA=1;
}
////////////24C02.C////////////////////////
#include "reg51.h"
#include "intrins.h"
#include"51usb.h"                //51USB实验板的头文件
#define uchar     unsigned char
#define uint      unsigned char
#define true  1
#define false 0
#define bool bit
#define Byte unsigned char
#define Word unsigned int
#define read 0x80
#define write 0x00

//私有内部函数
#define    \
SomeNOP(); \
_nop_();_nop_();_nop_();_nop_();

//私有内部函数
void IICStart(void)
{
    EA = 0;
    SDA = 1;SCL = 1;SomeNOP();
    SDA = 0;SomeNOP(); 
    SCL = 0; SDA = 1;
}
//私有内部函数
void IICStop(void)
{
    SCL = 0;SDA = 0;SomeNOP();
    SCL = 1;SomeNOP();SDA = 1;
    EA = 1;
}

//私有内部函数
void SendAck(void)
{
    SDA = 0;SomeNOP();
    SCL = 1;SomeNOP();
    SCL = 0;
}    
//私有内部函数
void SendNotAck(void)
{
    SDA = 1;SomeNOP();
    SCL = 1;SomeNOP();
    SCL = 0;
}
//私有内部函数
void IICSendByte(uchar ch)
{
    uchar i = 8;
    while(i--)
    {
        SCL = 0;_nop_();
        SDA = (bit)(ch&0x80);ch<<=1;SomeNOP();
        SCL = 1;SomeNOP();
    }
    SCL = 0;
}
//私有内部函数
uchar IICReceiveByte(void)
{
    uchar i = 8;
    uchar ddata = 0;
    SDA = 1;
    while(i--)
    {
        ddata<<=1;
        SCL = 0;SomeNOP();
        SCL = 1;SomeNOP();
        if(SDA)ddata |= 0x01;
    }
    SCL = 0;
    return ddata;

}
//私有内部函数
bool WaitAck(void)
{
    SDA = 1;SomeNOP();
    SCL = 1;SomeNOP();
    while(SDA){IICStart();    IICSendByte(0xa0);SDA = 1;SomeNOP();    SCL = 1;SomeNOP();}
    SCL = 0;
    return true;
}

//***********************************
//**公有函数,外部接口             **
//***********************************
//写一个数据
void Write24c02_OneByte(unsigned char addr,unsigned char ddata)
{
    IICStart();
    IICSendByte(0xa0);
    WaitAck();
    IICSendByte(addr);
    WaitAck();
    IICSendByte(ddata);
    WaitAck();
    IICStop();
    SomeNOP();
}
//读一个数据
unsigned char Read24c02_OneByte(unsigned char addr)
{
    uchar temp;
    IICStart();
    IICSendByte(0xa0);  //先写入地址,设置写
    WaitAck();
    IICSendByte(addr);
    WaitAck();
    IICStart();
    IICSendByte(0xa1);   //设置读
    WaitAck();
    temp = IICReceiveByte();
    SendNotAck();
    IICStop();
    return temp;    
}

[img]I:\WEB\IIC读写程序.JPG[/img]

详细介绍
http://www.lgmcu.com/51USB_II.htm

回复列表 (共3个回复)

沙发

好贴

板凳

这类东西我介绍个不错的网http://www.8951.com/bbs/index.asp

3 楼

可通过1台电脑RS232串口控制255台步进电机的单片机控制系统!电脑集中控制上位机控制集散型控制灯光控制
JMDM RS232串口控制步进电机最小系统(最简配置),可在电脑VB界面在线设定步进电机转速、圈数、停顿时间等参数的RS232串口控制步进电机系统;
研发制造商:深圳市精敏数字机器有限公司

组成及用途简介:
这个最简配置产品组合,采用我司自主研发制造的出色的单片机控制器:JMDM-20DIOV2串口控制器,及配套的电机、驱动器、电源,组成一套最简配置RS232串口控制步进电机系统,是串口控制步进电机的最经济、稳定、可靠的入门学习产品,可用于学习、实验、工业应用。
最简配置包括以下内容:
1、42步进电机1台;          
2、42步进电机驱动器1台;
3、JMDM-20DIOV2串口控制器1台;
4、5V/24V 双组DC开关电源1个;
5、RS232串口通信线1条。

选型备注:
1、以上最小系统是控制42电机的,JMDM-20DIOV2可以控制各种型号的普通电机、步进电机、伺服电机等。您可根据需要选用适合的电机型号。若不做电脑串口控制,JMDM-20DIOV2可同时控制2路步进电机;
2、选用JMDM-20DIOV2单片机控制器实现电脑串口控制电机是最低成本、高性能的配置方案;它有8路光电隔离数字量输出:4路是继电器输出(可接220V电压,最大承受电流是5A)、4路是晶体管输出,集电极开路输出形式,输出电压为24/12V,最大输出电流为4A, 输出口状态可回读;
3、您还可以选用JMDM-28DIOMT来实现RS232串口控制步进电机、伺服电机、电磁阀等,选用JMDM-28DIOMR来控制普通电机或继电器等。
二者都是16路光电隔离数字量输入,NPN输入形式,输入电流为10mA;其中有两路可作中断源用于计数;
JMDM-28DIOMR输出:12路继电器(采用松下原装继电器)输出,输出电压为0—220V,最大输出电流为5A, 输出口状态可回读;
JMDM-28DIOMT输出:12路光电隔离数字量输出,集电极开路输出形式,输出电压为24/12V,最大输出电流为1A, 输出口状态可回读;
4、若您还需要人机界面,则可以选用我司的JMDM-2011一体机(单片机控制器和文本显示)控制步进或伺服电机。

JMDM RS-485/232 步进电机控制系统 简介

研发制造商:深圳市精敏数字机器有限公司

一、功能描述:
  1、上位机(PC机或具有串口的其他控制设备)通过RS232串口连接到本控制器后,向控制器发送一串ASCII代码指令既可控制步进电机的转向、转速、步进量,完全不需了解步进电机及驱动器的工作原理。例如:串口发送"SPR(100)",则步进电机将顺时针以每分钟100转的速度旋转,串口发送"SPL(300)",则步进电机将逆时针以每分钟300转的速度旋转;串口发送"PULR(100)",则步进电机将顺时针步进100个步距角,串口发送"PULL(1000)",则步进电机将逆时针步进1000个步距角。用于精密转速控制、精密运动控制、精密机械加工等,控制精度极高,转速误差<0.01转/分钟。也可按要求定制更高精度控制板。提供VB软件控制步进电机的演示源代码以及执行程序。
  2、通过地址编码,一个串口最多可以寻址、控制255块串口控制智能步进电机驱动器,也就是说一个串口(或一台电脑)可以控制255台步进电机。串口控制智能步进电机驱动器和控制主机之间距离可以通过485总线延长(最长1千米),这样控制主机可以放置在离步进电机很远的地方.  
  3、本控制器收到串口指令后对指令进行解析,并发出控制信号给下位步进电机驱动器执行;另外也可脱机工作,按照预先存放在存储器中的程序实现步进电机的实时控制,如接收到启动信号后自动控制步进电机按照一定的转速和圈数运行,进行无反馈精确定位。
  4、随产品附送步进电机控制系统参数设定软件,可以设定步进电机的运行参数,如转速,运行圈数等;
  5、可根据客户特定需要设计符合客户实际需要的的控制系统;
二、应用案例
串口通讯自动化设备
自动化质量检测仪
生产线智能检测系统
定长控制系统
候车岗亭广告牌自动切换系统
精密转速控制、精密运动控制、精密机械加工等场合。


JMDM RS-485远程测控系统 电脑集中控制系统 上位机控制 简要说明
本产品研发制造商:深圳市精敏数字机器有限公司

JMDM RS-485远程测控系统,可采用我公司2款出色的单片机控制器:JMDM-28DIOMR/MT或JMDM-20DIOV2,其中JMDM-20DIOV2一般最小可以定制到8个输入输出点,即JMDM-8DIOV2。
最大组网应用能力:
采用255块JMDM-28DIOMR/MT,构成7140点(4080入3060出)的大控制系统;
采用255个JMDM-20DIOV2,构成5100点(3060入2040出)的大控制系统。
最小应用能力:
采用单个JMDM-28DIOMR/MT,构成28点控制16入12出;
采用单个JMDM-8DIOMR/MT,构成8点控制,输入输出点数可定制。

一、功能描述:
    1:RS-485 总线型远程测控系统已得到广泛应用,这主要因为 RS-485 总线具有传输距离远等特点。在传输速率为9600bit/s时传输距离可达1.2km以上,最高传输速率可达 10Mbit/s,且只用普通双绞线即可,同一对双绞线上可以挂接多至255个以上的终端。有许多工业测控模块都是采用 RS-485 总线型的,但价格较高。
  2:本系统采用RS-485总线作为各个控制板之间的通信载体,最多可由255个控制板构成一个由4080个输入点,3060个输出点的大系统;可采用电脑或主PLC作为主控制单元。
  3:本系统的从板可由上位机软件设定各从板的地址。
  4:本系统在采用电脑做为主控时可由上位机软件(如VB或VC语言)直接控制每个从板的输出状态,也可以读入每个从板的输入状态。
二、用途描述:
  1:用于各种集散型控制系统;
  2:用于各种远程测控系统;
  3:可用于灯光控制,电厂控制,自动化车间的大中型控制项目;
  4:可用作远程IO模块;
  5:可用于电脑集中控制。

更多详细资料,欢迎垂询深圳市精敏数字机器有限公司 :
电话:0755-21329780;135 3761 1420 孙小姐
0755-29769287;29769297;传真:0755-29958512
E-mail:jingmindm@163.com;或szjmdm@hotmail.com;
QQ:  992267088          SKYPE:newton0627;
MSN:szjmdm@hotmail.com;  阿里旺旺:newton0627
或欢迎登陆以下网址,了解精敏数字机器有限公司更多工业控制产品信息:
公司网址:www.jingmindm.com
阿里巴巴诚信通会员店:http://newton0627.cn.alibaba.com
淘宝店铺:http://shop35650247.taobao.com/

我来回复

您尚未登录,请登录后再回复。点此登录或注册