文章出處

1. 2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/**

題目要求:2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

**/

/**

步驟

接線方式:

1P0接數碼管J12,實現段選

2、譯碼器和數碼管位選輸入短接,J15+J16

3P2用來控制譯碼器的輸入

4P1是串口接收中斷的指示,P1+JP1

5、本實驗使用的晶振是11.0592

**/

//=========全局變量區============================================

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼

 

uint Received_Flag=0;//用來標志是否接收到信號

uchar ReceiveCount,Data_Received=0;//ReceiveCount是接受的條數,接收到的數據

uchar code table[]="index ";

//=========全局變量區結束========================================

 

 

 

//========函數區開始============================================

/**

    延時

**/

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在數碼管上顯示對應的值

**/

void display(uchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段選信號后,進行消影的處理

}

 

/**

    控制數碼管顯示后3位,并分解計數值

**/

void DisplayNumByOrder(uint Value){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(Value%1000/100);

       low=0; mid=1; high=1;  display(Value%100/10);

       low=1; mid=1; high=1;  display(Value%10);

}

 

void init(){      //初始化定時器T1和串口

    SCON =0x50;  //設置串口工作方式1,并打開接收中斷

    TMOD =0x20;  //設置T1工作方式2

    PCON =0x00;  //設置SMOD為串口工作方式1

    TL1 =0xf4;      

    TH1 =0xf4;     //2400bps(12MHZ的晶振)

    TR1 =1;      //開啟時鐘

    ES =1;           //開啟串口中斷允許

    EA =1;           //開啟中斷總允許

}

/**

    發送數據

**/

void SendData(uchar value){

    SBUF=value;

    while(!TI);

    TI=0;

}

/**

    處理接收到的數據

**/

void ProcessData(){

    int i=0;

    for(i=0;i<6;i++){

       SendData(table[i]);

    }

    SendData(ReceiveCount);

    SendData(':');

    SendData(Data_Received);

}

int main(){

 

    init();//初始化數據

    while(1){

       if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示

           ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。

           ProcessData();

           ES=1;

           Received_Flag=0;

       }

       //在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

       DisplayNumByOrder(Data_Received);  //在數碼管上顯示

    }

    return0;

}

 

//========函數區結束============================================

 

 

//========中斷函數區============================================

 

/**

    串口接收中斷

**/

void ser_received() interrupt 4

{

    RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來

    Data_Received=(uchar)SBUF;  //從緩沖區內讀取數據

    Received_Flag=1;  //設置已經接收到數據

    P1=~P1;

    ReceiveCount++;

}

//========中斷函數區結束==========================================

2. 16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/**

題目要求:  16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。

**/

/**

步驟

接線方式:

1P0接數碼管J12,實現段選

2、譯碼器和數碼管位選輸入短接,J15+J16

3P2用來控制譯碼器的輸入

4P1是串口接收中斷的指示,P1+JP1

5、本實驗使用的晶振是11.0592

**/

//=========全局變量區============================================

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼

 

uint Received_Flag=0;//用來標志是否接收到信號

uchar ReceiveCount,DecodeCount,Data_Received=0;//ReceiveCount是已經接收的條數,DecodeCount是已經解析的數目,Data_Received是接收到的數據

ulong NumToDisplay=0;

//=========全局變量區結束========================================

 

 

 

//========函數區開始============================================

/**

  延時

**/

void delay_1ms(uint x){

  uint i=x;

  uint j;

  for(;i>0;--i){

     for(j=110;j>0;--j);

  }

}

/**

  在數碼管上顯示對應的值

**/

void display(uchar Num)

{

  P0=NumTable[Num];

  delay_1ms(1);

  P0=0;      //送完段選信號后,進行消影的處理

}

 

/**

  控制數碼管顯示后3位,并分解計數值

**/

void DisplayNumByOrder(ulong Value){

     low=0; mid=0; high=0;  display(0);        

      low=1; mid=0; high=0;  display(0);               

      low=0; mid=1; high=0;  display(0);

     low=1; mid=1; high=0;  display(Value%100000/10000);

     low=0; mid=0; high=1;  display(Value%10000/1000);

     low=1; mid=0; high=1;  display(Value%1000/100);

     low=0; mid=1; high=1;  display(Value%100/10);

     low=1; mid=1; high=1;  display(Value%10);

}

 

void init(){    //初始化定時器T1和串口

  SCON =0x50;  //設置串口工作方式1,并打開接收中斷

  TMOD =0x20;  //設置T1工作方式2

  PCON =0x00;  //設置SMOD為串口工作方式1

  TL1 =0xf4;      

  TH1 =0xf4;     //2400bps(11.0592MHZ的晶振)

  TR1 =1;      //開啟時鐘

  ES =1;           //開啟串口中斷允許

  EA =1;           //開啟中斷總允許

}

/**

  發送數據

**/

void SendData(uchar value){

  SBUF=value;

  while(!TI);

  TI=0;

}

 

int main(){

 

  init();//初始化數據

  while(1){

     if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示

         ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。

         //ProcessData();

         ES=1;

         Received_Flag=0;

     }

     //在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

     DisplayNumByOrder(NumToDisplay);   //在數碼管上顯示

  }

  return0;

}

 

//========函數區結束============================================

 

 

//========中斷函數區============================================

 

/**

  串口接收中斷

**/

void ser_received() interrupt 4

{

  if(RI ==1){//接收到觸發中斷

     RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來

     Data_Received=(uchar)SBUF;  //從緩沖區內讀取數據

     Received_Flag=1;  //設置已經接收到數據

     if(DecodeCount==0){

         NumToDisplay=Data_Received;

         ++DecodeCount;

     }else{

         NumToDisplay =(NumToDisplay <<8)| Data_Received;//相當于原來的數乘以8,然后+現在的數

         DecodeCount++;

         if(DecodeCount ==3)                  //0..65536要接收6位的16進制

            DecodeCount =0;

     }

     P1=~P1;

     ReceiveCount++;

  }

}

//========中斷函數區結束==========================================

 

擴展題目:

1.      實現單片機雙機通信,實現單片機甲發送一個信息給單片機乙,同時在數碼管上顯示出來,單片機乙收到信息后,回復OK給單片機甲。

 

//甲機

 

   

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/**

題目要求:2400bps從計算機發送任一字節數據,當單片機收到該數據后,將其送到數碼管顯示,在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

**/

/**

步驟

接線方式:

1P0接數碼管J12,實現段選

2、譯碼器和數碼管位選輸入短接,J15+J16

3P2用來控制譯碼器的輸入

4P1是串口接收中斷的指示,P1+JP1

5、本實驗使用的晶振是11.0592

**/

//=========全局變量區============================================

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼

 

uint Received_Flag=0;//用來標志是否接收到信號

uchar ReceiveCount,Data_Received=0;//ReceiveCount是接受的條數,接收到的數據

uchar code table[]="index ";

//=========全局變量區結束========================================

 

 

 

//========函數區開始============================================

/**

    延時

**/

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在數碼管上顯示對應的值

**/

void display(uchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段選信號后,進行消影的處理

}

 

/**

    控制數碼管顯示后3位,并分解計數值

**/

void DisplayNumByOrder(uint Value){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(Value%1000/100);

       low=0; mid=1; high=1;  display(Value%100/10);

       low=1; mid=1; high=1;  display(Value%10);

}

 

void init(){      //初始化定時器T1和串口

    SCON =0x50;  //設置串口工作方式1,并打開接收中斷

    TMOD =0x20;  //設置T1工作方式2

    PCON =0x00;  //設置SMOD為串口工作方式1

    TL1 =0xf4;      

    TH1 =0xf4;     //2400bps(11.0592MHZ的晶振)

    TR1 =1;      //開啟時鐘

    ES =1;           //開啟串口中斷允許

    EA =1;           //開啟中斷總允許

}

/**

    發送數據

**/

void SendData(uchar value){

    SBUF=value;

    while(!TI);

    TI=0;

}

 

int main(){

 

    init();//初始化數據

    SendData(0x00);//發送數據

    SendData(0x01);

    SendData(0x01);

    while(1){

       if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示

           ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。

          

           ES=1;

           Received_Flag=0;

       }

       //在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

       DisplayNumByOrder(Data_Received);  //在數碼管上顯示

    }

    return0;

}

 

//========函數區結束============================================

 

 

//========中斷函數區============================================

 

/**

    串口接收中斷

**/

void ser_received() interrupt 4

{

    RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來

    Data_Received=(uchar)SBUF;  //從緩沖區內讀取數據

    Received_Flag=1;  //設置已經接收到數據

    P1=~P1;

    ReceiveCount++;

}

 

//========中斷函數區結束==========================================

 

 

 

 

//乙機

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/**

題目要求:  16進制發送一個0-65536之間的任一數,當單片機收到后在數碼管上動態顯示出來,波特率自定。

**/

/**

步驟

接線方式:

1P0接數碼管J12,實現段選

2、譯碼器和數碼管位選輸入短接,J15+J16

3P2用來控制譯碼器的輸入

4P1是串口接收中斷的指示,P1+JP1

5、本實驗使用的晶振是11.0592

**/

//=========全局變量區============================================

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數字的編碼

 

uint Received_Flag=0;//用來標志是否接收到信號

uchar ReceiveCount,DecodeCount,Data_Received=0;//ReceiveCount是已經接收的條數,DecodeCount是已經解析的數目,Data_Received是接收到的數據

ulong NumToDisplay=0;

//=========全局變量區結束========================================

 

 

 

//========函數區開始============================================

/**

    延時

**/

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在數碼管上顯示對應的值

**/

void display(uchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段選信號后,進行消影的處理

}

 

/**

    控制數碼管顯示后3位,并分解計數值

**/

void DisplayNumByOrder(ulong Value){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(Value%100000/10000);

       low=0; mid=0; high=1;  display(Value%10000/1000);

       low=1; mid=0; high=1;  display(Value%1000/100);

       low=0; mid=1; high=1;  display(Value%100/10);

       low=1; mid=1; high=1;  display(Value%10);

}

 

void init(){      //初始化定時器T1和串口

    SCON =0x50;  //設置串口工作方式1,并打開接收中斷

    TMOD =0x20;  //設置T1工作方式2

    PCON =0x00;  //設置SMOD為串口工作方式1

    TL1 =0xf4;      

    TH1 =0xf4;     //2400bps(11.0592MHZ的晶振)

    TR1 =1;      //開啟時鐘

    ES =1;           //開啟串口中斷允許

    EA =1;           //開啟中斷總允許

}

/**

    發送數據

**/

void SendData(uchar value){

    SBUF=value;

    while(!TI);

    TI=0;

}

 

int main(){

 

    init();//初始化數據

    while(1){

       if(1==Received_Flag){//當單片機收到該數據后,將其送到數碼管顯示

           ES=0;//將串口接收總中斷關閉,因為發送數據的時候,往緩沖區內寫數據也會引發串口接收中斷。

           SendData(‘o’);

SendData(‘k’);

           ES=1;

           Received_Flag=0;

       }

       //在此數據前加上一序號然后連同此數據一起發送至計算機,當序號超過255時歸零。

       DisplayNumByOrder(NumToDisplay);   //在數碼管上顯示

    }

    return0;

}

 

//========函數區結束============================================

 

 

//========中斷函數區============================================

 

/**

    串口接收中斷

**/

void ser_received() interrupt 4

{

    if(RI ==1){//接收到觸發中斷

       RI=0;//RI=1代表緩沖區內有數據,清零以便等待下次數據到來

       Data_Received=(uchar)SBUF;  //從緩沖區內讀取數據

       Received_Flag=1;  //設置已經接收到數據

       if(DecodeCount==0){

           NumToDisplay=Data_Received;

           ++DecodeCount;

       }else{

           NumToDisplay =(NumToDisplay <<8)| Data_Received;//相當于原來的數乘以8,然后+現在的數

           DecodeCount++;

           if(DecodeCount ==3)                  //0..65536要接收6位的16進制

              DecodeCount =0;

       }

       P1=~P1;

       ReceiveCount++;

    }

}

//========中斷函數區結束==========================================

 


文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()