这一段代码是c51实现自发自收字符串,让动态数码管实现由00000到00009显示的代码,但是接收字符串似乎出了问题,数码管一直显示默认的数值11111,请问哪里出了问题?
#include <reg51.h>
unsigned int T_count=0;//定时器计数
unsigned int L_count=0;//数码管计数 led
unsigned int len=0,rec_len=5;//接受缓冲区长度,显示长度
unsigned int i=0,j=0;//i用于动态数码管循环,
//j用于替换send_num[]第五位的循环,实现00000到00009
unsigned int L_receive[]={1,1,1,1,1,1,1,1,1,1};//接收缓冲
unsigned char gongyin[] = //共阴极字库 0-9
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9
unsigned char send_num[]="00000A";//A为截止字符
unsigned char char_num[]="0123456789";
//用于send_num[]第五位的替换,实现00000到00009
//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void delay_10us(unsigned int ten_us)
{//延时10us
while(ten_us--);
}
void smg_display(unsigned int i_num,i_location)
{//动态数码管显示函数
switch(i_location)
{
case 7: LSC=1;LSB=1;LSA=1;break;
case 6: LSC=1;LSB=1;LSA=0;break;
case 5: LSC=1;LSB=0;LSA=1;break;
case 4: LSC=1;LSB=0;LSA=0;break;
case 3: LSC=0;LSB=1;LSA=1;break;
case 2: LSC=0;LSB=1;LSA=0;break;
case 1: LSC=0;LSB=0;LSA=1;break;
case 0: LSC=0;LSB=0;LSA=0;break;
}
P0=gongyin[i_num];//传送段选数据
delay_10us(100);//延时一段时间,等待显示稳定
P0=0x00;//消音
}
void dingshi() interrupt 1
{
T_count++;
}
void recerive() interrupt 4
{
//中断式接收
if(RI)
{
RI=0;
if(SBUF!='A')
{
L_receive[len]=(unsigned int)(SBUF-'0');//str转int
len++;
}
else if (SBUF=='A')
{
rec_len=len-1;//由于前面接收到'A'后len又++了一次,所以这里-1
len=0;//len清零,等待下一轮发送
}
}
if(TI)
TI=0;
}
void Send_str(char *p)
{//查询式发送
while(*p!='\0')
{
SBUF=*p;
while(!TI);
TI=0;
p++;
}
}
void main()
{
//T0定时器初始化,对应中断号为1
TMOD|=0x02;//T0定时器 方式2
TH0=0x38;//初值设定 a=56 1s=100000us=200*5000 200 = 256-56
TL0=0x38;
TR0=1;//启动定时器 TCON
EA=1;//enable all
ET0=1;//enable T1
//串行通信方式1初始化
//T1定时器相关
TMOD|=0x20;//T1定时器 方式2
TH1=0xfa;//初值设定,波特率4800
TL1=0xfa;
PCON=0;//SMOD=0 波特率不加倍
ES=1;//串口中断
TR1=1;//启动定时器T1
SCON=0x50;//0101000 通信方式1 点对点 允许接收 无视第9位 TX RX初值0
while(1)
{
if(T_count==5000)
{ //查询式发送
send_num[4]=char_num[j];//改变第5位,实现00000到00009
Send_str(send_num);
j++;
if (j==10)
{
j=0;
}
T_count=0;
}
for(i=0;i<rec_len;i++)
{
smg_display(L_receive[i],i);
}
}
}