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

📄 io_soft_uart_use_timer.c

📁 监控行业车辆检测器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    rs_f_RI_enable = 0;                //禁止接收  

    rs_shift_count = 0;                //清移位计数器  
    rs_f_TI   = 1;                     //发送一个字符完毕标志  
    TCON_ENABLE_TIMER = 1;             //启动定时器
}
extern unsigned char Receivesize;			   // 模拟串口接收多少字节
void soft_rs232_interrupt( void )
{
    /************************ 接收 ****************************/
    if (rs_f_RI_enable == 1)
    {
        if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
        {
            if ( rs_RXD == 1 )
            {
                soft_receive_enable (); //起始位错, 从新开始   
            }
            else
            {
                //下次中断在数据位或停止位中的某时刻发生    
                rs_timerL += rs_FULL_BIT_L + 0x08; 
                rs_timerH = rs_FULL_BIT_H;
                rs_shift_count++;              
                rs_BUF = 0;             //清移位缓冲变量   
            }
        }
        else
        {
            rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
            rs_timerH = rs_FULL_BIT_H;
                                       
            rs_shift_count++;           //2--9:数据位 10:停止位 
                                       
            if ( rs_shift_count == 9)
            {
                rs_BUF = rs_BUF >> 1;   //接收第8位   
                rs_BUF_bit7 = rs_RXD;
                if( ReceivePoint < rs_RECEIVE_MAX)
                {                       //保存收到的字节    
                    rs232buffer[ReceivePoint] = rs_BUF;
					if( (	rs232buffer[ReceivePoint] == 0x0a)&&( 	rs232buffer[ReceivePoint-1] == 0x0d) )
					   {
						   RED_LED = ~RED_LED;
				             		
						   phone_flag = 1;		// 接收到一帧电话号码标志

						   Receivesize =  ReceivePoint;
						   ReceivePoint =0;
					   }
					else
					   {
				           ReceivePoint++;
					   }
                }
                else
                {
                    rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
                }
            }
            else
            {
                if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
                {
                    rs_BUF = rs_BUF >> 1;
                    rs_BUF_bit7 = rs_RXD;
                }
                else
                {   //收到停止位,继续检测 PC 机发出的下一个起始位    
                    soft_receive_init(); 
                }
            }
        }
        TCON_TFx = 0;                  //清定时器中断标志   
    }
    else
    {
        /************************ 发送 ****************************/  
        if (rs_f_TI_enable == 1)
        {
            rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
            rs_timerH = rs_FULL_BIT_H;

            rs_shift_count--;          //0:停止位末尾时刻到  
                                       //1:发送停止位  
                                       //2--9:发送数据位  
            if (rs_shift_count > 9)    //错误状态  
            {
                rs_shift_count = 9;
                rs_BUF = 0xFF;
            }

            if (rs_shift_count > 1)    //2--9:发送数据位  
            {
                ACC = rs_BUF;
                ACC = ACC >> 1;
                rs_TXD = CY;
                rs_BUF = ACC;
            }
            else
            {
                if (rs_shift_count == 0) //0:停止位末尾时刻到  
                {
                    rs_TXD = 1;
                    rs_f_TI = 1;       //已发送完毕一个字节  
                }
                else
                {
                    rs_TXD = 1;        //1:发送停止位  
                }
            }
        }
    }
}

//由收转到发时,要先调用 soft_send_enable ()  
void rs_send_byte(INT8U SendByte)      //发送一个字节  
{
    while ( rs_f_TI == 0);             //等待发送完毕前一个字节  
    rs_TXD = 1;
    rs_timerL = rs_START_BIT_L;        //下次中断在起始位的末尾时刻   
    rs_timerH = rs_START_BIT_H;
    rs_BUF = SendByte;
    rs_shift_count = 10;
    rs_TXD = 0;                        //发送起始位  
    rs_f_TI = 0;                       //清已发送完毕一个字节的标志   
}

void initiate_MCU (void)               //系统初始化  
{
    soft_rs232_init();                 //串口初始化  
    EA = 1;                            //开中断  
}


extern  void delay_n_ms( unsigned int n_milisecond) ; /* mS delay */

void  phone_init(void);

void  phone_init(void)
{
	initiate_MCU();                    //系统初始化  
  /*
	P1 = 0xff; 		  // 1.0,1.3,1.6,1.7设置为输入 

	P1M0 = 0x00;	  // 1.1,1.2,1.4,1.5设置为输出
   	P1M1 = 0x00;
  */
   
	delay_n_ms(200);

	PHONE_RESET = 0;
	delay_n_ms(200);
	PHONE_RESET = 1;
	delay_n_ms(200);
	PHONE_RESET = 0;

	WDT_CONTR = 0x3d;      //使能看门狗

	delay_n_ms(200);
  
	soft_receive_enable ();        //启动并开始接收,禁止发送  

   // 电话模块复位成功
   do{


	PHONE_RESET = 0;
	delay_n_ms(200);
	PHONE_RESET = 1;
	delay_n_ms(300);
	PHONE_RESET = 0;
	WDT_CONTR = 0x3d;      //使能看门狗
	delay_n_ms(700);	 // 延时

	WDT_CONTR = 0x3d;      //使能看门狗

    }while(	!phone_flag);
	/*
   	UartPrintOut(rs232buffer,ReceivePoint);
	ES = 0; TI = 1;enable_485_tx;
	printf("!\n");
	TI=0;ES = 1;enable_485_rx;
	*/
    phone_flag =0;
  	ReceivePoint =0;
}
/*

void main (void)
{
//首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
//个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
//数据块。
  
    INT8U i;
  
  
    soft_send_enable ();               //允许发送,禁止接收  
    for (i=0; i < rs_RECEIVE_MAX; i++ )
    {
        rs_send_byte(i);
    }
    while ( rs_f_TI == 0)  ;           // 等待最后一个字节发送完毕   
 

 	phone_init();

    while(1)
    {
      
	/*
	 
        while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满  
	 
        soft_send_enable ();           //允许发送,禁止接收  
	 
        for (i=0; i < rs_RECEIVE_MAX; i++ )
        {
            rs_send_byte(rs232buffer[i]);
        }
	  
        while ( rs_f_TI == 0)  ;       //等待最后一个字节发送完毕
	 
        ReceivePoint = 0;
	  
    }
}
*/

⌨️ 快捷键说明

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