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

📄 module.c

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

#include "type.h"
#include <reg52.h>
#include <intrins.h>
#include "version.h"
#include "link.h"
#include "sja.h"
#include "ad7703.h"
#include "watchdog.h"
#include "delay.h"
#include "exp.h"


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

/*数据采集是双缓冲的,采集的数据放在ad_val和cool_temp中,
而外部读取的是在ad_val_bk和cool_temp_bk中。这为保证了数据
的一致性,并且对数据进行修正成为可能。*/
UINT ad_val;
UINT cool_temp;
UINT ad_val_bk;
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时系统将复位*/
/*
 *
 */
void data_sample()/*采集AD数据和室温数据*/
{
	ad_val = read_ad();

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

	/* copy to buffer */
	ad_val_bk = ad_val;
	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 */
	ADS2 = 0;
	ADS3 = 0;
	ADS1 = 0;

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

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

	/* reset watch dog and do some read/write */
	init_watchdog();	

	/* init AD7703 */
	init_ad7703();

	/* 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);

	/* 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);
}
   
/* 命令帧中断处理函数 */
/* 执行时间<20ms? */
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 */
	{
		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:/* 获取AD7703数据及室温数据 */
			if(RXdata[3] != 0x00)
				break;
			TXdata[5] = ad_val_bk;
			TXdata[6] = _iror_(ad_val_bk,8);
			TXdata[7] = cool_temperature[0];
			TXdata[8] = cool_temperature[1];

			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]=0x30;
			TXdata[9]=0x00;
			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 + -