C51单片机串口通信
/*
####################################################
C51单片机串口通信控制与信号反馈
作者:nathen_zhang 博客:http://hi.baidu.com/nathen
将单片机与电脑串口相连,电脑发送数0~9到单片机,单片机相应的P2的0~7端口和P1的0~1端口将输出高(或低)电平,
发送'c'清除输出,发送'q'进行硬件检测,如果收到回复'a',则表示外接单片机工作正常.
用于控制继电器或发光工极管等,同时单片机还会将输入的数字反馈回电脑以进行成功接收的确认,
初始化步骤:
T1工作方式 TMOD=0x20 #设置定时器1工作方式为2,自动重装初值
T1初值 TH1=0xfd,TL1=0xfd #用11.0592MHz的晶振使用波特率为9600时误差为0,其初值为0xfd
启动T1 TR1=1 #控制寄存器TCON,启动T1
定义串口 SCON=0x50 #串口控制寄存器,0x50=01010000.
打开中断 EA=1,ES=1 #EA总中断,ES串口接收中断
两个标志位:
必须软件清零
TI:发送中断标志位
RI:接收中断标志位
####################################################
*/
// uart() interrupt 4 输入
// output() 输出
//##################################################
#include
unsigned char flag,din;//此处不能用宏定义
void init_uart()
{
TMOD=0x20; //串口工作于方式1,发送/接收1帧数据为10位,其中1位启始位,8位数据位和1位停止位
TR1=1;
TH1=0xfd; //波特率设为9600
TL1=0xfd;
SCON=0x50;
EA=1;
ES=1;
}
void output()
{
if(flag==1)
{
ES=0;
flag=0;
/* switch(din) //高电平控制方式输出
{
case 'c':P2=0;P3=0;break; //所有端口输出低电平(清除输出或关掉输出)
case '0':P2=0x01;break; //P2.0输出高电平
case '1':P2=0x02;break; //P2.1输出高电平
case '2':P2=0x04;break; //P2.2输出高电平
case '3':P2=0x08;break; //P2.3输出高电平
case '4':P2=0x10;break; //P2.4输出高电平
case '5':P2=0x20;break; //P2.5输出高电平
case '6':P2=0x40;break; //P2.6输出高电平
case '7':P2=0x80;break; //P2.7输出高电平
case '8':P1=0x01;P2=0;break; //P3.0输出高电平
case '9':P1=0x02;P2=0;break; //P3.1输出高电平
case 'q':din='a';break; //外设检测,用电脑发送字符"q",如果返回为"a",说明单片机工作正常.
}
*/
switch(din) //低电平控制方式输出
{
case 'c':P2=0xff;P1=0xff;break; //所有端口输出高电平(清除输出或关掉输出)
case '0':P2=0xfe;break; //P2.0输出低电平
case '1':P2=0xfd;break; //P2.1输出低电平
case '2':P2=0xfb;break; //P2.2输出低电平
case '3':P2=0xf7;break; //P2.3输出低电平
case '4':P2=0xef;break; //P2.4输出低电平
case '5':P2=0xdf;break; //P2.5输出低电平
case '6':P2=0xbf;
break; //P2.6输出低电平
case '7':P2=0x7f;break; //P2.7输出低电平
case '8':P2=0xff;P1=0xfe;break; //P3.0输出低电平
case '9':P2=0xff;P1=0xfd;break; //P3.1输出低电平
case 'q':din='a';break; //外设检测,用电脑发送字符"q",如果返回为"a",说明单片机工作正常.
}
SBUF=din;//返回响应值供测试工作状态用(输出SBUF缓冲,与输入的SBUF同地址但是是不同的两个寄存器)
while(!TI){;}
TI=0;
ES=1;
}
}
void main()
{
init_uart();
while(1)
{
output();
}
}
void uart() interrupt 4 //检测串口输入数据
{
RI=0;
din=SBUF; //将输入数据存到变量din
flag=1;
}