很简单的一个串口应用的小程序。主要功能是利用上位机,通过串口发送特定指令1-8的数字,来操控MCU进行动作,完成开关LED灯的目的。1-8的数字对应1-8个LED灯。同一时间只有一个LED灯被打开。
此代码在protues7.5下测试通过。用到了串口助手,虚拟串口serialnull软件,并虚拟了COM3,COM4,MCU使用的是COM3,串口助手使用的是COM4。
重要:MCU不能直接输出中文。特定指令1-8为数字,发送给MCU后,保存为字符,并不是立即数。所以case 这里写法为'1' 需要单引号。否则得不到相关结果。
------------------------------------------------------------------
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
unsigned char flag; //标志位,用来判断是否进入RXD中断
unsigned char data_temp; //SBUF数据转存
void init() //串口,波特率初始化9600bps
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;//初始化串口
EA=1;
ES=0; //防止进入TXD中断,先关闭ES ,为给上位机发送提示信息做准备
TI=1;
printf("please enter number:1-8,they are contrl 1-8 LED:/n"); //发送上位机提示信息,供用户选择。
while(!TI);
TI=0;
ES=1;
// P2=0xff;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0; //关ES,防止TXD产生中断
flag=0;
TI=1;
switch(data_temp) //根据data_temp内容进行开Led操作。
{
case '1':
P2=0xfe; //开Led1
printf("1# LEd is opened!/n");
break;
case '2':
P2=0xfd; //开led2
printf("2# LEd is opened!/n");
break;
case '3':
P2=0xfb;
printf("3# LEd is opened!/n");
break;
case '4':
P2=0xf7;
printf("4# LEd is opened!/n");
break;
case '5':
P2=0xef;
printf("5# LEd is opened!/n");
break;
case '6':
P2=0xdf;
printf("6# LEd is opened!/n");
break;
case '7':
P2=0xbf;
printf("7# LEd is opened!/n");
break;
case '8':
P2=0x7f;
printf("8# LEd is opened!/n");
break;
default:
printf("ERROR/n");
break;
}
while(!TI); //判断是否完成用户操作
TI=0;
ES=1; //开中断,允许RXD产生中断,接收用户命令。
}
}
}
void s_int() interrupt 4 //RXD中断处理。
{
RI=0;
data_temp=SBUF;
flag=1;
}
