snifer

[原创]AD7450在地震监测中的应用

0
阅读(9454)

最近,很忙。。。。。。。

跟一个山西的公司合作开发了一个地震预测报警的传感器,其中涉及商业机密,我只写一下我负责的编码问题,欢迎大家讨论。

其中还有很多部件,核心呢就是ADI公司的AD7540,我本人非常推崇ADI的产品,在选型会上,我坚决强烈推荐这款产品,事实证明我的眼光还是不错的,呵呵。。。。。

在实际的开发过程中用到了转换控制器ADuC812,来控制AD7450,用 tmr2程序来触发1sps。

用中断0触发电源的打开和闭合。

具体程序如下:

#include <stdio.h>
#include <ADuC812.h>

 

sbit SS = P3^5;
sbit LED = P3^4;
unsigned char ADH,ADL; ADC的结果
void UART_Init()
{
 TMOD = 0x20;
 TH1 = 0xFD;
 TL1 = 0xFD;
 SCON = 0x52;
 TR1 = 1;
}
void UART_sendchar(unsigned char c)
{
 while(!TI);
 TI = 0;
 SBUF = c;
}
void SPI_Init()
{
 SPICON = 0x38;配置SPI的港口,Fosc / 4,CPHA = 0,CPOL = 1;
 
}
unsigned char SPI_read_byte()
{
 unsigned char dat=0x11;
 SPIDAT = dat; //spi  启动接收
 while(!ISPI); //等待spi
 ISPI = 0;
 return SPIDAT;
}
void ADC_NormalRead() //ADC普通模式
{
 SS = 0;
 ADH = SPI_read_byte();
 ADL = SPI_read_byte();
 SS = 1;
}
void ADC_PowerDown() //ADC关模式
{
 SS = 0;
 ADH = SPI_read_byte();
 SS = 1;
}
void ADC_PowerUp()  //ADC 开模式
{
 ADC_NormalRead();    //虚拟读
}
void tmr2_interrupt () interrupt 5 //tmr2
{
 static unsigned int cc = 1000;
 TF2 = 0;
 cc--;
 if(!cc)    //ADC in 1 SPS
 {
  cc = 1000;
  LED ^= 1;
  ADC_NormalRead();
  UART_sendchar(ADH); //转换结果
  UART_sendchar(ADL);
 }
   
   
}
void int0_interrupt () interrupt 0 //int0
{
 unsigned char i,j;
 static flag = 0;
 ET2 = 0;
 for(i=0;i<200;i++)
  for(j=0;j<200;j++)
   ;
 if(!flag)  //关模式
 {
  flag = 1;
  LED = 1;
  ADC_PowerDown();
  UART_sendchar(0xDD);
 }
 else   //Power-Up Mode
 {
  flag = 0;
  LED = 0;
  ADC_PowerUp();
  UART_sendchar(0xAA);
  ET2 = 1;
 }
}
 
void main()
{
 SPI_Init();
 UART_Init();
 ET2 = 1;
 
 RCAP2H = 0xFC; 
 RCAP2L = 0x66;
 TH2 = 0xFC;
 TL2 = 0x66;  
 EX0 = 1;
 IT0 = 1;  //enable int0
 EA = 1;
 T2CON = 0x04; //1KHZ,自动读
 while(1);
}
程序中参考了AD7450的硬件接口,研究了很久,查了很多资料,我负责的这部分已经交工,等待其他各工种跟进了,欢迎大家探讨!!!