MSP430驱动单总线程序

2019-07-23 16:29发布

/********************************************************************//*主系统时钟为8MHZ*                                               *//********************************************************************/#include"msp430x16x.h"#define   uint unsigned int#define   uchar unsigned charuint 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 charuint 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;  }  }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。