问:关于串口的问题?
下面的程序在运行程序时,连续给他发6不同个数,但是6个数码管总是显示发送的同一数。这是为什么?请指点一下。
#include<reg51.h>
unsigned char temp[6];
unsigned char flag;
unsigned char code table[] ={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f
};
void Intin(void); //串口初始化声明
void delay( unsigned int z )
{
unsigned int x, y;
for (x=z; x>0; x--)
for (y=110; y>0; y--);
}
void main(void)
{
Intin(); //串口初始化
while(1)
{
P2 = 0xfe;
P0 = table[temp[5]]; /*最低位*/
delay(1);
P2 = 0xfd;
P0 = table[temp[4]];
delay(1);
P2 = 0xfb;
P0 = table[temp[3]];
delay(1);
P2 = 0xf7;
P0 = table[temp[2]];
delay(1);
P2 = 0xef;
P0 = table[temp[1]];
delay(1);
P2 = 0xdf;
P0 = table[ temp[0] ]; /*最高位*/
delay(1);
if ( flag == 1 )
{
ES = 0;
flag =0;
SBUF = 0xff;
while(!TI);
TI = 0;
ES = 1;
}
}
}
/*********************************************************
函 数 名:Intin()
功 能:串口初始化
说 明:设置串口工作方式 1方式()1的波特率 =(2SMOD/32)?(T1溢出率)
波特率9600,晶振11.0592 定时器工作方式2自动装8位
调 用:无
入口参数:无
还 回 值:无
***********************************************************/
void Intin(void)
{
TMOD = 0x20; /*设置定时器工作方式标志*/
TH1 = 0xfd;
TL1 = TH1;
TR1 = 1;
REN = 1; /*允许串口接收位*/
SM0 = 0;
SM1 = 1; /*设置串口工作方式标志*/
EA = 1; /*开总中断*/
ES = 1; /*开定时器中断*/
}
/*********************************************************
函 数 名: string()
功 能:串口中断
说 明:接受从机发送的信息
调 用:无
入口参数:无
还 回 值:无
***********************************************************/
void string(void) interrupt 4
{
unsigned char i;
for (i=0; i<6; i++)
{
RI = 0;
temp [i]= SBUF;
}
flag = 1;
}
[解决办法]
中断程序有点问题,51不像ARM可以设置串口中断字节数
for (i=0; i<6; i++)
{
RI = 0;
temp [i]= SBUF;
}
极有可能读的是一个值
[解决办法]
中断函数有误,每次只能接收一个字节。
[解决办法]
主函数中改一段:
.....
if( flag == 1 )
{
flag =0;
SBUF = 0xff; //发送
}
.....
void string(void) interrupt 4
{
if(RI) //接收中断事件
{
static unsigned char i;
RI = 0;
temp[i++] = SBUF;
if(i>=6){i=0;flag=1;}
}
else //发送中断事件
{
TI=0;
}
}