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

📄 mock_uart.c

📁 电梯楼层采集器代码
💻 C
字号:

//模拟串口通讯
#include"include.h"

#define TX_LO()			PORTD &= ~(1<<4)	 //发送端口
#define TX_HI()			PORTD |= (1<<4)

#define RX_Port()       (PIND&(1<<2))    //接收端口

unsigned char F_TM;

//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 104uSec
// actual value: 104.000uSec (0.0%)
void Timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x30; //set count
 OCR0  = 0xD0; //set compare
}

#pragma interrupt_handler Timer0_ovf_isr:10
void Timer0_ovf_isr(void)
{
 TCNT0 = 0x30; //reload counter value
 F_TM = 1;
}

//------------------------------------------------------------------------------
//发送一个字符
void PSendChar(unsigned char inch)
{
    unsigned char ii;
    ii=0;
    F_TM=0;
    TX_LO(); //start bit
    TCCR0 = 0x02; //start timer
    while(!F_TM);
    while(ii<8)
      {
        if(inch&1)
         {
           TX_HI(); 
		 }
        else
         {
           TX_LO();
         }
        F_TM=0;
        while(!F_TM);
        ii++;
        inch>>=1;
      }
    TX_HI();
    F_TM=0;
    while(!F_TM);
    TCCR0 = 0x00; //stop//停止timer
}
//------------------------------------------------------------------------------
//接收一个字符
unsigned char PGetChar()
{
    unsigned char ii,rch;
    TCCR0 = 0x02; //start timer
    F_TM=0;
    ii=0;
    rch=0;
    while(!F_TM); //等过起始位
    while(ii<8)
     {
       rch>>=1;
       if(RX_Port())
         {
           rch|=0x80;
         }
       ii++;
       F_TM=0;
       while(!F_TM);
      }
     F_TM=0;
     while(!F_TM)
        {
           if(RX_Port())
              {
                break;
               }
         }
      TCCR0 = 0x00; //stop//停止timer
      return rch;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//发送数据
void BUS_SendPacket_51Device(void)
{
    unsigned char i,tmp;
    unsigned int CRC,Count;
	static unsigned char *C51_uart;
    struct Device51_StructOfProtocol *C51_buf;
	C51max485_on();
	PSendChar(BOOT_CODE);
	PSendChar(BOOT_CODE);//发送引导码
	PSendChar(DEVICE_NUMBER);//发送系统设备号
	C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
    Count = C51_buf->Length;
	if(Count&&(Count<= 256))
	{
	  C51_uart = C51Buffer485;    /*初始化数据发送指针*/
      CRC = 0xffff;               /*初始化校验码*/
	  Count += 3;
	 
	  for(i=0;i<Count;i++)
	  {
		tmp = *C51_uart++;       /*取发送数据*/
	    PSendChar(tmp);
	    CRC16(&CRC,tmp);
	  }
      PSendChar(CRC>>8);
	  PSendChar(CRC);//发送校验码
	}
	C51max485_off();
	Power_LED_Drown();
}
//------------------------------------------------------------------------------
//接收数据
unsigned char BUS_GetPacket_51Device(void)
{
 	unsigned char tmp;
	static unsigned int CRC,Count;
	static unsigned char *C51_uart;
    struct Device51_StructOfProtocol *C51_buf;
	struct Device51_Address *Device51;
 	if(PGetChar()!=BOOT_CODE) return 1;
	if(PGetChar()!=BOOT_CODE) return 1;
	if(PGetChar()!=DEVICE_NUMBER) return 1;
	CRC = 0xffff;          /*初始化校验码*/
	C51_uart = C51Buffer485;    /*初始化数据接收指针*/
	tmp = PGetChar();
	*C51_uart++ = tmp; 	  /*接收地址*/
	CRC16(&CRC,tmp);      /*数据校验*/
	tmp = PGetChar();
	*C51_uart++ = tmp; 	  /*接收包长度低位字节*/
	CRC16(&CRC,tmp);      /*数据校验*/
	tmp = PGetChar();
	*C51_uart++ = tmp;   /*接收包长度高位字节*/
    CRC16(&CRC,tmp);     /*数据校验*/
    C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
    Count = C51_buf->Length;
	if (Count && Count <= (256 - 8))
	{
	   do{
	   	   *C51_uart++ = tmp;   /*接收数据*/
           CRC16(&CRC,tmp);  /*数据校验*/
		}while(Count--);
	}
	else
		return 1;
	CRC16(&CRC,PGetChar());    /*数据校验*/
	CRC16(&CRC,PGetChar());    /*数据校验*/
    C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
	if (!CRC)
    //接收完数据
		return 0;		
    else
		return 1;
}
//------------------------------------------------------------------------------

⌨️ 快捷键说明

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