找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2261|回复: 0
打印 上一主题 下一主题
收起左侧

单片机双机通讯源代码

[复制链接]
跳转到指定楼层
楼主
ID:134303 发表于 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))  //开始跳入数据发送
                                {         
                                                if(Receive_Data[0]&0x01) //1发送
                                                {
                                                        PPM[wz]=1;
                                                        PPM[wz+1]=0;
                                                }
                                                else                        //0发送
                                                {
                                                        PPM[wz]=0;
                                                        PPM[wz+1]=1;       
                                                }
                                        wz=wz+2;
                                        Receive_Data[0]=Receive_Data[1]>>1;               
                                }

                                else if((wz>23)&&(wz<40))  //开始跳入数据发送
                                {         
                                                if(Receive_Data[1]&0x01) //1发送
                                                {
                                                        PPM[wz]=1;
                                                        PPM[wz+1]=0;
                                                }
                                                else                        //0发送
                                                {
                                                        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);    //稳定系统
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;//发送完成
                        send0=0;
                 }
                 position++;
         }
         else
                 P20=0;//其余点亮灯


}
void UART_Routine() interrupt 4
{
   if(RI==1)//RI为接受中断标志,可能是发送产生的中断
{
          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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表