?? wrs485r.#3
字號:
//文件名: 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 + -