//串口的初始化
//波特率为9600,8位数据格式,无校验,一个停止位,用查询方式发送
void SCI_Init(void)
{
SCI0BDH = 0x00;
SCI0BDL = 0x41; //波特率=BUSCLK/(16*BR[12:0])=38400 , BUSCLK=40MHz 14400_0xae 38400_0x41 230400_0x0b
SCI0CR2 = 0x2C; //发送,接收允许,接收采用中断方式
}
//将8位二进制数转换为相应的ASCII字符
unsigned char Digit_ASCII(unsigned char temp)
{
if(temp>=0x0A)//如查temp有两位,如11,则转换为B
temp = temp + 'A' - 0x0A;//'A'=65, 0x0A=10,
else
temp = temp + '0'; //temp为数字0~9, 只有1位
return temp;
}
//发送单个字符,下面这两个函数均可以
void SCI_SendChar(unsigned char ch)
{
while(SCI0SR1_TC == 0); //keep waiting when not empty
SCI0DRL = ch;
}
//或者
void SCI_SendChar(unsigned char ch)
{
while(SCI0SR1_TDRE == 0); //keep waiting when not empty
SCI0DRL = ch;
}
//通过SCI发送字符串
void SCI_SendStr(char *str)
{
while(*str!=0)
SCI_SendChar(*str++);
}
//把一个8位数以ASCII形式通过SCI0发送去
void SCI_SendHex8(unsigned char a)
{
unsigned char b;
b = (unsigned char)(a/0x10);//取8位数的高4位,低估位为0,如0xf1/0x10 = 0xf0
b = Digit_ASCII(b);
SCI_SendChar(b);
b = (unsigned char)(a%0x10);//取8位数的低4位,高4位为0, 如0xf1%0x10 = 0x01;
b = Digit_ASCII(b);
SCI_SendChar(b);
}
//把一个8位无符号数以十进制的形式发送出去
void SCI_SendDec8u(unsigned char a)
{
unsigned char b;
b = (unsigned char)(a/100);//取百位
b = b + '0';
SCI_SendChar(b);
a = a0;
b = (unsigned char)(a/10);//取十位
b = b + '0';
SCI_SendChar(b);
b = (unsigned char)(a);//取个位
b = b + '0';
SCI_SendChar(b);
}
//将一个16位数以ASCII形式发送出去
void SCI_SendHex16(unsigned int a)
{
SCI_SendHex8((unsigned char)(a>>8));//即temp = a>>8; 先传a的高8位
SCI_SendHex8((unsigned char)a); //后传a的低8位,(一个16位的数赋值给一个8位的变量,只取低8位,高8位自动丢失)
}
//以十进制的形式发送一个16位有符号数
void SCI_SendDec16s(int a)
{
unsigned char b;
if(a&0x8000)//a为负数
{
SCI_SendChar('-');
a = ~a +1; //取绝对值
}
b = (unsigned char)(a/10000);//取万位
b = b + '0';
SCI_SendChar(b);
a = a000;
b = (unsigned char)(a/1000);//取千位
b = b + '0';
SCI_SendChar(b);
a = a00;
b = (unsigned char)(a/100);//取百位
b = b + '0';
SCI_SendChar(b);
a = a0;
b = (unsigned char)(a/10);//取十位
b = b + '0';
SCI_SendChar(b);
b = (unsigned char)(a);//取个位
b = b + '0';
SCI_SendChar(b);
}
//以十进制的形式发送一个16位无符号数
void SCI_SendDec16u(unsigned int a)
{
unsigned char b;
b = (unsigned char)(a/10000);//取万位
b = b + '0';
SCI_SendChar(b);
a = a000;
b = (unsigned char)(a/1000);//取千位
b = b + '0';
SCI_SendChar(b);
a = a00;
b = (unsigned char)(a/100);//取百位
b = b + '0';
SCI_SendChar(b);
a = a0;
b = (unsigned char)(a/10);//取十位
b = b + '0';
SCI_SendChar(b);
b = (unsigned char)(a);//取个位
b = b + '0';
SCI_SendChar(b);
}
//接收字符中断服务程序
char data;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 SCI0_Interrupt(void)
{
if(SCI0SR1_RDRF == 1)//如果是接收到了字符
{
SCI0DRL;//清除RDRF的标志位
data=SCI0DRL;//读取接收到的字符到data中
}
}
// 可打印字符串转换为字节数据
//如:"C8329BFD0E01"--> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int gsmString2Bytes(const char* pSrc,unsigned char* pDst, int nSrcLength)
{
for(int i=0; i
{
// 输出高4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
pSrc++;
// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= *pSrc - 'A' + 10;
}
pSrc++;
pDst++;
}
// 返回目标数据长度
returnSrcLength / 2;
}
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char*pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
for(int i=0; i
{
// 输出低4位
*pDst++ = tab[*pSrc >> 4];
// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];
pSrc++;
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nSrcLength * 2;
}
来自: http://blog.csdn.net/dlutxie/article/details/6709482