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

📄 3539a.c

📁 实时芯片3539a的所有程序
💻 C
字号:
#include <msp430x14x.h>
#include "sfuntion.h"


#define INT1 BIT7        //P2.7
#define SDA  BIT1        //P3.1
#define SCK  BIT3        //P3.3   

extern uchar real_1[7];  
extern uchar real_2[3]; 

uchar data[7]={0x08,0x05,0x20,0x02,0x17,0x09,0x55};//实时数据 
uchar INT1_Dat[3]={0x00,0x0d7,0x090}; //报警数据

void delay5us()     //延时5us
{for(uchar i=0;i<7;i++);
}

void IO_s3539(void)    //IO初始化  
{P2DIR&=~INT1;
 P2IE|=INT1;
 P2IES|=INT1;
 P3DIR|=SDA+SCK;
 P3OUT&=~(SDA+SCK);
}

void start_s3539(void)   //Strat condition 
{ P3OUT|=SDA;
  P3OUT|=SCK;            //当sck为高时,sda有高到低的变化表示起始条件 
  delay5us();
 P3OUT&=~SDA;
 delay5us();
 P3OUT&=~SCK;
}    

void stop_s3539(void)   //stop condition
{ P3OUT&=~SDA;
  //delay5us();
  P3OUT|=SCK;
  delay5us();
  P3OUT|=SDA;
  delay5us();
  P3OUT&=~SCK;
  P3OUT&=~SDA;
}

uchar ACK_s3539(void) //s3539 acknowledge
{uchar i;
 P3DIR&=~SDA;
   _NOP();
   _NOP();
 delay5us();
 P3OUT|=SCK;
  //if(P3IN&SDA!=0)
 i=P3IN;
 delay5us();
 P3OUT&=~SCK;
 delay5us();
 P3DIR|=SDA;
 return (i&SDA);    //i=0表示应答,i=1表示没有应答
}

void w_command(uchar com) //command data writing
{uchar i;
for(i=0;i<8;i++)
{ //delay5us();
  if(com&0x80)
    P3OUT|=SDA;
  else
    P3OUT&=~SDA;
   _NOP();
   _NOP();   //  
  delay5us();
  P3OUT|=SCK;
  delay5us();
  P3OUT&=~SCK;
  com<<=1;
  
  }
}
void w_s3539(uchar com) //real-time data writing
{uchar i;
for(i=0;i<8;i++)
{ //delay5us();
  if(com&0x01)
    P3OUT|=SDA;
  else
    P3OUT&=~SDA;
   _NOP();
   _NOP();
  delay5us();
  P3OUT|=SCK;
  delay5us();
  P3OUT&=~SCK;
  com>>=1;}
}

uchar r_s3539(void) // real-time data reading
{uchar i,dat=0;
 P3DIR&=~SDA;
 for(i=0;i<8;i++)
 { delay5us();
   P3OUT|=SCK;
   dat>>=1;
  if(P3IN&SDA) 
    dat|=0x80;
   delay5us();
  P3OUT&=~SCK;
   //delay5us();
 }
 P3DIR|=SDA;
 return dat;
}

void ACK_430(void)//CPU acknowledge
{ P3OUT&=~SDA;
   //_NOP();
  // _NOP();
 delay5us();
 P3OUT|=SCK;
 delay5us();
 P3OUT&=~SCK; 
 delay5us();
}

void rst_s3539(void)
{uchar ack;
str:
  do
 { start_s3539();
   w_command(0x60);  //写入复位指令,并应答
  ack=ACK_s3539();}
  while(ack);
  w_s3539(0x03);
  ack=ACK_s3539();
  if(ack)
    goto str;
 stop_s3539();
}

void INT_s3539(void) //设置INT1为报警中断
{uchar ack;
str:
  do
 { start_s3539();
   w_command(0x62); //写入寄存器2命令
  ack=ACK_s3539();}
  while(ack);
  w_s3539(0x04); //中断模式设置
  ack=ACK_s3539();
  if(ack)
    goto str;
 stop_s3539();
}

void init_s3539(void) //初始化,并且写入实时数据,模式为默认
{uchar ack,i;
   IO_s3539();
rst: 
  do
 { rst_s3539();
   start_s3539();
   w_command(0x64);  //写入写实时数据指令,并应答
  ack=ACK_s3539();}
  while(ack);
 for(i=0;i<7;i++)     //写入实时数据
   {w_s3539(data[i]);
    ack=ACK_s3539();
 if(ack)
   goto rst;}
  stop_s3539(); 
}

void INT_Status1()
{uchar ack,i;
 sta:
do 
  {start_s3539();
   w_command(0x68);  //写入写INT1寄存器_1指令,并应答
   ack=ACK_s3539();}
  while(ack);
 for(i=0;i<3;i++)     //写入INT1寄存器_1
   {w_s3539(INT1_Dat[i]);
    ack=ACK_s3539();
 if(ack)
   goto sta;}
  stop_s3539(); 
}

void Read_realtime1(void)
{uchar ack,i;
  do
  { start_s3539();
   w_command(0x65);
   ack=ACK_s3539();}
   while(ack);
  
 for(i=0;i<7;i++)
  {real_1[i]=r_s3539();
   if(i<6)
   ACK_430();
  } 
  stop_s3539();
}

void Read_realtime2(void)
{uchar ack,i;
  do
  { start_s3539();
   w_command(0x67);
   ack=ACK_s3539();}
   while(ack);
  
 for(i=0;i<3;i++)
  {real_2[i]=r_s3539();
   if(i<2)
   ACK_430();
  } 
  stop_s3539();
}

uchar Read_status1()
{uchar ack,i;
  do
  { start_s3539();
   w_command(0x61);
   ack=ACK_s3539();}
   while(ack);
  i=r_s3539();
  return i;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -