微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学者关于51单片机串行口发送数据时的一些问题

初学者关于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;
                                 }
                          }
                }
}

这个我知道,我不是问程序的功能,而是程序中串行输出的疑惑,不过还是谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top