標題: 關于兩個單片機通信中接收方設置問題 [打印本頁]

作者: wh132987    時間: 2021-3-20 10:48
標題: 關于兩個單片機通信中接收方設置問題
先說一下目的:兩個單片機,發(fā)送方稱為A,接收方稱為B,F(xiàn)在是想通過A的物理按鍵發(fā)送給B一個指令,讓其開始計時,并輸出相應的字符串到串口助手上面,然后通過按下B的物理按鍵停止計時,并輸出相應的字符串給串口助手顯示。
目前遇到的情況是指令發(fā)送,開始計時并輸出相應的字符串到串口助手上面,這些都可以實現(xiàn)。但是停止計時按鍵按下的時候卻出現(xiàn)了問題,不發(fā)送并且數(shù)碼管顯示也出現(xiàn)了異常(圖1)

以下是接收方B的單片機代碼。

#include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定義頭文件
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void printf_String();
void printf_String1();
unsigned  char num1=0;           // 存放接收到的1個字節(jié)的數(shù)據(jù)

        uchar time ;
int temp;int temp1=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽
uchar yi,er,san,si;
uint num;

uchar data_L, data_H;
uchar data_0, b;

uchar flag=0;

sbit k4 = P3^3;
sbit k3 = P3^2;
/********************************************************************
* 名稱 : Delay()
* 功能 : 延時
* 輸入 : i
* 輸出 : 無
***********************************************************************/
void delay(uchar i)         //延時函數(shù)
{
  uint j,k;
  for(j=i;j>0;j--)
    for(k=500;k>0;k--);
}

/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/

void display(uchar yi,uchar er,uchar san,uchar si) //顯示函數(shù)
{

   P2=table[yi];
   P41 = 0;
   delay(5);
   P41 = 1;

   P2=table[er];
   P42 = 0;
   delay(5);
   P42 = 1;

   P2=table[san];
   P44 = 0;
   delay(5);
   P44 = 1;

   P2=table[si];
   P45 = 0;
   delay(5);
   P45 = 1;
}

void printf_String(void)
{        char strTempA[5];
        char strTempB[5];
        char strTempC[5];
        char strTempD[5];
    int c=0;
        int d=0;
  sprintf(strTempA,"%d",temp);
        sprintf(strTempB,"%d",temp1);
        sprintf(strTempC,"%d",c);
        sprintf(strTempD,"%d",d);

        printf ("開始時間:%s%s:%s%s  ",strTempC,strTempD,strTempB,strTempA);  
}

void printf_String1(void)
{        
  char strTempE[5];
        char strTempF[5];
        char strTempG[5];
        char strTempH[5];
   int e =0;
        int f =0;
    sprintf(strTempE,"%d",temp);
        sprintf(strTempF,"%d",temp1);
        sprintf(strTempG,"%d",e);
        sprintf(strTempH,"%d",f);
        
        printf ("結束時間:%s%s:%s%s ",strTempG,strTempH,strTempF,strTempE);
        printf ("所用的時間為:%s%s:%s%s\n ",strTempG,strTempH,strTempF,strTempE);
}




/***********************


                串口初始化


**************************/
void UART_init(void)
{                  
        // 下面代碼設置定時器2
        T2H  = 0xFD;        // 波特率:9600 /22.1184MHZ,1T
        T2L  = 0xC0;        // 波特率:9600 /22.1184MHZ,1T
        AUXR = 0x15;    // 0001 0101,T2R=1啟動T2運行,T2x12=1,定時器2按1T計數(shù),S1ST2=1
        // 下面代碼設置定串口1
        SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接收)
        // 下面代碼設置中斷
        ES   = 1;                // 開串口1中斷
        EA   = 1;                // 開總中斷
        TI=1;  


}
/***********************

                主函數(shù)

**************************/

void main()
{
           P0M0=0X00;P0M1=0X00;
        delay(5);
        P1M0=0X00;P1M1=0X00;
        delay(5);
        P2M0=0X00;P2M1=0X00;
        P3M0=0X00;P3M1=0X00;
        P4M0=0X00;P4M1=0X00;    //        雙端模式。用于數(shù)碼管的顯示



        TH0=0x0D8;
        TL0=0x0F0;
        
        IT0=1;                       // 外中斷0設置為下降沿觸發(fā)
        EX0=1;                 // 開外中斷0
                                          

        
        IT1=1;//外中斷1設置為下降沿觸發(fā)
        EX1=1;//開外中斷1
        
        EA=1;
        ET0=1;
        TI=1;

        UART_init();
        
        while(1){
         display(yi,er,temp1,temp);
         
        }
}  

/*********發(fā)送一個字節(jié)******/
void send_byte(uchar by)
{

    SBUF = by;
    while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里
    TI = 0;       //在這里將TI清零
}

/*********發(fā)送一個字符串*********/
void send_string(uchar *p)
{
     while(*p!= '\0')
         {
        send_byte(*p);
        p++;
         }
}
void UART1(void) interrupt 4  // 串行口1中斷函數(shù)
//com6
{
        if(TI)
        {
                TI = 0;                        
        }
        if(RI)
        {        PX1=1;
                RI = 0;
                num1 = SBUF;
                 //num1++;
                SBUF = num1;           // 啟動數(shù)據(jù)發(fā)送過程
                 if(SBUF=='*')
                 {        
                    //UART_init();
                         // send_string("w1");
                         TR0=1;
                     delay(100);
                         printf_String();
                         delay(100);
                        
                         //printf_String1();
                         delay(100);  
                        
                          
                 }
                 
                        
        }
}




void TIME0(void) interrupt 1
{

TH0 = 0x0D8;
TL0 = 0x0F0;//定時10ms

time++;

if(time==50)//0.5秒到

{

  time=0;

  temp++;

  if(temp==10)

  {
     temp=0;
     temp1=temp1+1;
  }   

}
}



/*******外中斷1**************/
/*void init2(void) interrupt 2
{
        if(k4==0){
        TR0=0;
                delay(50);
        //printf_String();
        
        }
        
} */


還請各位大佬指教一下,問題出現(xiàn)在了哪里?





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1