51单片机典型应用开发范例大全第30章

#include "top.h"
if(DPS2_POLL_IND_DX_OUT())
/*--------检测到主站输出数据-----------*/
{
DPS2_CON_IND_DX_OUT();
/*--------取指针,取长度,存数据----------*/
user_output_buffer_ptr=DPS2_OUTPUT_UPDATE();
for(i=0;ioutp_data_len;i++)
{
(*((out_byte)+i))=(*(((UBYTE SPC3_PTR_ATTR*)user_output_buffer_ptr)+i));
}
}
#include "top.h"
for(i=0;iinp_data_len;i++)
{
*(((UBYTE SPC3_PTR_ATTR*)user_input_buffer_ptr)+2*i)=
(UBYTE)(in_word[i]&0xff);
in_word[i]>>=8;
*(((UBYTE SPC3_PTR_ATTR*)user_input_buffer_ptr)+2*i+1)=
(UBYTE)(in_word[i]&0xff);
}
user_input_buffer_ptr=DPS2_INPUT_UPDATE();/*取得下一次发送数据时的输入数据缓冲区指针*/
#include
/************************函数声明***********************/
void init_spc3(void); //初始化SPC3程序
void data_rec(void); //数据接收程序
void data_send(void); //数据发送程序
int new_prm_handle(void); //新的参数报文中断处理程序
void new_cfg_handle(void); //新的组态报文中断处理程序
void max186(void); //数据采集程序
void int0(void); //INT0中断服务子程序
/**********************主程序***********************/
void main()
{
init_spc3(); //spc3的初始化程序
EX0=1; //允许外部中断0中断
EA=1; //开总中断
data_rec(); //检测并接收主站发送数据
max186(); //数据采集程序
data_send(); //采集到的数据往主站发送
while(1) {} //等待外部中断0中断
}
#include
#include"top.h"
sbit CS=P1^1; /*p1.1为片选信号*/
sbit SCLK=P1^0; /*p1.0为串行时钟信号*/
sbit DIN=P1^2; /*p1.2为数据输入*/
sbit DOUT=P1^3; /*p1.3为数据输出*/
void ad_186(UWORD*addata)
{
UBYTE i,j,m,s,z=0;
UWORD out[8][10];
UWORD outdata=0;
/*---------数据暂存单元清零程序----------------*/
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
out[i][j]=0;
}
}
/*-----------A/D转换数据采集程序--------------*/
CS=1;
SCLK=0;
for(j=0;j<10;j++)
{
s=0x8f;
z=0;
do
{
CS=0;
SCLK=0;
for(i=0;i<8;i++)
{
UBYTE indata;
indata=s;
indata=((indata<DIN=indata;
SCLK=1;
for(m=0;m<5;m++);
SCLK=0;
}
CS=1;
for(i=0;i<10;i++);
CS=0;
SCLK=1;
for(i=0;i<12;i++)
{
SCLK=1;
SCLK=0;
outdata=outdata<<1;
if(DOUT)
outdata+=1;
}
out[z][j]=outdata;
z++;
for(i=0;i<4;i++)
{
SCLK=1;
SCLK=0;
}
CS=1;
outdata=0;
s=s+0x10;
}while(s<0xff);
}
/*---------------中值滤波程序--------------------*/
for(z=0;z<8;z++)
{
UWORD a=0;
for(j

=0;j<10;j++)
{
a=a+out[z][j];
}
addata[z]=a/10;
}
}
include "top.h"
if(DPS2_GET_IND_NEW_CFG_DATA())
{
UBYTE SPC3_PTR_ATTR *cfg_ptr;
UBYTE config_data_len,cfg_result,result;
cfg_result=DPS2_CFG_FINISHED;
result=DPS_CFG_OK;
do
{
cfg_ptr=DPS2_GET_CFG_BUF_PTR(); /*组态数据的指针*/
config_data_len=DPS2_GET_CFG_LEN(); /*组态数据的长度*/
if(config_data_len!=2)
/*组态数据的长度不为2,组态错误*/
cfg_result=DPS2_SET_CFG_DATA_NOT_OK();
else
{
/*长度为2,但新的组态数据与初始化时的组态数据一样,不改变,组态完成*/
if((cfg_akt[0]==cfg_ptr[0])&&(cfg_akt[1]==cfg_ptr[1]))
result=DPS_CFG_OK;
else
{
/*如果新的组态数据与原组态数据不一样,但为13H,23H或者为11H,21H, 组态正确*/
if(((cfg_ptr[0]==0x13)&&(cfg_ptr[1])==0x23)
||((cfg_ptr[0]==0x11)&&(cfg_ptr[1])==0x21))
{
cfg_akt[0]=cfg_ptr[0];
cfg_akt[1]=cfg_ptr[1];
result=DPS_CFG_UPDATE;
}
/*不一样也不为13H,23H或者为11H,21H,则组态错误*/
else
result=DPS_CFG_FAULT;
/*如果组态正确,进入数据交换*/
if(result==DPS_CFG_UPDATE)
{
user_io_data_len_ptr=dps2_calculate_inp_outp_le--n(cfg_ptr,(UWORD)config_data_len);
if(user_io_data_len_ptr!=(DPS2_IO_DATA_LEN*)0)
{
DPS2_SET_IO_DATA_LEN(user_io_data_len_ptr);
}
else
result=DPS_CFG_FAULT;
}
}
switch(result)
{case DPS_CFG_OK:cfg_result=DPS2_SET_CFG_DATA_OK();
break;
case DPS_CFG_FAULT:cfg_result=DPS2_SET_CFG_DATA_NOT_OK();
break;
case DPS_CFG_UPDATE:cfg_result=DPS2_SET_CFG_DATA_UPDATE();
break;
}
}
while(cfg_result==DPS2_CFG_CONFLICT);
}
#include "top.h"
if(DPS2_GET_IND_NEW_PRM_DATA())
{
UBYTE SPC3_PTR_ATTR*prm_ptr;
UBYTE param_data_len,prm_result;
UBYTE ii;
prm_result=DPS2_PRM_FINISHED;
do
{
prm_ptr=DPS2_GET_PRM_BUF_PTR();
param_data_len=DPS2_GET_PRM_LEN();
if(param_data_len>7)
{
/*如果参数报文的第8个第9个字节都为AAH,则认为出错*/
if((*(prm_ptr+8)==0xAA)&&(*(prm_ptr+9)==0xAA))
prm_result=DPS2_SET_PRM_DATA_NOT_OK();
/*否则,把第8个字节以后的数据送入参数测试数据缓冲区,准备发给主站*/
else
{
for(ii=0;iiprm_tst_buf[ii]=*(prm_ptr+ii+7);
prm_result=DPS2_SET_PRM_DATA_OK()
}
}
/*如果参数报文的长度小于等于7,设置参数数据正确*/
else
prm_result=DPS2_SET_PRM_DATA_OK();
}
while(prm_result==DPS2_PRM_CONFLICT);
store_mintsdr=*(prm_ptr+3);
}

相关文档
最新文档