[求助] M16的485串口程序从ICC到GCC移植

xhw5201314   2014-3-11 14:39 楼主
近日在做485通信,单片机为ATMEGA16,编译环境为Atmel Studio 6 GCC,手中有一份485通信的ICC程序,但是ICC不怎么顺手,想移植为GCC程序,但改了好久还是不成功。ICC程序功能为:用串口助手发送数据(CC),单片机返回数据(CC)。希望有朋友帮帮忙。程序如下:
#include
#include
#include
#define  uchar unsigned char
#define  uint  unsigned int

#define baud 9600
#define mclk 8000000L

#pragma interrupt_handler uart_rx:12

#define MAX485SEND PORTD|=BIT(2)   //PD2口做控制端
#define MAX485RECE PORTD&=~BIT(2)  

uchar rdata=0,flag=0;

void uart_init()
{
uchar temp;
DDRD|=BIT(1); //PD1:TX为输出状态
DDRD&=~BIT(0);//PD0:RX为输入状态
PORTD|=BIT(0);
DDRD|=BIT(2);  //将pd2 设置为输出
UCSRA=0X00;
UCSRB=0x00;
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0);
//UBRR=0x77;
temp=mclk/16/baud-1;
UBRRL=temp;
UBRRH=temp>>8;
UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE);
SREG|=BIT(7);
}

void uart_sendb(uchar data)
{
while(!(UCSRA&(BIT(UDRE))));
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}
void uart_rx()
{
    UCSRB&=~BIT(RXCIE);
        rdata=UDR;       
        flag=1;
        UCSRB|=BIT(RXCIE);
}

void uart_sends(uchar *datastr)
{
while(*datastr)
{
uart_sendb(*datastr++);
}
}

void main()
{
    uart_init();
       
         // MAX485RECE;  //------------------》将485设置为接收状态
         PORTD&=~BIT(2);
        while(1)
        {
           if(flag==1)
           {
          // MAX485SEND;  // ----------------》将485设置为发送状态
     
            PORTD|=BIT(2);        
            uart_sends("c");     
            flag=0;
        // MAX485RECE;//-------------------》将485设置为接收状态
        PORTD&=~BIT(2);
           }
        }
}

回复评论 (1)

刚才贴错了一句uart_sends("c");应该是 uart_sends("cc");希望朋友来帮帮
点赞  2014-3-11 14:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复