📄 xx.c
字号:
#include <pic.h>
#include "xx.h"
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN);
main()
{
unsigned char i,k;
for(i=0;i<16;i++)
{
ser_buffer[i] = i;
}
TRISA=0X00;
TRISB=0X00;
// PORTB=0XF0;
txflag = 0;
intil();
RC0 = 0;
RC1 = 0;
while(1)
{
i = GetCommand(10);
// i = GetChar();
#if 1
// if(GetOneChar == 0x24)
if(i)
{
RB5 = 0;
DelayMain(8000);
DelayMain(8000);
//ComOutStr(RxBufffer, 6);
}
RB5 = 1;
#endif
// DelayMain(1000);
// ComOutStr(ser_buffer, 2);
// DelayMain(1000);
RB5 = 1;
// DelayMain(8000);
CLRWDT();
// DelayMain(8000);
DelayMain(8000);
//ComOutStr(ser_buffer, 4);
PutString(RxBufffer, 10);
//putch(0x54);
}
}
void Delay(unsigned int number)
{
unsigned int temp;
for(temp=0;temp<number;temp++);
}
void TXData(unsigned char *tx_data,unsigned char a)
{
unsigned char i;
unsigned int j;
for(i=0x0;i<a;i++)
{
// TRISA=0;
// RA5=1;
SPEN=1;
#if 0
TRISC=0xc0;
TXSTA=0x46;
#endif
TXSTA=0x46; /*低速模式*/
// SPBRG=0X67;//67; /*600*/
SPBRG=25;
TXIF=0;
TXREG=*tx_data;
tx_data++;
GIE=1;
PEIE=1;
SPEN=1;
TXEN=1;
for(j=0;j<10000;j++);
while(TXIF==0);
TXIF=0;
}
}
void interrupt uart(void)
{
if(RCIF==1) /* RS232接收中断 */
{
RCIF=0; /* 清中断标志 */
ser_buffer[receive_count]=RCREG; /* 接收数据并存储 */
// send232[receive_count]=RCREG; /* 接收数据存放到发送缓冲数组 */
receive_count++; /* 接收计数器加1 */
if(receive_count>7) /* 如果已经接收到8个数据 */
{
receive_count=0; /* 接收计数器清0 */
txflag=1; /* 置接收到8个数据标志 */
}
}
}
void intil(void)
{
GIE=1;
PEIE=1;
SPEN=1;
RCIE=1;
SPEN=1;
TRISC=0xc0;
// TRISC=0xF0;
// TXSTA=0x22;
// SPBRG=103;
// TXEN=1;
TXSTA=0x26; /*高速模式*/
SPBRG=129; //9600 20M
RCSTA=0x80; /* 允许串行口工作使能 */
// CREN=1; /* 允许串口连续接收数据 */
PIR1=0x00; /* 清中断标志 */
// PIE1=PIE1|0x20; /* 允许串行通讯接口接收中断使能 */
}
/* output one byte 向串口输出一个字符(非中断方式)*/
void ComOutChar(unsigned char OutData)
{
while(!TXIF) /* set when register is empty */
continue;
TXREG = OutData;
}
/*向串口输出一个字符串(非中断方式)(含长度)*/
void ComOutStr(unsigned char *Str,unsigned int strlen)
{
unsigned int k = 0;
do
{
ComOutChar(*(Str + k));
k ++;
} while(k < strlen);
}
void PutChar(unsigned char c)
{
unsigned char bitno;
#if BRATE > 1200
unsigned char dly;
#else
unsigned int dly;
#endif
INIT_PORT;
TxData = 0; /* start bit */
bitno = 12;
do
{
dly = DELAY(TX_OHEAD); /* wait one bit time */
do
/* waiting in delay loop */ ;
while(--dly);
if(c & 1)
TxData = 1;
if(!(c & 1))
TxData = 0;
c = (c >> 1) | 0x80;
} while(--bitno);
NOP();
}
unsigned char GetChar(void)
{
unsigned char c, bitno;
#if BRATE > 1200
unsigned char dly;
#else
unsigned int dly;
#endif
for(;;)
{
TimeWait = 0;
do
{
TimeWait++;
if(TimeWait >10000)
return ERROR;
}while(RxData);
while(RxData)
continue; /* wait for start bit */
dly = DELAY(3)/2;
do /* waiting in delay loop */ ;
while(--dly);
if(RxData)
continue; /* twas just noise */
bitno = 8;
c = 0;
do
{
dly = DELAY(RX_OHEAD);
do
/* waiting in delay loop */ ;
while(--dly);
c = (c >> 1) | (RxData << 7);
} while(--bitno);
// RxFlag = 1;
GetOneChar = c;
return SUCCESS;
}
}
unsigned char GetCommand(unsigned char Num)
{
unsigned char c,i;
unsigned int dly;
unsigned int TimeWait2,TimeWait3;
TimeWait2 = 0;
TimeWait3 = 0;
do
{
c = GetChar();
if(c)
{
if(GetOneChar==0x24)//判断是不是字符$
{
i = 1;
RxBufffer[0] = GetOneChar;
do
{
//dly = DELAY(3)/2;
dly = 130;//DELAY(RX_OHEAD);
do
/* waiting in delay loop */ ;
while(--dly);
//Delay(338);
c = GetChar();
RxBufffer[i] = GetOneChar;
i++;
}
while(i<Num+1);// $GPRMC
//if((RxBufffer[5] == 0x43)&&(RxBufffer[4] == 0x4D)&&(RxBufffer[3] == 0x52)) //判断是不需要的数据头,只能检测到$GPGGA
//{
return SUCCESS;
//}
}
}
TimeWait2++;
}while(TimeWait2<1000);
return ERROR;
}
void PutString(char *DataBuf,unsigned char Num)
{
unsigned int k = 0;
do
{
PutChar(*(DataBuf + k));
k ++;
} while(k < Num);
}
unsigned int HEX2BCD(unsigned char hex_data) /***hex_data(<0xff,>0)*/
{
unsigned int bcd_data;
unsigned char temp;
temp = hex_data%100;
bcd_data = ((unsigned int)hex_data)/100<<8;
bcd_data = bcd_data|temp/10<<4;
bcd_data = bcd_data|temp%10;
return bcd_data;
}
void DelayMain(unsigned int number)
{
unsigned int temp;
for(temp=0;temp<number;temp++);
}
unsigned char HexToChar(unsigned char Data) /*-转成asc码-*/
{
unsigned char Rev;
if(Data<0x0a)
{
Rev=Data+0x30;
}
else
{
Rev=Data+0x37;
}
return Rev;
}
void _delay_ms(char a) /*/毫秒级延时子函数 */
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<40;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -