你的位置: 首页> 家电弱电> 单片机

字符和数据之间的转换

2016-11-25 17:20:53 |人围观 | 评论:

  我们学串口通信的应用主要是实现单片机和电脑之间的信息互发,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面我们就做一个简单的例程,实现单片机串口调试助手发送的数据,在我们开发板上的数码管上显示出来。

#include

sbit ADDR3 = P1^3; //LED选择地址线3

sbit ENLED = P1^4; //LED总使能引脚

unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[6] = { //数码管

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

unsigned char T0RH = 0; //T0重载值的高字节

unsigned char T0RL = 0; //T0重载值的低字节

unsigned char RxdByte = 0; //串口接收到的字节

void ConfigTimer0(unsigned int ms);

void ConfigUART(unsigned int baud);

void main ()

{

P0 = 0xFF; //P0口初始化

ADDR3 = 1; //选择数码管

ENLED = 0; //LED总使能

EA = 1; //开总中断

ConfigTimer0(1); //配置T0定时1ms

ConfigUART(9600); //配置波特率为9600

while(1)

{ //将接收字节在数码管上以十六进制形式显示出来

LedBuff[0] = LedChar[RxdByte & 0x0F];

LedBuff[1] = LedChar[RxdByte >> 4];

}

}

void ConfigTimer0(unsigned int ms) //T0配置函数

{

unsigned long tmp;

tmp = 11059200 / 12; //定时器计数频率

tmp = (tmp * ms) / 1000; //计算所需的计数值

tmp = 65536 - tmp; //计算定时器重载值

tmp = tmp + 31; //修正中断响应延时造成的误差

T0RH = (unsigned char)(tmp >> 8); //定时器重载值拆分为高低字节

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; //清零T0的控制位

TMOD |= 0x01; //配置T0为模式1

TH0 = T0RH; //加载T0重载值

TL0 = T0RL;

ET0 = 1; //使能T0中断

TR0 = 1; //启动T0

}

void ConfigUART(unsigned int baud) //串口配置函数,baud为波特率

{

SCON = 0x50; //配置串口为模式1

TMOD &= 0x0F; //清零T1的控制位

TMOD |= 0x20; //配置T1为模式2

TH1 = 256 - (11059200/12/32) / baud; //计算T1重载值

TL1 = TH1; //初值等于重载值

ET1 = 0; //禁止T1中断

ES = 1; //使能串口中断

TR1 = 1; //启动T1

}

void LedScan() //LED显示扫描函数

{

static unsigned char index = 0;

P0 = 0xFF; //关闭所有段选位,显示消隐

P1 = (P1 & 0xF8) | index; //位选索引值赋值到P1口低3位

P0 = LedBuff[index]; //相应显示缓冲区的值赋值到P0口

if (index < 5) //位选索引0-5循环,因有6个数码管

index++;

else

index = 0;

}

void InterruptTimer0() interrupt 1 //T0中断服务函数

{

TH0 = T0RH; //定时器重新加载重载值

TL0 = T0RL;

LedScan(); //LED扫描显示

}

void InterruptUART() interrupt 4

{

if (RI) //接收到字节

{

RI = 0; //手动清零接收中断标志位

RxdByte = SBUF; //接收到的数据保存到接收字节变量中

SBUF = RxdByte; //接收到的数据又直接发回,这叫回显-"echo",以提示用户输入的信息是否已正确接收

}

if (TI) //字节发送完毕

{

TI = 0; //手动清零发送中断标志位

}

}

  大家在做这个实验的时候,有个小问题要注意一下。因为我们STC89C52RC下载程序是使用了UART串口下载,下载完程序后,程序运行起来了,可是下载软件最后还会通过串口发送一些额外的数据,所以程序刚下载进去不是显示00,而可能是其他数据。大家只要把开关关闭,重新打开一次就好了。

  细心的同学可能会发现,在串口调试助手发送选项和接收选项处,还有个“字符格式发送”和“字符格式显示”,这是什么意思呢?

  先抛开我们使用的汉字不谈,那么我们常用的字符就包含了0~9的数字、A~Z/a~z的字母、还有各种标点符号等。那么在单片机系统里面我们怎么来表示它们呢?ASCII码(American Standard Code for Information Interchange,即美国信息互换标准代码)可以完成这个使命:我们知道,在单片机中一个字节的数据可以有0~255共256个值,我们取其中的0~127共128个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,其具体的对应关系如下表。

  表1 ASCII表





标签:

相关内容推荐:

ASCII值

控制字符

ASCII值

字符

ASCII值

字符

ASCII值

字符

000

NUL

032

(space)

064

@

096

001

SOH

033

!

065

A

097

a

002

STX

034

"

066

B

098

b

003

ETX

035

#

067

C

099

c

004

EOT

036

$

068

D

100

d

005

END

037

%

069

E

101

e

006

ACK

038

&

070

F

102

f

007

BEL

039

'

071

G

103

g

008

BS

040

(

072

H

104

h

009

HT

041

)

073

I

105

i

010

LF

042

*

074

J

106

j

011

VT

043

+

075

K

107

k

012

FF

044

076

L

108

l

013

CR

045

-

077

M

109

m

014

SO

046

078

N

110

n

015

SI

047

/

079

O

111

o

016

DLE

048

0

080

P

112

p

017

DC1

049

1

081

Q

113

q

018

DC2

050

2

082

R

114

r

019

DC3

051

3

083

S

115

s

020

DC4

052

4

084

T

116

t

021

NAK

053

5

085

U

117

u

022

SYN

054

6

086

V

118

v

023

ETB

055

7

087

W

119

w

024

CAN

056

8

088

X

120

x

025

EM

057

9

089

Y

121

y

026

SUB

058

:

090

Z

122

z

027

ESC

059

;

091

[

123

{

028

FS

060

<

092

/

124

|

029

GS

061

=

093

]

125

}

030

RS

062

>

094

^

126

~

031

US

063

?

095

_

127

DEL