微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口通信:求解释?

串口通信:求解释?

时间:10-02 整理:3721RD 点击:

串口通信:一主机(灯亮)控制 两片从机(数码管)求解释?

主机:

#include <reg52.h>          //头文件的包含

#include <intrins.h>

#define     uchar unsigned char   

#define     uint  unsigned int

  int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中

sbit A1=P0^0;//LED灯

sbit A2=P0^1;

sbit A3=P0^2;

sbit A4=P0^3;

unsigned char  array[16];//数组 为什么是16                        

  

uchar temp;          //定义临时变量

uchar t=0;

   //延时0.1S函数

void mDelay0(int utime)

{

         int i,j,k;

         for(i=0;i<utime;i++)

         {

                   for(j=0;j<11;j++)

                   {

                            for(k=0;k<11;)

                                     k++;

                   }

         }

}

void InitUART(void)

{

         SCON  = 0x50;   

          TMOD |= 0x20;

          TH1   = 0xD0;   //这里波特率是1200?为什么没有TL1?            

   

         TR1   = 1;                  

                     

    EA    = 1;               

    ES    = 1;               

}

/*------------------------------------------------

                    发送一个字节

------------------------------------------------*/

void SendByte(unsigned char dat)

{

SBUF = dat;

while(!TI);

      TI = 0;

}

/*------------------------------------------------

                    主函数

------------------------------------------------*/

void main()

{

uchar a1,a2,a3,a4,b1,b2,b3,b4;

         InitUART();

         

          A1=0;A2=0;A3=0;A4=0; mDelay0(500);//不同的灯亮

          A1=1;A2=1;A3=1;A4=1; mDelay0(10);

          A1=0;A2=0;A3=0;A4=0; mDelay0(10);

         while(1)

         {

                                       a1=array[0];// ?

                            a2=array[1];//?

                            a3=array[2];//?

                            a4=array[3];//?

                           

                            if (array[0]==0x00)//?

                            {

                                      A1=0;

                            }

                            else

                            {

                                       A1=1;

                            }

                           

                            if (array[1]==0x00)?

                            {

                                      A2=0;

                            }

                            else

                            {

                                       A2=1;

                            }

                           

                  

                            if (array[2]==0x00)?

                            {

                                      A3=0;

                            }

                            else

                            {

                                       A3=1;

                            }

                           

                            if (array[3]==0x00)?

                            {

                                      A4=0;

                            }

                            else

                            {

                                       A4=1;

                            }

                     if(b1!=array[4])//?

                     {

                          b1=array[4];?

                      SendByte(0x01);mDelay0(1);//?

                      SendByte(b1);mDelay0(1); //?

                      }

                      if(b2!=array[6])//?

                     {

                          b2=array[6]; //?

                      SendByte(0x02);mDelay0(1); //?

                      SendByte(b2);mDelay0(1); //?

                      }

                      if(b3!=array[8]) //?

                     {

                          b3=array[8]; //?

                      SendByte(0x03);mDelay0(1); //?

                      SendByte(b3);mDelay0(1); //?

                      }

                      if(b4!=array[10]) //?

                     {

                          b4=array[10]; //?

                      SendByte(0x04);mDelay0(1); //?

                      SendByte(b4);mDelay0(1); //?

                      }

                           

         }

}

void UART_SER (void) interrupt 4 //串行中断服务程序

{

         

         if (RI) //从机没有发送数据,只有主机发送数据。这里接受的是主机发送的数据吗?

         {

                   RI = 0;

                   temp = SBUF;

              if ((temp == 0xc5) || (begin == 1))// ?0xc5什么意思

                   {

                            begin = 1; //什么作用?

                             

                         if(temp!=0xc5)//?

                              {

                                    array[t]=temp;//?

                                      

                                       

                                      t++;

                                      if(t>=13) { begin=0;t=0; }  //?

                              }

                                    

                   }

         

         }

   

}

丛机1:

#include<reg52.h>

  #include <intrins.h>

   #define     uchar unsigned char   

#define     uint  unsigned int

sbit b1=P2^0;

sbit b2=P2^1;

sbit b3=P2^2;

sbit b4=P2^3;

uchar t=0;

uchar Q1;

int begin=0;

void mDelay(int utime)

{

         int i,j,k;

         for(i=0;i<utime;i++)

         {

                   for(j=0;j<5;j++)

                   {

                            for(k=0;k<99;)

                                     k++;

                   }

         }

}

/*------------------------------------------------

                    串口初始化

------------------------------------------------*/

void InitUART  (void)

{

    SCON  = 0x50;                        

    TMOD |= 0x20;               

    TH1   = 0xD0;              

    TR1   = 1;                  // TR1:  timer 1 打开                        

    EA    = 1;                  //打开总中断

    //ES    = 1;                  //打开串口中断

}            

void main (void)

{

  int i;

  uchar a1,a2,a3;

         InitUART();

         ES=1;        

while(1)

{        //90度

    if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0

         if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1

         if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2

         if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3

         if(Q1==0x04) {a1=0x00;a2=0x74;a3=0x8f;}// 4

         if(Q1==0x05) {a1=0x00;a2=0x6d;a3=0x8f;}// 5

         if(Q1==0x06) {a1=0x00;a2=0x6f;a3=0x8f;}// 6

         if(Q1==0x07) {a1=0x00;a2=0x38;a3=0x8f;}// 7

         if(Q1==0x08) {a1=0x00;a2=0x7f;a3=0x8f;}// 8

         if(Q1==0x09) {a1=0x00;a2=0x7d;a3=0x8f;}// 9

         if(Q1==0x0a) {a1=0x06;a2=0x3f;a3=0x8f;}// 10

         if(Q1==0x0b) {a1=0x06;a2=0x30;a3=0x8f;}// 11

         if(Q1==0x0c) {a1=0x06;a2=0x5b;a3=0x8f;}// 12

         if(Q1==0x0d) {a1=0x06;a2=0x79;a3=0x8f;}// 13

         if(Q1==0x0e) {a1=0x06;a2=0x74;a3=0x8f;}// 14

         if(Q1==0x0f) {a1=0x06;a2=0x6d;a3=0x8f;}// 15

         if(Q1==0x10) {a1=0x06;a2=0x6f;a3=0x8f;}// 16

         if(Q1==0x11) {a1=0x06;a2=0x38;a3=0x8f;}// 17

         if(Q1==0x12) {a1=0x06;a2=0x7f;a3=0x8f;}// 18

         if(Q1==0x13) {a1=0x06;a2=0x7d;a3=0x8f;}// 19

         if(Q1==0x14) {a1=0x5b;a2=0x3f;a3=0x8f;}// 20

         if(Q1==0x15) {a1=0x5b;a2=0x30;a3=0x8f;}// 21

         if(Q1==0x16) {a1=0x5b;a2=0x5b;a3=0x8f;}// 22

         if(Q1==0x17) {a1=0x5b;a2=0x79;a3=0x8f;}// 23

         if(Q1==0x18) {a1=0x5b;a2=0x74;a3=0x8f;}// 24

         if(Q1==0x19) {a1=0x5b;a2=0x6d;a3=0x8f;}// 25

         if(Q1==0x1a) {a1=0x5b;a2=0x6f;a3=0x8f;}// 26

         if(Q1==0x1b) {a1=0x5b;a2=0x38;a3=0x8f;}// 27

         if(Q1==0x1c) {a1=0x5b;a2=0x7f;a3=0x8f;}// 28

         if(Q1==0x1d) {a1=0x5b;a2=0x7d;a3=0x8f;}// 29

         if(Q1==0x1e) {a1=0x4f;a2=0x3f;a3=0x8f;}// 30

         if(Q1==0x1f) {a1=0x4f;a2=0x30;a3=0x8f;}// 31

         if(Q1==0x20) {a1=0x4f;a2=0x5b;a3=0x8f;}// 32

         if(Q1==0x21) {a1=0x4f;a2=0x79;a3=0x8f;}// 33

         if(Q1==0x22) {a1=0x4f;a2=0x74;a3=0x8f;}// 34

         if(Q1==0x23) {a1=0x4f;a2=0x6d;a3=0x8f;}// 35

         if(Q1==0x24) {a1=0x4f;a2=0x6f;a3=0x8f;}// 36

         if(Q1==0x25) {a1=0x4f;a2=0x38;a3=0x8f;}// 37

         if(Q1==0x26) {a1=0x4f;a2=0x7f;a3=0x8f;}// 38

         if(Q1==0x27) {a1=0x4f;a2=0x7d;a3=0x8f;}// 39

         if(Q1==0x28) {a1=0x66;a2=0x3f;a3=0x8f;}// 40

         if(Q1==0x29) {a1=0x66;a2=0x30;a3=0x8f;}// 41

         if(Q1==0x2a) {a1=0x66;a2=0x5b;a3=0x8f;}// 42

         if(Q1==0x2b) {a1=0x66;a2=0x79;a3=0x8f;}// 43

         if(Q1==0x2c) {a1=0x66;a2=0x74;a3=0x8f;}// 44

         if(Q1==0x2d) {a1=0x66;a2=0x6d;a3=0x8f;}// 45

         

                    // 0:0000 0011

         

                   // b2=1;b3=1;               // 1:1111 0011

                   // b1=0;b4=1;                        // 2:0010 0101

                    //1              // 3:0110 0001

         

         //      P0=a1;                                     // 4:1101 0001

                                                  // 5:0100 1001

                                                  // 6:0000 1001

                                                  // 7:1110 0011

                                                  // 8:0000 0001

                                                  // 9:0100 0001

                                                  // C:0000 1110

           //  mDelay(1);                //

                  

             b2=0;b3=1;b1=1;b4=1;

             P0=a1;

                   mDelay(1);

                   b2=1;b3=0;b1=1;b4=1;

             P0=a2;

                   mDelay(1);

                   b2=1;b3=1;b1=1;b4=0;

             P0=a3;

                   mDelay(1);

           }

         

         }

              

void UART_SER (void) interrupt 4 //串行中断服务程序

{

    unsigned char temp;          //定义临时变量

   

   

           if (RI)

         {

                   RI = 0;

                   temp = SBUF;

              if ((temp == 0x02) || (begin == 1))

                   {

                            begin = 1;

                             

                         if(temp!=0x02)

                              {

                                    Q1=temp;

                                      

                                    

                                      t++;

                                      if(t>=1) { begin=0;t=0; }

                              }

                                    

                   }

         

         }                  

     }

丛机2;

  #include<reg52.h>

  #include <intrins.h>

   #define     uchar unsigned char   

#define     uint  unsigned int

sbit b1=P2^0;

sbit b2=P2^1;

sbit b3=P2^2;

sbit b4=P2^3;

uchar t=0;

uchar Q1;

int begin=0;

void mDelay(int utime)

{

         int i,j,k;

         for(i=0;i<utime;i++)

         {

                   for(j=0;j<5;j++)

                   {

                            for(k=0;k<99;)

                                     k++;

                   }

         }

}

/*------------------------------------------------

                    串口初始化

------------------------------------------------*/

void InitUART  (void)

{

    SCON  = 0x50;                          // SCON: 模式 1, 8-bit UART, 使能接收  

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装

    TH1   = 0xD0;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  

    TR1   = 1;                  // TR1:  timer 1 打开                        

    EA    = 1;                  //打开总中断

    //ES    = 1;                  //打开串口中断

}            

void main (void)

{

  int i;

  uchar a1,a2,a3;

         InitUART();

         ES=1;        

while(1)

{        //90度

    if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0

         if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1

         if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2

         if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3

         if(Q1==0x04) {a1=0x00;a2=0x74;a3=0x8f;}// 4

         if(Q1==0x05) {a1=0x00;a2=0x6d;a3=0x8f;}// 5

         if(Q1==0x06) {a1=0x00;a2=0x6f;a3=0x8f;}// 6

         if(Q1==0x07) {a1=0x00;a2=0x38;a3=0x8f;}// 7

         if(Q1==0x08) {a1=0x00;a2=0x7f;a3=0x8f;}// 8

         if(Q1==0x09) {a1=0x00;a2=0x7d;a3=0x8f;}// 9

         if(Q1==0x0a) {a1=0x06;a2=0x3f;a3=0x8f;}// 10

         if(Q1==0x0b) {a1=0x06;a2=0x30;a3=0x8f;}// 11

         if(Q1==0x0c) {a1=0x06;a2=0x5b;a3=0x8f;}// 12

         if(Q1==0x0d) {a1=0x06;a2=0x79;a3=0x8f;}// 13

         if(Q1==0x0e) {a1=0x06;a2=0x74;a3=0x8f;}// 14

         if(Q1==0x0f) {a1=0x06;a2=0x6d;a3=0x8f;}// 15

         if(Q1==0x10) {a1=0x06;a2=0x6f;a3=0x8f;}// 16

         if(Q1==0x11) {a1=0x06;a2=0x38;a3=0x8f;}// 17

         if(Q1==0x12) {a1=0x06;a2=0x7f;a3=0x8f;}// 18

         if(Q1==0x13) {a1=0x06;a2=0x7d;a3=0x8f;}// 19

         if(Q1==0x14) {a1=0x5b;a2=0x3f;a3=0x8f;}// 20

         if(Q1==0x15) {a1=0x5b;a2=0x30;a3=0x8f;}// 21

         if(Q1==0x16) {a1=0x5b;a2=0x5b;a3=0x8f;}// 22

         if(Q1==0x17) {a1=0x5b;a2=0x79;a3=0x8f;}// 23

         if(Q1==0x18) {a1=0x5b;a2=0x74;a3=0x8f;}// 24

         if(Q1==0x19) {a1=0x5b;a2=0x6d;a3=0x8f;}// 25

         if(Q1==0x1a) {a1=0x5b;a2=0x6f;a3=0x8f;}// 26

         if(Q1==0x1b) {a1=0x5b;a2=0x38;a3=0x8f;}// 27

         if(Q1==0x1c) {a1=0x5b;a2=0x7f;a3=0x8f;}// 28

         if(Q1==0x1d) {a1=0x5b;a2=0x7d;a3=0x8f;}// 29

         if(Q1==0x1e) {a1=0x4f;a2=0x3f;a3=0x8f;}// 30

         if(Q1==0x1f) {a1=0x4f;a2=0x30;a3=0x8f;}// 31

         if(Q1==0x20) {a1=0x4f;a2=0x5b;a3=0x8f;}// 32

         if(Q1==0x21) {a1=0x4f;a2=0x79;a3=0x8f;}// 33

         if(Q1==0x22) {a1=0x4f;a2=0x74;a3=0x8f;}// 34

         if(Q1==0x23) {a1=0x4f;a2=0x6d;a3=0x8f;}// 35

         if(Q1==0x24) {a1=0x4f;a2=0x6f;a3=0x8f;}// 36

         if(Q1==0x25) {a1=0x4f;a2=0x38;a3=0x8f;}// 37

         if(Q1==0x26) {a1=0x4f;a2=0x7f;a3=0x8f;}// 38

         if(Q1==0x27) {a1=0x4f;a2=0x7d;a3=0x8f;}// 39

         if(Q1==0x28) {a1=0x66;a2=0x3f;a3=0x8f;}// 40

         if(Q1==0x29) {a1=0x66;a2=0x30;a3=0x8f;}// 41

         if(Q1==0x2a) {a1=0x66;a2=0x5b;a3=0x8f;}// 42

         if(Q1==0x2b) {a1=0x66;a2=0x79;a3=0x8f;}// 43

         if(Q1==0x2c) {a1=0x66;a2=0x74;a3=0x8f;}// 44

         if(Q1==0x2d) {a1=0x66;a2=0x6d;a3=0x8f;}// 45

         

                    // 0:0000 0011

         

                   // b2=1;b3=1;               // 1:1111 0011

                   // b1=0;b4=1;                        // 2:0010 0101

                    //1              // 3:0110 0001

         

         //      P0=a1;                                     // 4:1101 0001

                                                  // 5:0100 1001

                                                  // 6:0000 1001

                                                  // 7:1110 0011

                                                  // 8:0000 0001

                                                  // 9:0100 0001

                                                  // C:0000 1110

           //  mDelay(1);                //

                  

             b2=0;b3=1;b1=1;b4=1;

             P0=a1;

                   mDelay(1);

                   b2=1;b3=0;b1=1;b4=1;

             P0=a2;

                   mDelay(1);

                   b2=1;b3=1;b1=1;b4=0;

             P0=a3;

                   mDelay(1);

           }

         

         }

              

void UART_SER (void) interrupt 4 //串行中断服务程序{

    unsigned char temp;          //定义临时变量

   

   

           if (RI)

         {

                   RI = 0;

                   temp = SBUF;

              if ((temp == 0x01) || (begin == 1))

                   {

                            begin = 1;

                             

                         if(temp!=0x01)

                              {

                                    Q1=temp;

                                      

                                       

                                      t++;

                                      if(t>=1) { begin=0;t=0; }  //?/?

                              }

                                    

                   }

         

         }                  

        尤其是每个中断函数里面都有什么作用?

找个时间 一行一行跟你说哈 !  现在忙

哇,程序好长;
while(1)
{        //90度
         if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0
         if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1
         if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2
         if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3
         if(Q1==0x04).....
这里为什么不用 else if 呢?每个值都要比较一次!?比如Q1=0,然后后面还要if 44次?
如果使用查表的方式,是不是会更好呢?

恩是的不过这段我不是很理解void UART_SER (void) interrupt 4 //串行中断服务程序
{
         
         if (RI) //从机没有发送数据,只有主机发送数据。这里接受的是主机发送的数据吗?
         {
                   RI = 0;
                   temp = SBUF;
              if ((temp == 0xc5) || (begin == 1))// ?0xc5什么意思
                   {
                            begin = 1; //什么作用?
                             
                         if(temp!=0xc5)//?
                              {
                                    array[t]=temp;//?
                                      
                                       
                                      t++;
                                      if(t>=13) { begin=0;t=0; }  //?
                              }
                                    
                   }
         
         }
   

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

网站地图

Top