题目:在CT107D单片机综合训练平台上,利用51单片机的串行接口与上位机建立数据传输信道。采用8位的UART模式,即模式1,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。
1、系统上电初始化之后,关闭蜂鸣器和继电器等无关设备,并向上位机发送字符串:“Welcome to XMF system!”,回车换行。
2、上位机通过串口发送单字节命令可以控制下位机的8个LED灯开关。
3、上位机通过串口发送单字节命令可以读取下位机运行信息。
4、通信规约如下表:
| 高4位 | 低4位 | 说明 | 控制灯光 | A | L4 | L3 | L2 | L1 | 低4位每位控制一个LED指示灯,0--关灯,1--开灯。如0xA3,打开L1和L2,关闭L3和L4。 | B | L8 | L7 | L6 | L5 | 读取信息 | C | 0 | 返回信息“The System is Running...”回车,换行。 |
注意:对于STC15F2K6052单片机,需要对AUXR寄存器(0X8e)配置。
#include "reg52.h"
sfr AUXR=0X8E;
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
//关闭所有无关设备
void initsystem()
{
HC138_A=1;
HC138_B=0;
HC138_C=1;
P0=0x00;//蜂鸣器
HC138_A=0;
HC138_B=0;
HC138_C=1;
P0=0xff;//关闭led
HC138_A=0;
HC138_B=1;
HC138_C=1;
P0=0X00;//关闭com端
}
//串口初始化(接收)
void init_uart()
{
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
SCON=0X50;
AUXR=0X00;
ES=1;
EA=1;
}
unsigned char command=0x00;
//串口中断函数(接收)
void service_uart() interrupt 4
{
if(RI==1) //接收
{
command=SBUF;
RI=0;
}
}
//发送
void send_byte(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
//发送字符串
void send_string(unsigned char *str)
{
while(*str!='\0')
{
send_byte(*str);
}
}
void working()
{
if(command!=0x00)
{
switch(command&0xf0)
{
case 0xa0:
P0=(P0|0X0F)&(~command|0XF0);
command=0x00;
break;
case 0xb0:
P0=(P0|0X0F)&((~command<<4)|0X0F);
break;
case 0xc0:
send_string("The System is Running...\r\n");
command=0x00;
break;
}
}
}
void main()
{
initsystem();
init_uart();
send_string("Welcome to XMF system!\r\n");
while(1)
{
working();
}
}
|