📄 newcoder071230.c
字号:
#include "msp430x14x.h"
void init(void);
void Clk_0(void);
void Clk_1(void);
void Csn_0(void);
void Csn_1(void);
void delay(unsigned int long);
void OutToPcDb(double);
unsigned char Xor(unsigned char,unsigned char);
unsigned char Data1[18]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char Data[18] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned int AData=0;
double CoderAngle=0.0;
unsigned char Order=0x00;
int Index;
void main(void)
{
unsigned char i;
init();
while(1)
{
Index=0;
Csn_1();
Clk_1();
delay(10);
Csn_0();
delay(10);
Clk_0();
delay(10);
Clk_1();
while(Index<18)
{
if((P5IN&0x20)==0x20)
Data[Index]=1;
else
Data[Index]=0;
Index++;
delay(2);
Clk_0();
delay(2);
Clk_1();
}
// Data[17]=Data1[17];
// for(i=16;i>5;i--)
// {
// Data[i]=Data1[i]^Data1[i+1];
// }
AData=2048*Data[0]+1024*Data[1]+512*Data[2]+256*Data[3]+128*Data[4]+64*Data[5]+32*Data[6]+16*Data[7]+8*Data[8]+4*Data[9]+2*Data[10]+Data[11];
CoderAngle=(double)AData/4095.0*360.0;
if(Order==0xff)
{
Order=0x00;
OutToPcDb(CoderAngle);
}
}
}
void init(void)
{
WDTCTL = WDTPW+WDTHOLD; //禁止看门狗
P5SEL&=~0x60;
P5DIR&=~0x20;
P5DIR|=0x40;
P1SEL&=~0x02;
P1DIR|=0x02;
BCSCTL1 |=0x40;
BCSCTL2 |=0xc0;
delay(1000);
ME2 |= UTXE1+URXE1; //使能Uart1的TXD/RXD
UCTL1 |= CHAR + SWRST; //8位字符,SWRST置1
UTCTL1|=SSEL0; //UCLK=ACLK
UBR01 =0xD0; //波特率19200
UBR11 =0x00;
UMCTL1 = 0x94;
P3SEL |= 0xc0;
P3DIR |= 0x40;
UCTL1 &= ~SWRST;
IE2 |= URXIE1;
_EINT();
}
void Clk_1(void)
{
P1OUT&=~0x02;
}
void Clk_0(void)
{
P1OUT|=0x02;
}
void Csn_1(void)
{
P5OUT&=~0x40;
}
void Csn_0(void)
{
P5OUT|=0x40;
}
void delay(unsigned int long temp)
{
while(temp--);
}
/************************************************************************************/
/**函数名: void OutToPcDb(double Angle) **/
/**功 能: 将采样数组输出到PC机,ASCII码接收 **/
/**返回值: 无 **/
/**参 数: double Angle **/
/************************************************************************************/
void OutToPcDb(double DataIn)
{
unsigned int i=0,j;
unsigned char ArrayTemp[5];
unsigned int AngleInt;
AngleInt = (int)(DataIn*10);
if(AngleInt>=10000)
ArrayTemp[i++] = AngleInt/10000+48;
if(AngleInt>=1000)
ArrayTemp[i++] = (AngleInt/1000)%10+48;
if(AngleInt>=100)
ArrayTemp[i++] = (AngleInt/100)%10+48;
ArrayTemp[i++] = (AngleInt/10)%10+48;
ArrayTemp[i++] = 46;
ArrayTemp[i++] = AngleInt%10 +48;
j=i;
for(i=0;i<j;i++)
{
TXBUF1=ArrayTemp[i];
while((UTXIFG1 & IFG2)==0);
}
TXBUF1=10;
while((UTXIFG1 & IFG2)==0);
}
/****************************************************************/
/**函数名: interrupt[UART1RX_VECTOR] void usart1_rx(void) **/
/**功 能: 中断服务子程序 发送接收到的数据 **/
/**返回值: 无 **/
/**参 数: 无 **/
/****************************************************************/
interrupt[UART1RX_VECTOR] void usart1_rx(void)
{
while((IFG2 & UTXIFG1)==0); //等待接收完毕
Order=RXBUF1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -