📄 wrs485t.c
字号:
//文件名: WRS485T.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*/
P32 = 1; /*发送模式*/
P7 = 0x54; /*显示T>*/
P6 = 0x0c;
P6 = 0x0d;
delay(300); /*延时*/
P7 = 0x3e;
P6 = 0x0c;
P6 = 0x0d;
delay(300); /*延时*/
SBUF1 = 0x61; /*发送字符 a*/
while(SCON1&0x02==0); /*发送中断模式是否产生*/
SCON1 = SCON1&0xfd; /*清发送中断标志*/
delay(3000); /*延时*/
P7 = 0x61; /*显示发送的字符*/
P6 = 0x0c;
P6 = 0x0d;
SBUF1 = 0x62; /*发送字符 b*/
while(SCON1&0x02==0); /*发送中断模式是否产生*/
SCON1 = SCON1&0xfd; /*清发送中断标志*/
delay(3000); /*延时*/
P7 = 0x62; /*显示发送的字符*/
P6 = 0x0c;
P6 = 0x0d;
SBUF1 = 0x63; /*发送字符 c*/
while(SCON1&0x02==0); /*发送中断模式是否产生*/
SCON1 = SCON1&0xfd; /*清发送中断标志*/
delay(3000); /*延时*/
P7 = 0x63; /*显示发送的字符*/
P6 = 0x0c;
P6 = 0x0d;
SBUF1 = 0x64; /*发送字符 d*/
while(SCON1&0x02==0); /*发送中断模式是否产生*/
SCON1 = SCON1&0xfd; /*清发送中断标志*/
delay(3000); /*延时*/
P7 = 0x64; /*显示发送的字符*/
P6 = 0x0c;
P6 = 0x0d;
while(1){
_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 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 + -