📄 wrs485r.#1
字号:
//文件名: WRS485R.c 程序用UART1外扩MAX485实现RS-485通信,运行前将TX1和P00 短//接,RX1和P01短接,当接收到一个数据后,再将接收到的数据送出。
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
#define SYSCLK 11059200 /*系统频率*/
#define BAUDRATE 9600 /*波特率*/
sbit BUZ = P3^5;
sbit P32 = P3^2; /*接收/发送控制*/
void SYSCLK_Init (void);
void PORT_Init (void);
void UART1_Init (void);
void UART1_ISR (void);
void LCD_Init(void);
bit ReceiveBit;
unsigned char temp;
float FFF;
int ff;
/*延时子程序*/
void delay(unsigned int m)
{
unsigned int n;
n=0;
while(n < m)
{n++;}
return;
}
void main (void) {
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
ReceiveBit=0;
SYSCLK_Init (); /*初始化系统时钟*/
PORT_Init (); /*初始化I/O口*/
LCD_Init();
UART1_Init (); /*初始化UART1*/
EA = 1; /*开总中断*/
EIE2 |= 0x40; /*UART1中断*/
P32 = 0; /*接收模式*/
P7 = 0x52; /*显示R>*/
P6 = 0x0c;
P6 = 0x0d;
delay(300); /*延时*/
P7 = 0x3e;
P6 = 0x0c;
P6 = 0x0d;
while(1){
while (ReceiveBit==1) { /*接收到一个数据*/
ReceiveBit=0; /*清接收位*/
if(temp==0)break; /*如果接收的是空则不显示*/
P7 = temp; /*显示接收字符*/
P6 = 0x0c;
P6 = 0x0d;
}
nop ();
}
}
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*开始外部22.1184MHz晶体*/
for (i=0; i < 256; i++) ; /*等待外部晶体起振稳定*/
while (!(OSCXCN & 0x80)) ; /*查询标志位*/
OSCICN = 0x88; /*用外部晶体频率作为系统时钟,并使能时钟丢失检测*/
}
void PORT_Init (void)
{
XBR2 |= 0x44; /*使能UART1和交叉开关,弱上拉*/
P0MDOUT |= 0x01; /*使能TX1推挽输出*/
P3MDOUT |= 0x20; /*P3.5驱动蜂鸣器*/
P74OUT = 0xff;
}
void UART1_Init (void)
{
SCON1 = 0x50; /*SCON1:模式1, 8-bitUART,使能RX*/
TMOD = 0x20; /*TMOD: 定时器1,定时器2, 8位重载*/
//TH1=0xb8; /*设置定时器1作为波特率的重载值*/
TH1=-(SYSCLK/BAUDRATE/16);
TR1 = 1; /*开定时器1*/
CKCON |= 0x10; /*定时器1用系统时钟作为时基*/
PCON |= 0x10; /*SMOD1 = 1,波特率加倍*/
//EIE2 |= 0x40; /*使能UART1中断*/
}
void UART1_ISR (void) interrupt 20 using 3
{
if((SCON1 & 0x01)==0x01)
{
SCON1 &= ~0x01; /*请接收标志位*/
temp = SBUF1; /*保存接收数据*/
ReceiveBit=1; /*置接收位*/
}
SCON1 &= ~0x02; /*清发送标志位*/
}
void LCD_Init(void)
{
unsigned int x;
P6 = 0x09;
for(x=0;x<50000;x++);
//P7 = 0x30; /*一行显示*/
P7 = 0x38; /*两行显示*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7 = 0x0e; /*开显示,开光标,字符不闪烁*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7= 0x06; /*I/D=1,AC自动增1;S=0,整体显示不移动*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
P7 = 0x01; /*清除DDRAM,置AC=0*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -