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

📄 icc摸拟串口实现代码.txt

📁 模拟串口实现代码, Baud: 9600Bps , Format: 1,8,1,无校验位, MCU:M88 , CRYSTAL:3.6864M , ICC AVR6.31A , 占用定
💻 TXT
字号:
//===================================================================== 
//摸拟串口实现代码 
//Baud:    9600Bps 
//Format: 1,8,1,无校验位 
//MCU:M88 
//CRYSTAL:3.6864M 
//ICC AVR6.31A 
//AUTHOR:along 
//占用定时器T0(工作在查询方式) 
//在项目中使用,收发一切正常呵 
//===================================================================== 

//摸拟串口接收与发送引脚定义  
   #define GET_VMUART_RX()    (PIND & 0x08)//(1<<PD3))   // 端口D的PD0模拟接收  
   #define SET_VMUART_TX()    {PORTD |= (1<<PD4);}       // 端口D的PD1发送  
   #define CLR_VMUART_TX()    {PORTD &= ~(1<<PD4);}      // 端口D的PD1发送 
      
 //波特率定义 
    #define Txd_Bit_Delay      0xD0 
 //T0启停控制  
    #define StartTimer0(x)     {TCCR0B=0x00;TIFR0=0x07;TCNT0=x;TCCR0B=0x02;}//0xD0 
    #define StopTime0()        {TCCR0B=0x00;TIMSK0=0x00;} 

//========================================================== 
// TIMER0 initialize - prescale:8 
// WGM: Normal 
// desired value: 10mSec 
// actual value: 9.98mSec (0.2%) 
//=========================================================== 
void timer0_init(void) 
{ 
         TCCR0B = 0x00; //stop 
         TCNT0  = Txd_Bit_Delay;//0xD0; //set count 
         TCCR0A = 0x00;  
} 

//===================================================================== 
//发送一个数据字节 
//SendSBUF --- 待发送的字节数据 
//返回值:NO 
//===================================================================== 
void PSendChar(uint8 SendSBUF) 
{  
    uint8 numbers ;//发送位数计数用  
     
    numbers=0;  
     
    //发送启始位 
    CLR_VMUART_TX(); 
       StartTimer0(Txd_Bit_Delay); 
       while(!(TIFR0&0x01)); 
       StartTimer0(Txd_Bit_Delay); 
        
    //发送8个数据位  
       while(numbers<8) 
    {  
            if(SendSBUF & 0x01)  
            {  
                SET_VMUART_TX();  
            }  
            else  
            {  
                CLR_VMUART_TX();  
            } 
              
            //发送数据位的位延时 
            SendSBUF >>= 1;  
                    
             while(!(TIFR0&0x01)); 
             StartTimer0(Txd_Bit_Delay); 
             numbers++;       
      } 
                    
        //发送结束位 
        SET_VMUART_TX(); 
        while(!(TIFR0&0x01)); 
         
        //停止timer0 
        StopTime0(); 
}  

//===================================================================== 
//接收一个字节 
//返回值:接收到的字节内容 
//===================================================================== 
unsigned char PGetChar(void) 
{ 
      unsigned char rch=0xFF,ii=0xFF; 
       
      //等启始位 
      while(GET_VMUART_RX()&&rch>0) 
      { 
            if(--i==0) 
            { 
                 i=0Xff; 
                 if(!GET_VMUART_RX())break; 
                 rch--; 
             } 
      } 
       
      StartTimer0(Txd_Bit_Delay); 
      ii=0; 
      rch=0; 
       
      //等过起始位延时 
         while(!(TIFR0&0x01)); 
         StartTimer0(Txd_Bit_Delay); 
          
         //开始接收8位数据位 
      while(ii<8) 
      { 
            rch>>=1; 
            if(GET_VMUART_RX()) 
            { 
            rch|=0x80; 
            } 
            ii++; 
             while(!(TIFR0&0x01)); 
             StartTimer0(Txd_Bit_Delay); 
      } 
       
      //接收停止位 
      while(!(TIFR0&0x01)) 
      { 
            if(GET_VMUART_RX()) 
            { 
                  break; 
            } 
      } 
       
      //停止timer0 
      StopTime0();  
      return rch; 
}

⌨️ 快捷键说明

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