使用PIC18F452连接MAX485芯片进行485通信,然后通过485转USB接口连接到电脑,使用串口助手收发,但是通信不成功,没有收到数据,也无法发送数据。
485是用的自动收发电路,如下图
程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
unsigned char FIFO;
char flag=0;
void delayms(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
void init_uart()
{
TRISC=0x80;
TXSTA=0X24; //使能串口发送8位数据
RCSTA=0X90; //使能串口工作,连续接收
SPBRG=25; //设置波特率为9600BPS 4000000/9600/16-1=25
RCIE=1; //接收中断
GIE=1; //全局中断
PEIE=1; //外部中断
}
void IO_INIT(void)
{
ADCON1=0xFF; //禁止的AD转换功能(第二功能)
TRISE = 0;
TRISC = 0X00;
TRISD = 0;
PORTD = 0;
TRISA = 0;
TRISB =0X00;
PORTB =0;
//PORTE = 0XFF;
RE0=0;
RE1=0;
RE2=0;
RBPU=0;
}
void Send_Date(unsigned char date)
{
TXREG=date;
delayms(2);
while(TXIF==0);
TXIF=0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: serial()串口接收中断处理函数
// 函数功能: 接收数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
void interrupt usart()
{
if(RCIF) //判断是否为串口接收中断
{
RCIF=0;
FIFO=RCREG; // 接收数据并存储
flag=1;
}
}
void main()
{
uint x;
IO_INIT();// IO初始化
init_uart();
while(1)
{
///* 2018.7.2 发送程序
if(flag)//收到数据 发出
{
flag=0;
Send_Date(FIFO);
delayms(5);
RCIF=0;
}
delayms(100);
if(x++>15)//一段时间发送一次数据
{
x=0;
Send_Date('T');
Send_Date('e');
Send_Date('s');
Send_Date('t');
Send_Date('o');
Send_Date('k');
Send_Date(0x0d);
Send_Date(0x0a);
delayms(5);
RCIF=0;
}
}
}