串列埠傳送,除錯用賊方便
阿新 • • 發佈:2018-12-09
uart.c
/*******************************************************************************
* 檔名:uart.c
* 作 者:CLAY
* 版本號:v1.0.0
* 日 期:
* 備 注:
*
*******************************************************************************
*/
#include "config.h"
#include <string.h>
/*長整型轉化為字串*/
u8 LongToStr(long dat, u8 * str)
{
char i = 0;
u8 len = 0;
u8 buf[11]; // // 長整數最大值4294967295,轉ASCII碼後佔用10+1=11位元組(加'\0'字元)
if(dat < 0)
{
dat = -dat;
*str++ = '-';
len++;
}
do{
buf[i++] = dat%10 + '0';
dat /= 10;
}while(dat > 0);
len += i;
while(i-- > 0 )
{
*str++ = buf[i]; // 上面已經進行+0x30的處理,故此處不再處理
}
*str = '\0';
return len;
}
/*字串轉化為長整型*/
u32 StrToLong(char* str)
{
u32 result = 0;
u32 fact = 1;
u8 len = strlen(str); // 不包括字元'\0'
u8 i;
for(i=len-1; i>=0; i--)
{
result += ((str[i] - '0') * fact);
fact *= 10 ;
}
return result;
}
/*串列埠初始化*/
void UartInit() //[email protected]
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位資料,可變波特率
AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T
AUXR &= 0xFE; //串列埠1選擇定時器1為波特率發生器
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重灌方式
TL1 = 0xFD; //設定定時初值
TH1 = 0xFD; //設定定時器重灌值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
ES = 1;
}
/*傳送單位元組*/
void UartSendByte(u8 dat)
{
ES = 0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
/*傳送回車換行*/
void UartSendEnter()
{
UartSendByte(0x0D);
UartSendByte(0x0A);
}
/*傳送字串,如果結尾有\n,則後面自動加入回車換行*/
void UartSendStr(char *str)
{
u16 i;
u16 len = strlen(str);
for(i=0; i<len-1; i++) // 最後一個字元單獨處理,實現加入回車換行
{
UartSendByte(str[i]);
}
if(str[i] == '\n')
{
UartSendEnter();
}
else
{
UartSendByte(str[i]);
}
}
/*傳送數值,實則轉化為字串傳送,結尾自動加入回車換行*/
void UartSendNum(u32 dat)
{
u8 buf[11];
LongToStr(dat, buf);
UartSendStr(buf);
UartSendEnter();
}
/*傳送字串+數值*/
void UartSendStrNum(char* buf, u32 dat)
{
UartSendStr(buf);
UartSendNum(dat);
}
void HexToASCII(u16 hex, char* str)
{
u8 temp = 0;
temp = ((hex & 0xF000) >> 12);
str[0] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
temp = ((hex & 0xF000) >> 8);
str[1] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
temp = ((hex & 0xF000) >> 4);
str[2] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
temp = ((hex & 0xF000) >> 0);
str[3] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
str[4] = '\0';
}
void UartSendHex(u16 hex)
{
u8 temp[11];
HexToASCII(hex, temp);
UartSendStr(temp);
UartSendEnter();
}
void UartSendBinary(u8 dat)
{
u8 i;
u8 temp[17];
for(i=0; i<8; i++)
{
temp[i] = ((dat<<i) & 0x80) ? '1':'0';
}
temp[i] = '\0';
for(i=0; i<strlen(temp); i++)
{
UartSendByte(temp[i]);
UartSendByte(' ');
}
UartSendEnter();
}
void UartInterrupt() interrupt 4
{}
uart.h
#ifndef _UART_H
#define _UART_H
void UartInit();
void UartSendEnter();
void UartSendStr(char* str);
void UartSendNum(u32 dat);
void UartSendStrNum(char* buf, u32 dat);
void UartSendHex(u16 hex);
void UartSendBinary(u8 dat);
#endif
config.h
#ifndef _CONFIG_H
#define _CONFIG_H
#include <stc15.h>
/*變數型別重定義*/
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef char int8;
typedef int int16;
typedef long int32;
#endif
測試main函式
#include "config.h"
#include "uart.h"
void main()
{
unsigned char a=0x55;
unsigned int b=0xAB98;
unsigned long c=1234567890;
unsigned char Buf[]="歡迎使用STC15微控制器!\n"; //字串在記憶體結尾必然有一個附加字元:\0
UartInit(); // 波特率:9600 /22.1184MHZ
UartSendStr("串列埠設定完畢:123ABC\n"); // 傳送字串
UartSendStr(Buf);
UartSendNum(b); // 傳送數值
UartSendStrNum("傳送=:",c); // 傳送字串+數值
UartSendHex(b) ; // 傳送16進位制
UartSendBinary(a); // 傳送2進位制
while(1)
{}
}