⑴ 51單片機串口通信如何把SBUF收到的ASCII碼轉換為字元
接收時加個轉碼處理。假設你上位機發送的是文本格式的十六進制數據,那麼下位機處理需要:
字元處理,temp = SBUF; if ((temp>='0')&&(temp<='9')) temp -= '0'; else if ((temp>='A')&&(temp<='F')) temp = temp - 'A' + 10; else if ((temp>='a')&&(temp<='f')) temp = temp - 'a' + 10; else temp = 0;
每兩個字元拼接成1位元組數據,數組中第偶數個為higher、下一個為lower,然後output = higher << 8 + lower;
最好加個超時通訊結束處理。
⑵ 初學單片機 請問一下ascii碼0123456789是什麼
我們常用的字母數字標點符號在單片機中都是以二進制數形式存儲的,每個符號對應一個不大於127的數,這就是ASCI碼,如0的ASCI碼是48即十六制0x30,1是0x31
⑶ 請問怎麼用51單片機編程將2進制數轉化為ASCII碼,並且在1602上顯示出來
如果是ascii碼表內的符號值,那麼ascii值本身就可以認為是
16進制的(因為進制只是給人看的,單片機只有2進制,沒有ascii
和
hex
之分),但如果是hex值,經過ascii發送後,需要接收解出數值,那麼可以用這個函數:
uchar
ascii_tohex(uchar
ascii_data)
//ascii
轉
hex
函數
{
uchar
hex_data=0;
//定義
hex變數存儲轉換結果
if(ascii_data>='0'
&&
ascii_data<='9')
hex_data=ascii_data-'0';
//若
轉換內容為
字元'0-9',則轉成對應數字0-9
else
if(ascii_data>='a'
&&
ascii_data<='f')
hex_data=ascii_data-'a'+10;
//若
轉換內容為
字元'a-f',則轉成數字10-15
else
if(ascii_data>='a'
&&
ascii_data<='f')
hex_data=ascii_data-'a'+10;
//若
轉換內容為
字元'a-f',則轉成數字10-15
return
hex_data;
//返回轉換結果,非以上字元,不在hex(0-f)范圍內,默認0
}//
⑷ 單片機的ASCII碼的奇偶校驗位該如何設置
「8」的ASCLL碼為:70
(十進制)=
0011
1000
(二進制)
「B」的ASCLL碼為:102(十進制)=
0100
0010(二進制)
書上說了低7位表示本身編碼,第8位做奇偶校驗
奇偶校驗規則:編碼中1的個數為奇數則為奇校驗,為偶數則為偶校驗
所以「8」的奇校驗ASCLL碼為**0**0111000B(添0,使得1的個數為奇數),偶校驗ASCLL碼為**1**0111000B(添1,使得1的個數為偶數)
同理「B」也類似
⑸ 單片機BCD碼如何轉換為ASCII碼
單片機BCD可利用查表進行轉換為ASCⅡ碼,這是最簡單的,程序流程如下圖:
單片機(Microcontrollers)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
⑹ 怎麼用單片機編寫一段程序將若干十六進制數轉換為ASCII碼
不知你要的是C語言的還是匯編的,都給你吧
C語言的:
#include <REG51.H>
typedef unsigned char uchar;
#define NUMBER 10
uchar BufferIn[NUMBER]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x1a,0x1b};//16進制數存放區
uchar BufferOut[2*NUMBER]; //ASCII碼存放區
////////////////////////////////////////////////////////////////
//功能: 將多位元組16進制數轉換為ASCII字元
//入口: x:待轉換16進制數,x>=0且x<=F
//出口: 返回轉換完成後的ASCII碼字元數據,返回0為失敗
////////////////////////////////////////////////////////////////
uchar GetASCII(uchar x)
{
if(x>0x0f)
{
return 0;
}
if(x>9)
{
return ('A'+x-10);
}
return ('0'+x);
}
////////////////////////////////////////////////////////////////
//主程序
////////////////////////////////////////////////////////////////
void main()
{
uchar i;
for(i=0;i<NUMBER;i++)
{
BufferOut[i*2] = GetASCII(BufferIn[i]/0x10);
BufferOut[i*2+1] = GetASCII(BufferIn[i]%0x10);
}
while(1);
}
匯編的:
;說明: LOOP1循環為預設10個16進制數內容的初始化程序,作為示例
ORG 0000H
LJMP START
ORG 0100H
START: MOV R2, #10 ;預置10個16進制數
MOV R0, #20H ;16進制數存放起始地址
MOV A, #12H
LOOP1: MOV @R0, A
ADD A, #13H
INC R0
DJNZ R2,LOOP1 ;循環10次送10個數
;以上至START為初始化內存,預送10個位元組的數據
MOV R0, #20H ;16進制數存放起始地址
MOV R1, #30H ;ASCII數存放起始地址
MOV R2, #10 ;轉換10個位元組
LCALL HEXTOASC ;調用轉換子程序
JMP $
;=======================================================
;HEXTOASC:將多位元組16進制數轉換為ASCII字元子程序
;入口: (R0)=16進制數存放起始地址指針
; (R2)=位元組數
;出口: (R1)=轉換完成後的ASC字元存放起始地址指針
;演算法說明:0~9:(ASCII碼為30H~39H)+90H後調整後無變化,結果
; 為9xH,再加40H為0DxH,調整操作+60H後正好為3xH;
; A~F:(ASCII為41H~46H),+90H後為9xH,調整操作+06H後
; 為01H~06H,再加40H調整後不變,正好為41H~46H;
;=======================================================
HEXTOASC:
MOV A, @R0
SWAP A
ANL A, #0FH ;處理高4位
ADD A, #90H
DA A
ADDC A, #40H
DA A
MOV @R1, A ;保存高4位
INC R1
MOV A, @R0
ANL A, #0FH ;處理低4位
ADD A, #90H
DA A
ADDC A, #40H
DA A
MOV @R1, A ;保存低4位
INC R1 ;下一個16進制數
INC R0
DJNZ R2, HEXTOASC
RET
END
⑺ 單片機中十六進制數轉換為ASCII碼,那麼兩者之間有什麼聯系
如果是ascii碼表內的符號值,那麼ascii值本身就可以認為是
16進制的(因為進制只是給人看的,單片機只有2進制,沒有ascii
和
hex
之分),但如果是hex值,經過ascii發送後,需要接收解出數值,那麼可以用這個函數:
uchar
ascii_tohex(uchar
ascii_data)
//ascii
轉
hex
函數
{
uchar
hex_data=0;
//定義
hex變數存儲轉換結果
if(ascii_data>='0'
&&
ascii_data<='9')
hex_data=ascii_data-'0';
//若
轉換內容為
字元'0-9',則轉成對應數字0-9
else
if(ascii_data>='a'
&&
ascii_data<='f')
hex_data=ascii_data-'a'+10;
//若
轉換內容為
字元'a-f',則轉成數字10-15
else
if(ascii_data>='a'
&&
ascii_data<='f')
hex_data=ascii_data-'a'+10;
//若
轉換內容為
字元'a-f',則轉成數字10-15
return
hex_data;
//返回轉換結果,非以上字元,不在hex(0-f)范圍內,默認0
}//