TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430驱动单总线程序

/********************************************************************/

/*主系统时钟为8MHZ*                                               */

/********************************************************************/

#include"msp430x16x.h"

#define   uint unsigned int

#define   uchar unsigned char

uint numpass=0;

void ht_init()

{

  _DINT();//关闭所有中断

  _NOP(); //在保护程序之前与关中断之间最少有一步操作。

  P1DIR|=BIT0;//输输出方向

  P1OUT|=BIT0;//输出为0

}

void ht_OK()

{

  _BIS_SR(GIE);//开启所有中断

}

void delay_ms(uchar ms)//ms

{

  uchar x=0;uint y=0;

  for(x=ms;x>0;x–)

    for(y=1955;y>0;y–);

}

void delay_10us()//10us

{

  uchar x=0;

  for(x=15;x>0;x–);

}

uchar readbyte()//读一个字节

{

  uchar value=0;

  uchar i=0;

  for(i=8;i>0;i–)

  {

     value<<=1;

     while(!(P1IN&BIT1))

     {numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}

     delay_10us();

     delay_10us();

     delay_10us();

     delay_10us();

     if(P1IN&BIT1)

     {

       value|=0x01;

       while(P1IN&BIT1){numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}//等待剩余3

     }

     if(i!=7)

     {

      while(!(P1IN&BIT1)){numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}

     }

  }

  

  return value;

}

uchar ht_start(uchar *ht)//开始读取数据

{

  uchar check_value=0;

 

  uchar s[5]={0,0,0,0,0};

  ht_init();//关闭所有中断

  P1DIR|=BIT1;//输出

  P1OUT|=BIT1;

  P1OUT&=~BIT1;//输出低电平

  delay_ms(25);//输出大于18MS低电平

  P1OUT|=BIT1;//拉高等待

  delay_10us();

  delay_10us();

  delay_10us();

  P1DIR&=~BIT1;

  while(P1IN&BIT1)

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  while(!(P1IN&BIT1))

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  while(P1IN&BIT1)

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  s[0]=readbyte();

  s[1]=readbyte();

  s[2]=readbyte();

  s[3]=readbyte();

  s[4]=readbyte();

  check_value=s[0]+s[1]+s[2]+s[3];

  if(check_value!=s[4])

  {

   ht_OK();

   return 0;

  }

  else

  {

    ht[0]=s[0];

    ht[1]=s[2];

    ht_OK();

    return 1;

  }

  

}

#include"msp430x16x.h"

#define   uint unsigned int

#define   uchar unsigned char

uint numpass=0;

void ht_init()

{

  _DINT();//关闭所有中断

  _NOP(); //在保护程序之前与关中断之间最少有一步操作。

  P1DIR|=BIT0;//输输出方向

  P1OUT|=BIT0;//输出为0

}

void ht_OK()

{

  _BIS_SR(GIE);//开启所有中断

}

void delay_ms(uchar ms)//ms

{

  uchar x=0;uint y=0;

  for(x=ms;x>0;x–)

    for(y=1955;y>0;y–);

}

void delay_10us()//10us

{

  uchar x=0;

  for(x=15;x>0;x–);

}

uchar readbyte()//读一个字节

{

  uchar value=0;

  uchar i=0;

  for(i=8;i>0;i–)

  {

     value<<=1;

     while(!(P1IN&BIT1))

     {numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}

     delay_10us();

     delay_10us();

     delay_10us();

     delay_10us();

     if(P1IN&BIT1)

     {

       value|=0x01;

       while(P1IN&BIT1){numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}//等待剩余3

     }

     if(i!=7)

     {

      while(!(P1IN&BIT1)){numpass=15000;numpass–;if(!numpass){ht_OK();return 0xff;}}

     }

  }

  

  return value;

}

uchar ht_start(uchar *ht)//开始读取数据

{

  uchar check_value=0;

 

  uchar s[5]={0,0,0,0,0};

  ht_init();//关闭所有中断

  P1DIR|=BIT1;//输出

  P1OUT|=BIT1;

  P1OUT&=~BIT1;//输出低电平

  delay_ms(25);//输出大于18MS低电平

  P1OUT|=BIT1;//拉高等待

  delay_10us();

  delay_10us();

  delay_10us();

  P1DIR&=~BIT1;

  while(P1IN&BIT1)

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  while(!(P1IN&BIT1))

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  while(P1IN&BIT1)

  {numpass=15000;numpass–;if(!numpass){ht_OK();return 0;}}

  s[0]=readbyte();

  s[1]=readbyte();

  s[2]=readbyte();

  s[3]=readbyte();

  s[4]=readbyte();

  check_value=s[0]+s[1]+s[2]+s[3];

  if(check_value!=s[4])

  {

   ht_OK();

   return 0;

  }

  else

  {

    ht[0]=s[0];

    ht[1]=s[2];

    ht_OK();

    return 1;

  }

  

}

灰小子:

Ling Zhu2:

回复 灰小子:

感谢分享,建议加入一些图示说明形成一篇应用笔记效果会更好~

赞(0)
未经允许不得转载:TI中文支持网 » MSP430驱动单总线程序
分享到: 更多 (0)