⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wireless.c

📁 at89s51加上ptr2000模块实现短距离无线通信
💻 C
字号:


#include "wireless.h"

/* 定时器0中断服务子程序 */
void timer() interrupt 1 using 2
{   
    Flag_Delay5ms = 0;
    TH0 = -5000/256;
    TL0 = -5000%256;	
}

void main(void)
{
    ClearT_buf();
    ClearR_buf();
    TXEN = 0;                   //初始为接收状态
    PWR = 1;                	//正常工作模式
    CS = 0;                 	//选择频道0
    EA=0;
    	
    /* 11.0592MHz下,设置串行口9600波特率,工作方式1
        8位数据位,1位停止位,无奇偶校验,*/
    TMOD = 0x21;                //定时器1工作模式1,定时器0工作模式2	
    SCON = 0x50;                //串行口工作方式1,REN=1
    PCON = 0x00;            	//SMOD=0

    TL1 = 0xfd;
    TH1 = 0xfd;	
    TR1=1;                      //定时器1开始计时	
    
    PT0 = 1;                    //定时器0高优先级
    TH0 = -5000/256;        	//5ms
    TL0 = -5000%256;
    	
    IE = 0x90;                  //EA=1,ES=1:打开串口中断
    
    while (1) 
    {
        if (Flag_ReqSend)       //收到“请求发送”指令
    	{
            TXEN = 1;           //改变为发射状态
            Delay5ms();     	//延时5ms
            GetData();      	//采集数据
            Send(); 			//发送
            Flag_ReqSend = 0;
            SendOver();         //通知PC机发送结束
            TXEN = 0;           //重设为接收状态
    	}
        else if (Flag_ReqReSend)    //收到“请求重发”指令
    	{
            TXEN = 1;           //改变为发射状态
            Delay5ms();     	//延时5ms
            Send(); 			//重发
            Flag_ReqReSend = 0;
            SendOver();         //通知PC机发送结束
            TXEN = 0;           //重设为接收状态
        }		
    }
}

/* 串口中断服务子程序 */
void serial ( ) interrupt 4 using 1 
{
    RI = 0 ;
    /* 判断是否收到字符'$',其数值为0x24,置开始接收标志位*/
    if ((!Flag_StartRec) && (SBUF == 0x24))
    {
        Flag_StartRec = 1;	
    }		

    if  (Flag_StartRec)
    {
        if  (rCount <5)
    	{
            r_buf[rCount] = SBUF;
            rCount ++;		
    	}
        /* 判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位 */
        if ((r_buf[rCount -1] == 0x2A)||(rCount  == 5))
    	{
            rCount  = 0;		
            Flag_StartRec = 0;
            if (r_buf[2] == REQ_SEND)       //收到“请求发送”指令
    		{
                Flag_ReqSend = 1;
    		}
            if (r_buf[2] == REQ_RESEND)     //收到“请求重发”指令
    		{
                Flag_ReqReSend = 1;	
    		}
    	}
        else
            ClearR_buf();
    }		
}

void ClearT_buf(void)
{   
    uchar xdata k ;
    for (k=0;k++;k<11)
    {
        t_buf[k] = 0;
    }	
}

void ClearR_buf(void)
{   
    uchar xdata k ;
    for (k=0;k++;k<5)
    {
        r_buf[k] = 0;
    }	
}

void Delay5ms(void)
{
    TR0=1;
    ET0=1;
    while( Flag_Delay5ms);	
    ET0 = 0;    				
    TR0 = 0;	
    Flag_Delay5ms = 1;
}

//采集数据函数经过简化处理,取固定的7个字节数据
void GetData(void)
{
    Data[0]=DATA0;
    Data[1]=DATA1;
    Data[2]=DATA2;
    Data[3]=DATA3;
    Data[4]=DATA4;
    Data[5]=DATA5;
    Data[6]=DATA6;
}

//单片机端发送数据函数
void Send(void)
{
    uchar xdata j = 0;
    uchar xdata len = 0;
    uchar xdata CheckSum = 0 ;
    t_buf[0]=0x24;          	//起始位
    t_buf[1]=0x07;              //7个数据字节
    len=t_buf[1];
    CheckSum = CheckSum + len;
    for ( j=0;j++;j<len)
    {
        t_buf[j+2] = Data[j];
        CheckSum = CheckSum + t_buf[j+2];
    }
    t_buf[9] = CheckSum;        //校验和字节
    t_buf[10] = 0x2A;           //停止位
    
    for (j=0;j++;j<11)
    {
        TI =0 ;
        SBUF = t_buf[j];	
        while ( TI ==0 );
        TI =0 ;	
    }
}

//通知PC机端发送结束函数
void SendOver(void)
{
    TI =0 ;
    SBUF = 0x24;	
    while ( TI ==0 );
    TI =0 ;			
    SBUF = 0x01;	
    while ( TI ==0 );
    TI =0 ;	
    SBUF = SEND_OVER;           //通知PC机端“发送结束”	
    while ( TI ==0 );
    TI =0 ;	
    SBUF = 0x99;                //校验和字节	
    while ( TI ==0 );
    TI =0 ;		
    SBUF = 0x2A;	
    while ( TI ==0 );
    TI =0 ;		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -