程序我写了,用ICCAVR6 编译通过
你可以修改一下晶振频率和波特率试验一下
#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
//波特率,晶振
#define BAUD 19200
#define FXTAL 12000000UL
#define RS485EN_DDR DDRD|=BIT(PD4)
#define RS485_EN PORTD|=BIT(PD4)
#define RS485_UNEN PORTD&=~BIT(PD4)
//*******************
//延时函数 用的8MHZ标准的
//
//*******************
void delay (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//串口初始化函数
//*******************
//串口初始化函数
//注意波特率和晶振在最先的定义上设置好
//1停止位 8数据位 无奇偶校验
//*******************
void USART_Init()
{
unsigned int Temp;
RS485EN_DDR;//使能端口设置成输出
UCSRA=0x00; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择USCRC,异步操作,1个停止位,八位数据
Temp=(FXTAL/BAUD/16)-1; //求出9600波特率的赋值
UBRRH=((Temp>>8)&0x00ff); //波特率寄存器高八位赋值
UBRRL=(Temp&0x00ff); //波特率寄存器低八位赋值
//UBRR=71; //从手册中直接取得赋值,9600kbps
UCSRB|=BIT(TXEN)|BIT(RXEN); //发送使能,接收使能,
}
/**********发送函数***********/
void uart_sendB(uchar data)
{
RS485_EN;
while(!(UCSRA&(BIT(UDRE)))); //数据寄存器UDR是否为空?
UDR=data; //UDR赋值
while(!(UCSRA&(BIT(TXC)))); //数据是否已经发送完毕?
UCSRA|=BIT(TXC); //清除发送完毕标志位
RS485_UNEN;
}
/**********主函数**************/
void main()
{
uchar i = 4;
uchar j = 'a';
USART_Init(); // 初始化
while(1)
{ uart_sendB(i); delay(10);
uart_sendB(j); delay(10);
uart_sendB(i); delay(10);
uart_sendB(j); delay(10);
}
}
|