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