📄 module.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 + -