/********************************************************************/ /*主系统时钟为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; } }
|