找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2274|回復: 0
打印 上一主題 下一主題
收起左側

單片機雙機通訊源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:134303 發(fā)表于 2016-7-19 22:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

#include <reg52.h>
#define uchar unsigned char   //用uchar代替unsigned char
#define uint unsigned int     //用unitdaiti unsigned int
sbit P20=P2^0;        //LED輸出管腳
uchar Receive_Data[6],cNumber=0,cFlag=0;  //串口接收數據存放
uchar zhentouxulie;
uchar send0;
uchar send1;
uchar position;
uchar yiwei;
uchar biaozhi;
bit zhentou;
bit shuchu;
uchar PPM[41];         //存放一幀的高低電平信息 6個時隙的幀頭+32個時隙的信息
uchar wz;
uint bit1;
uint bit0;                                //位置控制位


void DelayMs(unsigned int Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber<Delay_MS;iNumber++)
{
     iValue=107;
     while(iValue--);
}
}

void Init_UART()                //串口初始化
{
    SCON=0x50;      //SCON:串行口工作方式1, 8-bit UART,允許串行接收位(REN=1)
    TMOD=0x21;      //TMOD:定時器1,方式2,8位自動重裝方式
    PCON=0x80;      //SMOD=1;(將串口傳送的波特率加倍)
    TH1=0xfA;       //Baud:9600  fosc=11.0592MHz
        TL1=0xfA;  
        TH0=(65536-500)/256;//賦初值定時
    TL0=(65536-500)%256;//定時500us     
        ET0=1;//開定時器0中斷  
        TR0=1;//啟動定時器0
        TR1=1;          //啟動定時器/計數器1運行
        ES=1;      //開串口中斷
        EA=1;   //開總中斷
        P20=0;
        send0=0;
        send1=0;
}

void tiaozhi()
{
                if((send0==1)&&(send1==1))
                {
                        if(wz<40)
                        {
                                if((wz==0)||(wz==7))       
                                {
                                        PPM[wz]=0;
                                        wz++;
                                }
                                else if((wz>0)&&(wz<7))
                                {
                                        PPM[wz]=1;
                                        wz++;
                                }
                                else if((wz>7)&&(wz<24))  //開始跳入數據發(fā)送
                                {         
                                                if(Receive_Data[0]&0x01) //1發(fā)送
                                                {
                                                        PPM[wz]=1;
                                                        PPM[wz+1]=0;
                                                }
                                                else                        //0發(fā)送
                                                {
                                                        PPM[wz]=0;
                                                        PPM[wz+1]=1;       
                                                }
                                        wz=wz+2;
                                        Receive_Data[0]=Receive_Data[1]>>1;               
                                }

                                else if((wz>23)&&(wz<40))  //開始跳入數據發(fā)送
                                {         
                                                if(Receive_Data[1]&0x01) //1發(fā)送
                                                {
                                                        PPM[wz]=1;
                                                        PPM[wz+1]=0;
                                                }
                                                else                        //0發(fā)送
                                                {
                                                        PPM[wz]=0;
                                                        PPM[wz+1]=1;       
                                                }
                                        wz=wz+2;
                                        Receive_Data[1]=Receive_Data[1]>>1;               
                                }
                        }
                        else if(wz==40)
                        {
                                PPM[40]=0;//輸出一個保護電平時隙
                                wz=0;
                                send0=0;
                                send1=1;
                                position=0;
                        }
           }
               
}




void main()
{
DelayMs(50);    //穩(wěn)定系統(tǒng)
Init_UART(); //初始化串口
while(1)
{
        tiaozhi();
        if((send0==0)&&(send1==0))
          {
                send0=1;
                send1=1;          
                Receive_Data[1]=0xff;
                Receive_Data[0]=0x00;
                wz=0;//編碼位置
                DelayMs(1000);
          }
}
}


void timer0() interrupt 1
{  
        TR0=0;//賦初值時,關閉定時器
           TH0=(65536-500)/256;//賦初值定時 高八位
        TL0=(65536-500)%256;//定時500us  低八位
        TR0=1;//打開定時器
                    
          if((send1==1)&&(send0==0))  //編碼完成
          {
                  if(position<41)
                {
                  if(PPM[position]==1)
                  {
                          P20=0;
                  }
                  else
                  {
                          P20=1;
                  }
                 }
                 else
                 {
                         send1=0;//發(fā)送完成
                        send0=0;
                 }
                 position++;
         }
         else
                 P20=0;//其余點亮燈


}
void UART_Routine() interrupt 4
{
   if(RI==1)//RI為接受中斷標志,可能是發(fā)送產生的中斷
{
          ES=0;      //關串口中斷
          Receive_Data[cNumber++]=SBUF;//將接受數據放入預置數組
          if(cNumber==2)
          {
                send0=1;
                send1=1;          
                cNumber=0;
                wz=0;//編碼位置
          }
          RI=0;//接受中斷標志軟件清零
          ES=1;      //開串口中斷
}
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表