📄 source1.#2
字号:
#include <c8051f020.h>
#define BAUDRATE 9600 /*UART0的波特率*/
#define SYSCLK 11059200 /*系统时钟*/
sbit buz = P2^5;
bit ReceiveBit; /*接收标志位*/
unsigned char temp;
void delay(unsigned int m)
{
unsigned int n;
n=0;
while(n < m)
{n++;}
return;
}
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*打开外部晶体振荡器*/
for (i=0; i < 256; i++); /*延时*/
while (!(OSCXCN & 0x80)); /*查询外部晶体是否稳定起振*/
OSCICN = 0x88; /*用外部晶体作为系统时钟,并使能时钟丢失检测*/
}
void PORT_Init (void)
{
XBR0 |= 0x17; // Enable CEX0 on P0.0
XBR1 |= 0x00;
XBR2 |= 0x44; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x1D; // enable P0.0 as a push-pull output
P1MDOUT = 0xFD; // Output configuration for P1
P2MDOUT = 0x00; // Output configuration for P2
P3MDOUT = 0x00; // Output configuration for P3
P74OUT = 0x00; // Output configuration for P4-7
P1MDIN = 0xFF; // Input configuration for P1
P5 = 0xFF;
}
void UART0_Init (void)
{
SCON0 = 0x50; /*SCON0:模式1,8位UART,时能RX*/
TMOD = 0x20; /*TMOD: 定时器工作再模式2, 8位重载*/
TH1 = -(SYSCLK/BAUDRATE/16); /*设置定时1用作波特率的重载值*/
TR1 = 1; /*开定时器1*/
}
/*串口中断0子程序*/
void UART0_ISR (void) interrupt 4 using 3
{
if(RI0 == 1) //是发送中断还是接收中断
{
RI0 = 0; /*清接收标志位*/
temp =SBUF0; /*保存接收到的数据*/
ReceiveBit=1; /*置接收标志*/
}
TI0 = 0; /*清发送标志位*/
}
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main(void)
{
unsigned char i;
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
ReceiveBit=0;
SYSCLK_Init(); /*初始化系统时钟*/
PORT_Init(); /*初始挂交叉开关和I/O口*/
UART0_Init(); /*初始化UART0*/
EA=1; //开中断
ES0=1;
while(1)
{
while (ReceiveBit==1) /*是否接收到一个数据*/
{
ES0=0; /*关串口中断0*/
EA=0; /*关总中断*/
ReceiveBit=0; /*清接收标志位*/
delay(60000); /*延时*/
delay(60000);
delay(60000);
SBUF0=temp; /*将接收到数据送出*/
while(TI0==0); /*发送标志位是否产生*/
TI0=0; /*清发送标志位*/
buz=0;
for(i=0; i<3; i++) /*延时*/
{
delay(60000);
}
buz=1;
ES0=1; /*开中断标志*/
EA=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -