|
/*******************************************************************************************
* 標(biāo)題: RS485通信試驗(yàn)(接收與發(fā)送) *
* *
* 1.通過本例程了解串口的基本原理及使用 ,理解并掌握對(duì)串口進(jìn)行初始化 *
* *
* 2.Baud 19200、數(shù)據(jù)位8、停止位1、效驗(yàn)位無(wú) 兩臺(tái)485設(shè)備 a機(jī)發(fā) b機(jī)收 *
* *
* 說明: *
* 使用兩個(gè)帶有485功能硬件設(shè)備(例如:兩個(gè)帶485的開發(fā)箱等) 每個(gè)設(shè)備都有信號(hào)端A和B,通過導(dǎo)線 *
* 分別連接兩臺(tái)設(shè)備 A 連 A B 連 B 排線連接參考圖片 *
* 現(xiàn)象:按A機(jī)的獨(dú)立按鈕 在B機(jī)的LED等顯示其狀態(tài) 對(duì)應(yīng)位的LED燈亮 *
* 注意:18B20 請(qǐng)卸下,否則會(huì)影響RS485 *
* 請(qǐng)學(xué)員認(rèn)真消化本例程,學(xué)會(huì)用C語(yǔ)言操作串口和485的實(shí)現(xiàn)簡(jiǎn)單收發(fā)功能 *
*********************************************************************************************/
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定義485的使能腳
/**************************************
延時(shí)程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允許串行接受狀態(tài),串口工作模式1
TMOD|= 0x20; //定時(shí)器工作方式2
PCON|= 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
while(1)
{
if (P0 != 0XFF) // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài) DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
{
RS485E=1; // RS5485E=0為接收狀態(tài) RS5485E=1為發(fā)送狀態(tài)
SBUF=P0; //發(fā)送數(shù)據(jù)
delay(40);
}
}
}
/*******************************************************************************************
* 標(biāo)題: RS485通信試驗(yàn)(接收與發(fā)送) *
* *
* 1.通過本例程了解串口的基本原理及使用 ,理解并掌握對(duì)串口進(jìn)行初始化 *
* *
* 2.Baud 19200、數(shù)據(jù)位8、停止位1、效驗(yàn)位無(wú) 兩臺(tái)485設(shè)備 a機(jī)發(fā) b機(jī)收 *
* *
* 說明: *
* 使用兩個(gè)帶有485功能硬件設(shè)備(例如:兩個(gè)帶485的開發(fā)箱等) 每個(gè)設(shè)備都有信號(hào)端A和B,通過導(dǎo)線 *
* 分別連接兩臺(tái)設(shè)備 A 連 A B 連 B 排線連接參考圖片 *
* 現(xiàn)象:按A機(jī)的獨(dú)立按鈕 在B機(jī)的LED等顯示其狀態(tài) 對(duì)應(yīng)位的LED燈亮 *
* 注意:18B20 請(qǐng)卸下,否則會(huì)影響RS485 *
* 請(qǐng)學(xué)員認(rèn)真消化本例程,學(xué)會(huì)用C語(yǔ)言操作串口和485的實(shí)現(xiàn)簡(jiǎn)單收發(fā)功能 *
*********************************************************************************************/
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定義485的使能腳
unsigned int ReData;
/**************************************
延時(shí)程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允許串行接受狀態(tài),串口工作模式1
TMOD|= 0x20; //定時(shí)器工作方式2
PCON|= 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú)
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
while(1)
{ P0 = 0xff;
P0 = ReData; // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài) DE=1為發(fā)送狀態(tài)(參考MAX485芯片管腳)
RS485E=0; // RS5485E=0為接收狀態(tài) RS5485E=1為發(fā)送狀態(tài)
delay(20);
}
}
/****************************************************
串口中斷程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中斷標(biāo)志
{
RI = 0; //清除RI接受中斷標(biāo)志
ReData = SBUF; //SUBF接受/發(fā)送緩沖器
}
}
|
|