51单片机串口用数组接收字符串程序怎么写?

51单片机串口用数组接收字符串程序怎么写?,第1张

对于固定的数据,可以通过顺序判断来识别用if或switch语句来判决即可

通过串口中断,每次进入把SBUF的值赋给T,通过判决、累加NUM的值最终取得冒号后面的数值(不知楼主是否是要最后的数值)

void UART_Int(void) interrupt 4

{

static uchar NUM = 0

uchar T

if(RI == 1)

{

RI = 0

T = SBUF//接收串口数据

switch(T)//如果是按 value":0的顺序读进的话会最终触发NUN=7的条件

{

case 'v':

NUM = 1

break

case 'a':

if(NUM == 1)

{

NUM = 2

}

else

{

NUM = 0

}

break

case 'l':

if(NUM == 2)

{

NUM = 3

}

else

{

NUM = 0

}

break

case 'u':

if(NUM == 3)

{

NUM = 4

}

else

{

NUM = 0

}

break

case 'e':

if(NUM == 4)

{

NUM = 5

}

else

{

NUM = 0

}

break

case '"':

if(NUM == 5)

{

NUM = 6

}

else

{

NUM = 0

}

break

case ':':

if(NUM == 6)

{

NUM = 7

}

else

{

NUM = 0

}

break

default:

if(NUM == 7)

{

LED = T //LED 为全局变量

}                       //把最后的数据传给LED

NUM = 0

break

}

}

}

我的程序的一部分,供参考

//主流程

void

main(void)

{

//系统初始化

SCON

=

0x50

//串口方式为1,SM2=

0,TB8=

1

PCON

=

0x80

//

SMOD=1

TMOD

=

0x22

//设定定时器0/1的工作模式为方式2

//设置T0中断的定时时间为1/7200毫秒

TH0

=

0x00

TL0

=

0x00

//设置异步串口的波特率

//TH1

=

0x0f4

//OSC

=

11.0592MHz

bps

=

4800

SMOD=1

//TL1

=

0x0f4

TH1

=

0x0fd

//OSC

=

11.0592MHz

bps

=

19200

SMOD=1

TL1

=

0x0fd

//设置中断优先级,T0中断为高优先级中断,其他为低优先级中断

IP

=

0x02

//

设置中断优先级--T0为高优先级,其他低

ET0

=

1

//定时器0中断

ES

=

1

//串行接口中断

EA

=

1

//系统中断允许

TR0

=

1

//启动定时器0

TR1

=

1

......................

//串口接收中断处理程序

//发送采用查询处理

void

SerialComm(void)

interrupt

4

{

_pReceive[_cReceive]

=

SBUF

_cReceive

++

if(_cReceive

>=

RecBuffSize)

_cReceive

=

0

RI

=

0

}

//串口发送一个字节

//senddata:需要发送的数据

void

SendOneByte(unsigned

char

senddata)

{

ES

=

0

TI

=

0

SBUF

=

senddata

while(TI

==

0)

TI

=

0

ES

=

1

}

#include <reg52.h>

bit Flag //串口接收到字符的标志

unsigned char UartChar

void InitUART(void)

void SendByte(unsigned char dat)

void SendStr(unsigned char *s)

void main (void)

{

InitUART() //串口初始化

Flag = 0

while (1)

{

if(Flag == 1)

{

Flag = 0

SendByte(UartChar)

if(UartChar == '\r')

{

SendByte('\n')

}

}

}

}

/*---------------------------- 串口初始化--------------------------------------------------------------*/

void InitUART(void)

{

SCON = 0x50 // SCON: 模式 1, 8-bit UART, 使能接收

TMOD |= 0x20 // TMOD: timer 1, mode 2, 8-bit 重装

TH1 = 0xFD // TH1: 重装值 9600 波特率 晶振 11.0592MHz

TR1 = 1 // TR1: timer 1 打开

EA= 1 //打开总中断

ES= 1 //打开串口中断

}

/*------------------------------- 发送一个字节---------------------------------------*/

void SendByte(unsigned char dat)

{

SBUF = dat

while(!TI)

TI = 0

}

/*------------------- 发送一个字符串------------------------------------------*/

void SendStr(unsigned char *s)

{

while(*s != '\0') //字符串是否发送完,

{

SendByte(*s)

s++

}

}

/*----------------串口中断程序----------------------------------------*/

void UART_SER (void) interrupt 4 //串行中断服务程序

{

if(RI) //判断是接收中断产生

{

RI=0 //标志位清零

UartChar = SBUF //读入缓冲区的值

Flag = 1 //把值输出到P1口,用于观察

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11034007.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存