⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.c

📁 基于CAN总线通讯的AD7710数摸转换芯片的摸拟量的采集程序
💻 C
字号:
/* module.c
 *
 * main program
 * only for AD7710 module
 *						2002/3/28
 */ 

#include "type.h"
#include <reg52.h>
#include <intrins.h>

#include "version.h"
#include "link.h"
#include "sja.h"
#include "ad7710.h"
#include "watchdog.h"
#include "delay.h"
#include "exp.h"






/*==================================================================
		Main
==================================================================*/

/*数据采集是双缓冲的,采集的数据放在ad_val和cool_temp中,
而外部读取的是在ad_val_bk和cool_temp_bk中。这为保证了数据
的一致性,并且对数据进行修正成为可能。*/
UINT ad_val[2];/* 2 channels */
UINT cool_temp;

UINT ad_val_bk[2];
UINT cool_temp_bk;


BYTE cool_temperature[2];/*将cool_temp_bk中的值转换成实际值*/
	/*实际室温值=
	 cool_temperature[1] + 
	cool_temperature[0]/16.0 */

static BYTE reset_flag = 0;/*复位信号。非0时系统将复位*/


/*对AD7710的两个通道的设定参数存放在下面的结构中*/
struct ad7710_ch ad7710_channel[2]={{1,7,1,0x07,0xD0},{1,7,1,0x07,0xD0}};


/*
 *
 */
void data_sample()/*采集AD数据和室温数据*/
{ 
	/* attention: gain range is 0~7 */
 
	/* self calibration,channel number,scale,unipolar,50Hz

		cutoff = 10 000 000/(512*50) = 0x0186
	*/ 

	/* ---------------channel 0--------------- */
	set_mode(0,&ad7710_channel[0]);
	/*wait 100 ms for new value available*/

	ad_val[0]=read_ad();

	/* ---------------channel 1-------------- */
	set_mode(1,&ad7710_channel[1]);

	/*wait 100 ms for new value available*/

	ad_val[1]=read_ad();


	/*-------------------------*/
	cool_temp = read_ds_data();

}
/*将数据拷贝到后备缓冲区中,并且修正以供外部取用*/
void cp_temp()
{
	EA=0;
	ad_val_bk[0]=ad_val[0];
	ad_val_bk[1]=ad_val[1];

	cool_temp_bk=cool_temp;

	/*修正*/

	/*转换*/
	cool_temperature[0] = cool_temp_bk;
	cool_temperature[1] = (cool_temp_bk >> 8)&0x0f;

	EA=1;
}


void main()
{
	BYTE p0val;
	BYTE baud;
	/* disable interrupt */
	EA=0;

	/* P0~P3 port */

	/* set interrupt */
	IE=0x01;
	IP=0x01;
	TCON=0x01;/* falling_edge */

	/* read address */
	HC245G = 0;
	p0val = P0;
	HC245G = 1;


	/* reset watch dog and do some read/write */
	init_watchdog();	
 
	/* SJA init and send first frame*/
	CANCS=1;/* select sja */
	switch(p0val&0xc0){
	case 0x00:
		baud=0xc3;
		break;
	case 0x40:
		baud=0xc9;
		break;
	case 0x80:
		baud=0xd3;
		break;
	case 0xc0:
		baud=0xe7;
		break;
	}
	init_sja(p0val&0x3f,baud);

	/* init 7710 */


	/* open external interrupt */
	EA=1;

	/* initial end */

	/* normal working cycle */
	do{
		clear_watchdog();

		/* TODO: Add your code here */
		data_sample();/* update our data */
		cp_temp();

		if(reset_flag){/*等待复位*/
			reset_flag = 0;/*清复位信号*/
			while(1){}
		}
	}while(1);
}
   
/* 命令帧中断处理函数 */
void sja_receive_int() interrupt 0 using 0
{
	BYTE i;
	BYTE reg;
	BYTE can_status; 

	EA=0; /*disable all external interrupts*/

	reg=read_sja(4);
	write_sja(4,0x00);
	can_status=receive();
	read_sja(3);

	if(can_status==0x00)/* is command frame */
	{
		BYTE ch = RXdata[3];

		for(i=0;i<=4;i++){
			TXdata[i]=RXdata[i];
		}
		TXdata[1]+=0x40;
		TXdata[3]+=0x40;/*封装返回帧头*/

		switch(RXdata[4])
		{
		case 0x00:/* 复位 */
			if(RXdata[3] != 0x1f)
				break;
			reset_flag = 1;
			ctransmit();
			break;
		case 0x02:/* 获取AD7710数据及室温数据 */
			if(ch>=2) break;/*通道号错,不处理*/
			TXdata[5]=ad_val_bk[ch];
			TXdata[6]=_iror_(ad_val_bk[ch],8);
			TXdata[7] = cool_temperature[0];
			TXdata[8] = cool_temperature[1];

			ctransmit();
			break;
		case 0x03:/* 设置放大倍数 */
			if(ch != 0x1f) break;
			TXdata[5] = ad7710_channel[0].scale;/*返回旧值*/
			TXdata[6] = ad7710_channel[1].scale;
			ad7710_channel[0].scale = RXdata[5];
			ad7710_channel[1].scale = RXdata[6];

			ctransmit();
			break;
		case 0x30:/* 版本号查询 */
			TXdata[5]=MAIN_VERSION;
			TXdata[6]=SUB_VERSION;

			ctransmit();
			break;
		case 0x01:/* 可用命令查询 */
			TXdata[5]=0x00;
			TXdata[6]=0x01;
			TXdata[7]=0x02;
			TXdata[8]=0x03;
			TXdata[9]=0x30;
			TXdata[10]=0x00;

			ctransmit();
			break;
		default:
			/* TODO: Add your code here */
			break;
		} 
	}
	write_sja(4,reg);
	EA=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -