通过串口中断,每次进入把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口,用于观察
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)