多通道数据采集
--------------------编程问答-------------------- 下位机单片机程序//-----------------------函数声明,变量定义------------------------
#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 , 基础类