#include "uart.h" void Uart_Init() { TMOD=0X20; SCON=0X50; TH1=253; //9600bit/s-->11.0592MHZ TR1=1; } void Send_Byte(u8 dat) { SBUF=dat; while(TI==0); TI=0; } void Isr_uart() interrupt 4 //串口中斷處理 { u8 t; if(RI==1) { RI=0; t=SBUF; //.... } }uart.h
#ifndef _uart_ #define _uart_ #include "reg51.h" #define u8 unsigned char #define u16 unsigned int void Uart_Init(); void Send_Byte(u8 dat); #endif
timer.c
#include "timer.h" TMS ms; // void Timer0_Init() //1ms { TMOD|=0X01; TH0=64614/256; TL0=64614%256; TR0=1; } void Timer0_Isr() interrupt 1 //t0 1ms { TH0=64614/256; TL0=64614%256; ms.ms1++; ms.ms2++; ms.ms3++; ms.ms4++; //... }timer.h
#ifndef _TIMER_
#define _TIMER_
#include "reg51.h"
#define u8 unsigned char
#define u16 unsigned int
typedef struct
{
u16 ms1;
u16 ms2;
u16 ms3;
u16 ms4;
//...
}TMS;
extern TMS ms; //
void Timer0_Init();
#endif
RS485從機(jī)代碼
main.c
#include "12864.h" #include "uart.h" #include "timer.h" #include "rs485.h" u16 ad; //當(dāng)前數(shù)字量 void Isr_Init() { EA=1; ES=1; ET0=1; } void main() { LCD_Init(); Timer0_Init(); RS485_Init(); Isr_Init(); Show_String(0x80,"RS485 從機(jī)"); while(1) { Show_Number(0x88,ad); //... } }rs485.c
#include"rs485.h" #include "uart.h" #include "timer.h" u8 Rs485buf[4]; //Rs485接收緩沖區(qū) sbit RT485=P1^0;//MAX485的發(fā)送接收狀態(tài)控制位定義 /* 0XAA ADH ADL SUM%256 */ void RS485_Init() { Uart_Init(); RT485=0; //初始化MAX485為接收狀態(tài) }rs485.h
#ifndef _485_
#define _485_
#include "reg51.h"
#define u8 unsigned char
#define u16 unsigned int
void RS485_Init();
#endif
uart.c
#include "uart.h"
void Uart_Init()
{
TMOD=0X20;
SCON=0X50;
TH1=253; //9600bit/s-->11.0592MHZ
TR1=1;
}
void Send_Byte(u8 dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void Isr_uart() interrupt 4 //串口中斷處理
{
u8 t;
static u8 i;
if(RI==1)
{
RI=0;
t=SBUF;
Rs485buf[i++]=t;
if(Rs485buf[0]==0xaa)
{
if(i>=4)
{
if((Rs485buf[1] + Rs485buf[2])%256 == Rs485buf[3])
{
ad=Rs485buf[1]*256+Rs485buf[2];
}
i=0;
}
}
else
{
i=0;
}
}
}
uart.h
#ifndef _uart_
#define _uart_
#include "reg51.h"
#define u8 unsigned char
#define u16 unsigned int
extern u8 Rs485buf[4]; //Rs485?óê??o3???
void Uart_Init();
void Send_Byte(u8 dat);
#endif另外的12864和timer就不列出了,復(fù)制主機(jī)里面的代碼即可。
RS485多機(jī)通信
如圖給出了主從機(jī)的框圖,圖中主機(jī)每100ms輪詢一個(gè)從機(jī)。主機(jī)發(fā)送的尋址命令幀包含:
(1)本次輪詢的從機(jī)地址
(2)本次輪詢?cè)搹臋C(jī)的目的
(3)本次輪詢?cè)搹臋C(jī)的附加信息
(4)本尋址幀的校驗(yàn)信息
從機(jī)收到尋址幀后:
(1)校驗(yàn)數(shù)據(jù)包的正確性
(2)檢驗(yàn)數(shù)據(jù)包中地址部分是否與自己的地址相等
(3)對(duì)數(shù)據(jù)包進(jìn)行處理
(4)對(duì)主機(jī)發(fā)回響應(yīng)數(shù)據(jù)包
主機(jī)尋址幀的結(jié)構(gòu):
從機(jī)發(fā)回?cái)?shù)據(jù)包結(jié)構(gòu):
評(píng)論