M16的485串口程序从ICC到GCC移植

2019-03-24 20:34发布

近日在做485通信,单片机为ATMEGA16,编译环境为Atmel Studio 6 GCC,手中有一份485通信的ICC程序,但是ICC不怎么顺手,想移植为GCC程序,但改了好久还是不成功。ICC程序功能为:用串口助手发送数据(CC),单片机返回数据(CC)。希望有朋友帮帮忙。程序如下:
#include<iom16Av.h>
#include<macros.h>
#include <stdlib.h>
#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条回答
xhw5201314
2019-03-25 05:11
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>