/********************************************************************/
/*主系统时钟为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:
回复 灰小子:
感谢分享,建议加入一些图示说明形成一篇应用笔记效果会更好~
TI中文支持网




