51单片机c语言数据处理程序,8051单片机C语言数据采集程序

/8051单片机TLC1549数据采集程序源代码

//单片机:At89S52本文引用地址:http://www.eepw.com.cn/article/201612/325242.htm

//连接类型:232 |485 接口

//校验方式:checksum

//开发环境:keil C

#i nclude #i nclude #i nclude "iic.h"

#define uchar unsigned char

#define uint unsigned int

uint Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理

sbit TEST_CAP_VOL_CRLT=P1^0;//用于控制外部继电器

sbit PWM_Pin=P3^7;//PWM输出

sbit IrDA_in_Pin=P1^0;//红外脉冲输入检测脚

bit PWMFlag=0;

uchar OLD_TH0,OLD_TL0;

#define MAXCMD_LENGTH 7

#define AD_VOL_PER 1.04058 //正常采集时的电压校准值

#define AD_Loop_PickVol_PER 1.04058 //CD4051循环采集时的电压校准值

sbit WDTRST=0xA6;//At89S5x看门狗寄存器

sbit ADCLK=P2^0;

sbit ADOUT=P2^1;

sbit ADCS=P2^2;

//--------------------------

/************CD4051---8选1模拟开关芯片*****************/

/*

|------------------------------------------------------|

| 4 2 1 |

|-----------------------------------------------|------|

|端口 | INH C B A | | |

|------ 7 6 5 4 3 2 1 0 | 正值 | 取反 |

| 通道 |--------------------------------|-------|------|

|------|...............|8 4 2 1 | | |

|------|---------------|----------------|-------|------|

| 0 |0 0 0 0 0 0 0 0 | 0x00 | 0xff |

| 1 |0 0 0 0 0 0 1 0 | 0x02 | 0xf7 |

| 2 |0 0 0 0 0 1 0 0 | 0x04 | 0xfb |

| 3 |0 0 0 0 0 1 1 0 | 0x06 | 0xf3 |

| 4 |0 0 0 0 1 0 0 0 | 0x08 | 0xfd |

| 5 |0 0 0 0 1 0 1 0 | 0x0A | 0xf8 |

| 6 |0 0 0 0 1 1 0 0 | 0x0C | 0xf9 |

| 7 |0 0 0 0 1 1 1 0 | 0x0e | 0xf1 |

|---------------------------------------|-------|------|

*/

uchar CD4051_NUM[]={0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0e}; //0~7编码

sbit CD4051_A=P1^1;

sbit CD4051_B=P1^2;

sbit CD4051_C=P1^3;

sbit CD4051_INH=P1^4; //CD4051_INH为1时,,所有通导都不导通

bit CD4051_Vol_Conver_Flag=0; //0时为正常采集,1为CD4051循环采集

//--------------------------

//LED显示

//--------------------------

uchar LedCount=0;

uchar LED_BIT[5]; //用于显示的每一位数据码的内容

uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80};//选择显示位

//--------------------------------------------------------

void SendByte(unsigned char word)

{

TI=0;

SBUF=word;

while(TI==0);

TI=0;

}

uchar ComBuf[MAXCMD_LENGTH];//用于保存串口的数据

/*---少量延时---*/

void delay(uint t)

{

uint i=0;

for(;i<=t;i++);

}

void Pluckdelay(uint t)

{

uint i=0,j;

for(;i<=t;i++)

for(j=1;j<=1000;j++);

}

/*=================================

ComBuf[5]加入CheckSUM校验码

算法:0x01+not(字节1+字节2+...+字节N)

=================================*/

void SetCheckSUM()

{

ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);

}

/*=============================================================

检测上位机发送来的ComBuf[5]checksum校验码和计算后的是否相等

正确则返回:1

错误则返回:0

==============================================================*/

bit ISCheckSUM()

{

uchar crc;

crc=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);

if(ComBuf[5]==crc)

return 1;

else

{

ComBuf[1]=crc;//如果错误,则返回计算后得到的CHECKSUM校验码

ComBuf[2]=ComBuf[5];//返回原来上位机发送来的CHECKSUM校验码

return 0;

}

}

/*-----------------------------------

* *

* 等待接收上位机发来的指令 *

* *

-------------------------------------*/

void WaitComm()

{

uchar n=0;

RI=0;

while (1)

{

while(!RI);//等接收数据

//-----------------

ComBuf[n]=SBUF;

RI=0;

// SBUF=ComBuf[n];

if (ComBuf[n]==0x7e) break;//接收到结束符则退出

if (n>=MAXCMD_LENGTH)

n=0;//接收10个字节,如果还没有接收到0x7e结束符,就重

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值