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

📄 rs232_com.c

📁 自己调试通过的无线解码程序!支持各种无线传感器
💻 C
字号:

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//描述:
//      该程序INT0按键程序+显示程序+RS232通讯                                  &
//      按键计数显示在数码管1-2(从右至左),并且发送该数据。                  &
//      接收到的数据在数码管3-4上显示。                                        &
//      通讯波特率:19200                                                       &
//      每次收发一个字节                                                       &

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
//【声明】 作者: PIAE小组                                                      &

#include <reg52.h>
#include <intrins.h>
#include <RS232_def.h>


void INT0_Counter( void ) interrupt 0 using 1
{//INT0按键为计数按键
    EA = 0;
    Show_TX_Data++; //计数单元加1
    TXD_flag = 1;//置要发送标志位
    EA = 1;
}


void RS232_RXD( void ) interrupt 4   using 1
{//接收数据函数,在中断服务程序中调用
    EA = 0;//关闭所有中断
    ES = 0;//关闭串口
    if(RI==1)
    {
        RI = 0;
        RX_data = SBUF;
        RXD_flag = 1;//置接收到数据标志
    }
    _nop_();
    ES = 1;//打开串口
    EA = 1;//打开中断
}
//*******************************************************
void delay_ms(void)                         //毫秒延时  
 {     
     unsigned int i; 
     for (i=0;i<140;i++)  
          { 
          } 
 } 

void delay_nms(unsigned int n)              //延时周期 
 { 
     unsigned int i; 
     for (i=0;i<n;i++) 
          { 
           delay_ms(); 
          } 
 } 
  
  
unsigned long decode(void)                 //无线解码 
 { 
     unsigned long DATA;                    //记录数据 
     unsigned char count;                 //暂时计数 
     unsigned int  i;     
    
     DATA=0; i=0; 
     while(1)
     {
                                     //   
        if(!RFBIT)           //低位计数 
        {        
           NOPS;           // 
           i++;                  //计数增加  
        }
		else
		{ if (i>700) break;
		  else i=0; }
             
      }          
     
     
                                        
       	
     for (count=0;count<24;count++)         //开始收集 
     { 
            
       /*测量高电平宽度*/         
       i=0;                                 //宽度计数 
       while (RFBIT)           //高位计数 
         {        
                 NOPS;           // 
                 i++;                  //计数增加  
                 //if (i>192) goto end;  //限时解码 
          }                                    
      
/*分辨出电平高低*/                 
        
          DATA*=2;                       //数据左移 
                  
         if (i<64)                             //分辨高低  
           {     
            if (!((56>i)&(i>20))) goto end;     //电平合法                                 
            DATA+=0;                            //记低电平 
           } 
         else 
           {      
            if (!((200>i)&(i>72))) goto end;    //电平合法                                 
            DATA+=1;                            //记高电平 
           } 
            
/*测量低电平宽度*/         
    
           while (!(RFBIT) )              //低位计数 
            {        
                 NOPS;                     // 
                 i++;                        //计数增加  
                 if (i>300) goto end;        //限时解码 
            }           
                 
/*低电平是否过窄*/                 
           //if (i<96) goto end;                  //对比宽度                                  
      } 
/*解码成功返结果*/         
      return  DATA;                          //成功返回  
   
          
/*有误码结束解码*/          
          
     end:          
         return 0;                              //误码结束 
 }   


void main(void)
{
    unsigned long DATA,i; 
	uchar temp,temp1;
    
	
    CPU_init();
    _nop_();
	led_seg7(1,1);
    led_seg7(3,1);
    DATA = 0;
    i = 0;
    while(1)
    {
        //NOPS;
        
	                //解码程序 
        temp = (unsigned char) (DATA);
	    temp1 = (unsigned char) (DATA>>8);
		if(DATA > 0)
		{	   
		   led_seg7(1,temp);
           led_seg7(3,temp1);
		   if(i>2000)
		   {
		     DATA = 0;
			 i = 0;
		   }
		   else
		     i++;
		}
		else
		  DATA = decode();  
	   
         
      
///////////////////////数码管显示程序/////////////////////////////////

    }//while 结束
}//main结束


void Delay(uchar delay_time)
{//延时程序
    while(delay_time--)
    {}
}


void CPU_init(void)
{//初始化CPU
    SCON = 0x50; //串口方式1
    PCON = 0x80; //串口波特率加速
    TMOD = 0x21;
    TH1=0xFD; //19200bps
    TL1=0xFD;
    TR1 = 1;
    TI = 0;
    RI = 0;
    PS = 1;      //串口中断的优先级设为最高

    IT0 = 1;//外部中断0负边沿触发
    EX0 = 1;//打开外部中断0

    ES  = 0;//关闭串口中断
    EA = 0; //关闭总中断
    SJA1000_CS = 1;//片选无效
}

void RS232_TXD( void )
{
    EA = 0;//关闭所有中断
    ES = 0;//关闭串口中断,采用查询发送方式
    TI = 1;
    while(TI)
    {
        TI = 0;//一字节发送完后清除标志位
        SBUF = TX_data;
        while(!TI)
        {}//等待发送
        TI = 0;
    }
    _nop_();
    ES = 1;//打开串口中断
    EA = 1;//打开中断
}

void led_seg7(uchar from,uchar number)  //from(1_4):数码管显示起始位置(从右到左),number:显示的数
{
    uchar digit,temp_l;
    uchar temp_h=0x7f;
    temp_h = _cror_(temp_h,from-1);   //确定从哪一位开始显示,即确定高四位
    temp_h = temp_h & 0xf0;           //取高四位
    temp_l = P2 & 0x0f;               //取P2的低四位
    P2 = temp_h | temp_l;             //设定P2口

    if(number==0)
    {
        P0 = led[0];
        Delay(5);
        P0 = 0xff;
    }
    else
    {
        while(number)
	{
            digit = number%10 ;
	    number /= 10;
            P0 = led[digit] ;
	    Delay(5);
            temp_h = P2 & 0xf0;               //取P2的高四位
            temp_h = temp_h | 0x0f;           //拼装 temp_h,进行位选
	    temp_h = _cror_(temp_h,1);
	    temp_h = temp_h & 0xf0;           //取高四位
            temp_l = P2 & 0x0f;               //取P2的低四位
            P0 = 0xff;
            P2 = temp_h | temp_l;             //设定P2口
        }//while结束
    }//else结束

}

⌨️ 快捷键说明

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