当前位置:编程学习 > VB >>

多通道数据采集

--------------------编程问答-------------------- 下位机单片机程序


//-----------------------函数声明,变量定义------------------------
#include <reg51.h>
#include <intrins.h>
sbit SCL=P1^2;                   // 将p1.2口模拟时钟口
sbit SDA=P1^3;                   // 将p1.3口模拟数据口
sbit key=P1^4; 
bit askflag;
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};          
bit   bdata SystemError;                //从机错误标志位
/*********************** PCF8591专用变量定义 ***********************/

#define PCF8591_WRITE 0x90 
#define PCF8591_READ  0x91
#define  NUM  4              //接收和发送缓存区的深度
uchar idata receivebuf[NUM];    //数据接收缓冲区
/******************************************************************
* 串行通信波特率设置    *
*   *
*******************************************************************/
cxtx_btl()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=TL1=0xFF; // 波特率9600

SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON =0x80; // 波特率不倍增
TR1 = 1;
}
/*******************************************************************
* 向串行口发送一个数据          *
*    *
********************************************************************/
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
/*******************************************************************/
/*                                                                 */
/*  延时函数                                                       */
/*                                                                 */
/*******************************************************************/

void delay(int ms)
{
    while(ms--)
{
      uchar i;
  for(i=0;i<250;i++)  
   {
    _nop_();    
_nop_();
_nop_();
_nop_();
   }
}
}


//-------------------------------------------------------------------
// 函数名称: iic_start()
// 函数功能: 启动I2C总线子程序
//-------------------------------------------------------------------
void iic_start(void)
{ //时钟保持高,数据线从高到低一次跳变,I2C通信开始
SDA = 1;     
SCL = 1;
delayNOP();      // 延时5us 
    SDA = 0;
delayNOP();
    SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: iic_stop()
// 函数功能: 停止I2C总线数据传送子程序
//-------------------------------------------------------------------
void iic_stop(void)
{  
SDA = 0;       //时钟保持高,数据线从低到高一次跳变,I2C通信停止
SCL = 1;
delayNOP();
SDA = 1;
delayNOP();
    SCL = 0;
}
//------------------------------------------------------------------
// 函数名称: iicInit_()
// 函数功能: 初始化I2C总线子程序
//------------------------------------------------------------------
 void iicInit(void)
   {
   SCL = 0;
   iic_stop();
   }  
//-------------------------------------------------------------------
// 函数名称: slave_ACK
// 函数功能: 从机发送应答位子程序
//-------------------------------------------------------------------
void slave_ACK(void)
{
SDA = 0;  
SCL = 1;
delayNOP();
SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: slave_NOACK
// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
//-------------------------------------------------------------------
void slave_NOACK(void)

SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
    SCL = 0;  
}
//-------------------------------------------------------------------
// 函数名称: check_ACK
// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
//-------------------------------------------------------------------
void check_ACK(void)
{      
    SDA = 1;        // 将p1.1设置成输入,必须先向端口写1
SCL = 1;
askflag = 0;
delayNOP();   
if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志askflag
    askflag = 1;
    SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: IICSendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//-------------------------------------------------------------------
void IICSendByte(uchar ch)
 
{
   unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位

while(n--)

if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
   {
  SDA = 1;    // 传送位1
SCL = 1;
    delayNOP();
// SDA = 0;
SCL = 0; 
   }
else
{  
SDA = 0;    // 否则传送位0
SCL = 1;
delayNOP();
   SCL = 0;
}
ch = ch<<1;    // 数据左移一位
}
}
//-------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
uchar tdata=0;
while(n--)
{
   SDA = 1;
   SCL = 1;
   tdata =tdata<<1;     //左移一位
    if(SDA == 1)
  tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
else 
  tdata = tdata&0xfe;   // 否则数据的最后一位置0
   SCL = 0;
 }

 return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: DAC_PCF8591
// 入口参数: slave_add从机地址,n要发送的数据个数
// 函数功能: 发送n位数据子程序
//-------------------------------------------------------------------
void DAC_PCF8591(uchar controlbyte,uchar w_data)
{    

iic_start();                    // 启动I2C
delayNOP();

IICSendByte(PCF8591_WRITE);     // 发送地址位
check_ACK();                    // 检查应答位
    if(askflag == 1)
 { 
SystemError = 1;
return;                     // 若非应答,置错误标志位
     }
    IICSendByte(controlbyte&0x77); //Control byte 
check_ACK();                    //检查应答位
    if(askflag == 1)
 { 
SystemError = 1;
return;                    // 若非应答,置错误标志位
 }
    IICSendByte(w_data);        //data byte
check_ACK();                  // 检查应答位
    if(askflag == 1)
 { 
SystemError = 1;
     return;   // 若非应答表明器件错误或已坏,置错误标志位SystemError
 }
iic_stop();         // 全部发完则停止
delayNOP();
delayNOP();
delayNOP();
delayNOP();
}
//-------------------------------------------------------------------
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
void ADC_PCF8591(uchar controlbyte)

    uchar idata receive_da,i=0;

iic_start();

IICSendByte(PCF8591_WRITE); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}

IICSendByte(controlbyte); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}

    iic_start();                //重新发送开始命令
    IICSendByte(PCF8591_READ); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
 
    IICreceiveByte();   //空读一次,调整读顺序
    slave_ACK();        //收到一个字节后发送一个应答位

while(i<4)
{  
  receive_da=IICreceiveByte();
  receivebuf[i++]=receive_da;
  slave_ACK();       //收到一个字节后发送一个应答位
}
slave_NOACK();       //收到最后一个字节后发送一个非应答位
iic_stop();
}
//-------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主程序
//-------------------------------------------------------------------
main()
{

    cxtx_btl();
    delay(10);                 //延时
  while(1)
  {  uchar i,sbuf;
 if(RI==1)
 {
  RI=0;
    sbuf=SBUF;
if(sbuf==0xFE)
{
    iicInit();               //I2C总线初始化
    ADC_PCF8591(0x04);

if(SystemError == 1)   //有错误,重新来
  {
    iicInit();   //I2C总线初始化
ADC_PCF8591(0x04);
  }
   for(i=1;i<=250;i++)  
   { 
              iicInit();   //I2C总线初始化
      ADC_PCF8591(0x04);
  send_char(receivebuf[0]);
  send_char(receivebuf[1]);
    send_char(receivebuf[2]);
  send_char(receivebuf[3]);
   }
   iicInit();               //I2C总线初始化  
    DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
   if(SystemError == 1)   //有错误,重新来
    {
    iicInit();   //I2C总线初始化
 DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
    }         

      //delay(50);                       //延时
 }
  }
   }
}



--------------------编程问答-------------------- 我最后的目的就是把数据写到数据库里,然后把位移画到picturebox里面,怎么才能完成啊?着急中,网高手相助,感激不尽 --------------------编程问答-------------------- 通信都实现了,绘图容易了
http://download.csdn.net/detail/veron_04/2368159
http://download.csdn.net/detail/veron_04/1817028
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,