实验现象:
通过串口调试助手发送数字1~8,板子上面的对应指示灯亮。注意此处发送应选择文本模式发送。
实例代码:
cs
#include <STC15F2K60S2.H>
#define BUAD 9600 //所需波特率、
#define SYSTEMCLOCK 11059200L //系统时钟频率,L表示该数据为长整型
void uart_sendstring(unsigned char *str);
unsigned char flag; //数据接收标志位
char rin='1';
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
TMOD = 0x00; //设定定时器1为16位自动重装方式
TL1 = 65535-(SYSTEMCLOCK/4/BUAD); //设定定时初值与终值,固定模板
TH1 = (65535-(SYSTEMCLOCK/4/BUAD)>>8);
TR1 = 1; //启动定时器1
ES=1;
EA=1;
}
void main()
{
UartInit();
while(1)
{
if(flag)
{
flag=0;
switch(rin)
{
case '1':
{
P2=(P2&0x1f)|0x80;
P0=0xfe;
P2&=0x1f;
uart_sendstring('1');
}
break;
case '2':
{
P2=(P2&0x1f)|0x80;
P0=0xfd;
P2&=0x1f;
uart_sendstring('2');
}
break;
case '3':
{
P2=(P2&0x1f)|0x80;
P0=0xfb;
P2&=0x1f;
uart_sendstring('3');
}
break;
case '4':
{
P2=(P2&0x1f)|0x80;
P0=0xf7;
P2&=0x1f;
uart_sendstring('4');
}
break;
case '5':
{
P2=(P2&0x1f)|0x80;
P0=0xef;
P2&=0x1f;
uart_sendstring('5');
}
break;
case '6':
{
P2=(P2&0x1f)|0x80;
P0=0xdf;
P2&=0x1f;
uart_sendstring('6');
}
break;
case '7':
{
P2=(P2&0x1f)|0x80;
P0=0xbf;
P2&=0x1f;
uart_sendstring('7');
}
break;
case '8':
{
P2=(P2&0x1f)|0x80;
P0=0x7f;
P2&=0x1f;
uart_sendstring('8');
}
break;
default:
uart_sendstring("error\r\n"); //输入其他数据返回error
break;
}
ES=1;
}
}
}
//串口中断服务函数
void uart_Proc() interrupt 4
{
if(RI) //正在接收数据
{
RI=0; //需要手动赋0
rin=SBUF; //定时持续接收数据
ES=0;
flag=1;
}
}
//通过串口发送信息
void uart_sendstring(unsigned char *str)
{
unsigned char *p;
p=str;
while(*p!='\0')
{
SBUF=*p; //send
while(TI==0) //等待发送标志位
TI=0;
p++;
}
}
实验原理:
EA为总开关,ES为串行口中断开关 ,在使用串行口中断前必须闭合EA、ES,即EA=1;
ES=1;