近日在做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);
}
}
}
此帖出自
小平头技术问答
一周热门 更多>