代码;
stduart.c
#include "sfduart.h"
#define SFD_LOOP_VAR 12
void sfdUART_init(void)
{
PINDIR(sfdUART_TXDIO, PIN_OUTPUT);
PINSET(sfdUART_TXDIO);
PINDIR(sfdUART_RXDIO, PIN_INPUT);
PINSET(sfdUART_RXDIO);
MCUCR = (1 << ISC11);
sfd_ENABLE_RXINT();
}
char sfdUART_getbyte(void)
{
unsigned char i, tmp;
sfd_DISABLE_RXINT();
while(PININ(sfdUART_RXDIO));
_delay_us(1400000UL / sfdBAUDRATE);
for(i = tmp = 0; i < 8; i++)
{
tmp = tmp >> 1;
if(PININ(sfdUART_RXDIO))
tmp |= 0x80;
_delay_us(1000000UL / sfdBAUDRATE - SFD_LOOP_VAR);
}
_delay_us(1000000UL / sfdBAUDRATE);
sfd_ENABLE_RXINT();
return tmp;
}
void sfdUART_sendbyte(char dat)
{
unsigned char i;
sfd_DISABLE_RXINT();
PINCLR(sfdUART_TXDIO);
_delay_us(1000000UL / sfdBAUDRATE);
for(i = 0; i < 8; i++)
{
if(dat & 0x01)
PINSET(sfdUART_TXDIO);
else
PINCLR(sfdUART_TXDIO);
dat = dat /2;
_delay_us(1000000UL / sfdBAUDRATE - SFD_LOOP_VAR);
}
PINSET(sfdUART_TXDIO);
_delay_us(1000000UL / sfdBAUDRATE);
sfd_ENABLE_RXINT();
}
volatile char RXCflag = 0;
ISR(INT1_vect)
{
RXCflag = 1;
sfd_DISABLE_RXINT();
}
main.c
#include "cfg.h"
#include "macromcu.h"
#include "sfduart.h"
#include
#include
#define UBRRREG (F_CPU / ( 8 * sfdBAUDRATE ) - 1)
void init()
{
sfdUART_init();
sfdUART_sendbyte('>');
UBRRH = UBRRREG / 256;
UBRRL = UBRRREG % 256;
UCSRA = ( 1 << U2X );
UCSRB = ( 1 << TXEN );
UCSRC = ( 1 << UCSZ1) | ( 1 << UCSZ0 );
sei();
}
int main(void)
{
char tmp;
init();
for(;;)
{
if(RXCflag)
{
RXCflag = 0;
tmp = sfdUART_getbyte();
UDR = tmp;
sfdUART_sendbyte(tmp);
}
}
return 0;
}
仿真效果图:
文章评论(0条评论)
登录后参与讨论