微芯ATMEGA88摸拟串口程序

发布时间:2018/12/11

//=====================================================================

//摸拟串口实现代码

//Baud:9600Bps

//Format:1,8,1,无校验位

//MCU:M88

//CRYSTAL:3.6864M

//ICCAVR6.31A

//占用定时器T0(工作在查询方式)

//在项目中使用,收发一切正常呵

//=====================================================================

//摸拟串口接收与发送引脚定义

#defineGET_VMUART_RX()(PIND&0x08)//(1<#defineSET_VMUART_TX(){PORTD|=(1<#defineCLR_VMUART_TX(){PORTD&=~(1<

//波特率定义

#defineTxd_Bit_Delay0xD0

//T0启停控制

#defineStartTimer0(x){TCCR0B=0x00;TIFR0=0x07;TCNT0=x;TCCR0B=0x02;}//0xD0

#defineStopTime0(){TCCR0B=0x00;TIMSK0=0x00;}

//==========================================================

//TIMER0initialize-prescale:8

//WGM:Normal

//desiredvalue:10mSec

//actualvalue:9.98mSec(0.2%)

//===========================================================

voidtimer0_init(void)

{

TCCR0B=0x00;//stop

TCNT0=Txd_Bit_Delay;//0xD0;//setcount

TCCR0A=0x00;

}

//=====================================================================

//发送一个数据字节

//SendSBUF---待发送的字节数据

//返回值:NO

//=====================================================================

voidPSendChar(uint8SendSBUF)

{

uint8numbers;//发送位数计数用

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();

}

//=====================================================================

//接收一个字节

//返回值:接收到的字节内容

//=====================================================================

unsignedcharPGetChar(void)

{

unsignedcharrch=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();

returnrch;

}