?? 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
==================================================================*/
/*數(shù)據(jù)采集是雙緩沖的,采集的數(shù)據(jù)放在ad_val和cool_temp中,
而外部讀取的是在ad_val_bk和cool_temp_bk中。這為保證了數(shù)據(jù)
的一致性,并且對數(shù)據(jù)進(jìn)行修正成為可能。*/
UINT ad_val;
UINT cool_temp;
UINT ad_val_bk;
UINT cool_temp_bk;
BYTE cool_temperature[2];/*將cool_temp_bk中的值轉(zhuǎn)換成實(shí)際值*/
/*實(shí)際室溫值=
cool_temperature[1] +
cool_temperature[0]/16.0 */
static BYTE reset_flag = 0;/*復(fù)位信號。非0時系統(tǒng)將復(fù)位*/
/*
*
*/
void data_sample()/*采集AD數(shù)據(jù)和室溫數(shù)據(jù)*/
{
ad_val = read_ad();
cool_temp = read_ds_data();
}
/*將數(shù)據(jù)拷貝到后備緩沖區(qū)中,并且修正以供外部取用*/
void cp_temp()
{
EA=0;
/* copy to buffer */
ad_val_bk = ad_val;
cool_temp_bk=cool_temp;
/*修正*/
/*轉(zhuǎn)換*/
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){/*等待復(fù)位*/
reset_flag = 0;/*清復(fù)位信號*/
while(1){}
}
}while(1);
}
/* 命令幀中斷處理函數(shù) */
/* 執(zhí)行時間<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:/* 復(fù)位 */
if(RXdata[3] != 0x1f)
break;
reset_flag = 1;
ctransmit();
break;
case 0x02:/* 獲取AD7703數(shù)據(jù)及室溫數(shù)據(jù) */
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -