1. 程式人生 > >串列埠傳送,除錯用賊方便

串列埠傳送,除錯用賊方便

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)
    {}
}