📄 485bus slave.c
字号:
#include<iom16v.h>
#include<macros.h>
#define 485bus_recive PORTD|=0X04;
#define 485bus_send PORTD&=0XFB;
void 485bus_init(void)
{
DDRD|=0X04;
USART_Init();
/* 设置波特率*/
UBRR= 0x33;
/*设置为多机通讯模式*/
UCSRA=(1<<MPCM);
/* 接收器与发送器使能、接收中断时能*/
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UCSZ2);
/* 设置帧格式: 9 个数据位, 1 个停止位*/
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
}
void 485BUS_MESTER_TRANSMIT_DATA( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<<UDRE))) );
/* 将地址数据选择位复制到TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x01)
UCSRB |= (1<<TXB8);
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
void 485BUS_MESTER_TRANSMIT_ADDRESS( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<<UDRE))) );
/* 将地址数据选择位复制到TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x01)
UCSRB |= (1<<TXB8);
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
unsigned int 485BUS_MESTER_RECEIVE( void )
{
unsigned char status, resh, resl;
/* 等待接收数据*/
while ( !(UCSRA & (1<<RXC)) )
;
/* 从缓冲器中获得状态、第9 位及数据*/
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* 如果出错,返回-1 */
if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )
return -1;
/* 过滤第9 位数据,然后返回*/
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -