初学者关于51单片机串行口发送数据时的一些问题
时间:10-02
整理:3721RD
点击:
在单片机串口采用中断方式发送数据时,发送完完数据之后TI才置1,而中断是TI置1之后才发生的,那为什么在中断函数中才有SBUF=a?不是数发送数据之后TI才置1吗?那为什么在中断函数中才发送数据呀?
下面附上源程序:(程序意思是:按下矩阵键盘,单片机发送一个对应数据(1-16)给上位机)
#include<reg52.h>
#define uchar unsigned char
uchar temp,num;
void init();
void delay(uchar);
void keyscanf();
void main()
{
init();
while(1)
{
keyscanf();
}
}
void init()
{
TMOD=0x20;
TH1=0xf3;
TL1=0xf3;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void ser() interrupt 4
{
SBUF=num;
TI=0;
ES=0;
}
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscanf()
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77:num=0x01;ES=1;break;
case 0x7b:num=0x02;ES=1;break;
case 0x7d:num=0x03;ES=1;break;
case 0x7e:num=0x04;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xb7:num=0x05;ES=1;break;
case 0xbb:num=0x06;ES=1;break;
case 0xbd:num=0x07;ES=1;break;
case 0xbe:num=0x08;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xd7:num=0x09;ES=1;break;
case 0xdb:num=0x10;ES=1;break;
case 0xdd:num=0x11;ES=1;break;
case 0xde:num=0x12;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xe7:num=0x13;ES=1;break;
case 0xeb:num=0x14;ES=1;break;
case 0xed:num=0x15;ES=1;break;
case 0xee:num=0x16;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
}
下面附上源程序:(程序意思是:按下矩阵键盘,单片机发送一个对应数据(1-16)给上位机)
#include<reg52.h>
#define uchar unsigned char
uchar temp,num;
void init();
void delay(uchar);
void keyscanf();
void main()
{
init();
while(1)
{
keyscanf();
}
}
void init()
{
TMOD=0x20;
TH1=0xf3;
TL1=0xf3;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void ser() interrupt 4
{
SBUF=num;
TI=0;
ES=0;
}
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscanf()
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77:num=0x01;ES=1;break;
case 0x7b:num=0x02;ES=1;break;
case 0x7d:num=0x03;ES=1;break;
case 0x7e:num=0x04;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xb7:num=0x05;ES=1;break;
case 0xbb:num=0x06;ES=1;break;
case 0xbd:num=0x07;ES=1;break;
case 0xbe:num=0x08;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xd7:num=0x09;ES=1;break;
case 0xdb:num=0x10;ES=1;break;
case 0xdd:num=0x11;ES=1;break;
case 0xde:num=0x12;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(5);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xe7:num=0x13;ES=1;break;
case 0xeb:num=0x14;ES=1;break;
case 0xed:num=0x15;ES=1;break;
case 0xee:num=0x16;ES=1;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
}
这个我知道,我不是问程序的功能,而是程序中串行输出的疑惑,不过还是谢谢
