首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

问:关于串口的有关问题

2013-01-11 
问:关于串口的问题?下面的程序在运行程序时,连续给他发6不同个数,但是6个数码管总是显示发送的同一数。这是

问:关于串口的问题?
下面的程序在运行程序时,连续给他发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;
 }
}



[解决办法]
要确保发送的内容只是数字 0-9,不是其它内空
[解决办法]
同意2楼的观点,每次中断只能接受一个字节,所以SBUF里的内容应该一直是第一个字节

热点排行