📄 rs485.c
字号:
//-----------------------------------------------------------------------------
// 版权归新华龙电子公司所有
//-----------------------------------------------------------------------------
//
//文件名: RS485.c
//
//编写人: LC
//
//编写时间:2005/03/10
//
//目标器件: C8051F02x
//
//编译工具: Silicon Laboratories IDE
//
//程序说明: 此程序用UART1外扩MAX485实现RS-485通信,运行前将TX1和P00 短接,RX1和
// P01短接,当接收到一个数据后,再将接收到的数据送出。
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 11059200 /*系统频率*/
#define BAUDRATE 9600 /*波特率*/
sbit BUZ = P3^5;
sbit P32 = P3^2; /*接收/发送控制*/
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART1_Init (void);
void UART1_ISR (void);
bit ReceiveBit;
unsigned char temp;
/*延时子程序*/
void delay(unsigned int m)
{
unsigned int n;
n=0;
while(n < m)
{n++;}
return;
}
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
unsigned char i;
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
ReceiveBit=0;
SYSCLK_Init (); /*初始化系统时钟*/
PORT_Init (); /*初始化I/O口*/
UART1_Init (); /*初始化UART1*/
EA = 1; /*开总中断*/
EIE2 |= 0x40; /*UART1中断*/
P32 = 0; /*接收模式*/
while(1){
while (ReceiveBit==1) { /*接收到一个数据*/
EIE2 &= 0xbf; /*无效UART1中断*/
EA=0; /*关总中断*/
ReceiveBit=0; /*清接收位*/
P32=1; /*发送模式*/
delay(60000); /*延时*/
SBUF1=temp;
while(SCON1&0x02==0); /*发送中断模式是否产生*/
SCON1 = SCON1&0xfd; /*清发送中断标志*/
delay(60000); /*延时*/
P32 = 0;
BUZ=0; /*蜂鸣器响*/
for(i=0; i<3; i++)
{
delay(60000);
}
BUZ=1; /*蜂鸣器灭*/
EIE2 |= 0x40; /*使能UART1中断*/
EA=1;
}
_nop_();
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*开始外部22.1184MHz晶体*/
for (i=0; i < 256; i++) ; /*等待外部晶体起振稳定*/
while (!(OSCXCN & 0x80)) ; /*查询标志位*/
OSCICN = 0x88; /*用外部晶体频率作为系统时钟,并使能时钟丢失检测*/
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
XBR2 |= 0x44; /*使能UART1和交叉开关,弱上拉*/
P0MDOUT |= 0x01; /*使能TX1推挽输出*/
P1MDOUT |= 0x40; /*使能LED作为推挽输出*/
P3MDOUT |= 0xdf;
}
//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Configure UART1 using Timer1, for <baudrate> and 8-N-1.
//
void UART1_Init (void)
{
SCON1 = 0x50; /*SCON1:模式1, 8-bitUART,使能RX*/
TMOD = 0x20; /*TMOD: 定时器1,定时器2, 8位重载*/
TH1 = -(SYSCLK/BAUDRATE/16); /*设置定时器1作为波特率的重载值*/
TR1 = 1; /*开定时器1*/
CKCON |= 0x10; /*定时器1用系统时钟作为时基*/
PCON |= 0x10; /*SMOD1 = 1*/
//EIE2 |= 0x40; /*使能UART1中断*/
}
//-----------------------------------------------------------------------------
// Interrupt Handlers
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// UART1_ISR
//-----------------------------------------------------------------------------
void UART1_ISR (void) interrupt 20 using 3
{
if((SCON1 & 0x01)==0x01)
{
SCON1 &= ~0x01; /*请接收标志位*/
temp = SBUF1; /*保存接收数据*/
ReceiveBit=1; /*置接收位*/
}
SCON1 &= ~0x02; /*清发送标志位*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -