找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1555|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

關(guān)于兩個(gè)單片機(jī)通信中接收方設(shè)置問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
先說(shuō)一下目的:兩個(gè)單片機(jī),發(fā)送方稱為A,接收方稱為B,F(xiàn)在是想通過(guò)A的物理按鍵發(fā)送給B一個(gè)指令,讓其開始計(jì)時(shí),并輸出相應(yīng)的字符串到串口助手上面,然后通過(guò)按下B的物理按鍵停止計(jì)時(shí),并輸出相應(yīng)的字符串給串口助手顯示。
目前遇到的情況是指令發(fā)送,開始計(jì)時(shí)并輸出相應(yīng)的字符串到串口助手上面,這些都可以實(shí)現(xiàn)。但是停止計(jì)時(shí)按鍵按下的時(shí)候卻出現(xiàn)了問(wèn)題,不發(fā)送并且數(shù)碼管顯示也出現(xiàn)了異常(圖1)

以下是接收方B的單片機(jī)代碼。

#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個(gè)字節(jié)的數(shù)據(jù)

        uchar time ;
int temp;int temp1=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽(yáng)
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()
* 功能 : 延時(shí)
* 輸入 : i
* 輸出 : 無(wú)
***********************************************************************/
void delay(uchar i)         //延時(shí)函數(shù)
{
  uint j,k;
  for(j=i;j>0;j--)
    for(k=500;k>0;k--);
}

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

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 ("開始時(shí)間:%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 ("結(jié)束時(shí)間:%s%s:%s%s ",strTempG,strTempH,strTempF,strTempE);
        printf ("所用的時(shí)間為:%s%s:%s%s\n ",strTempG,strTempH,strTempF,strTempE);
}




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


                串口初始化


**************************/
void UART_init(void)
{                  
        // 下面代碼設(shè)置定時(shí)器2
        T2H  = 0xFD;        // 波特率:9600 /22.1184MHZ,1T
        T2L  = 0xC0;        // 波特率:9600 /22.1184MHZ,1T
        AUXR = 0x15;    // 0001 0101,T2R=1啟動(dòng)T2運(yùn)行,T2x12=1,定時(shí)器2按1T計(jì)數(shù),S1ST2=1
        // 下面代碼設(shè)置定串口1
        SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接收)
        // 下面代碼設(shè)置中斷
        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設(shè)置為下降沿觸發(fā)
        EX0=1;                 // 開外中斷0
                                          

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

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

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

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

/*********發(fā)送一個(gè)字符串*********/
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;           // 啟動(dòng)數(shù)據(jù)發(fā)送過(guò)程
                 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;//定時(shí)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();
        
        }
        
} */


還請(qǐng)各位大佬指教一下,問(wèn)題出現(xiàn)在了哪里?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表