一,程序设计的思路与框架
在上一个程序中我们实现了向上位机发送的都是为单个字符,这次需要向单片机发送一个字符串。需要建立一个发送字符串的函数。将字符串分成当个字符,使用发送单个字节的函数进行发送。
在接收上位机指令的处理是这道题目比较关键的部分,如何把接收到的信息,进行区分成多个状态指令。
二,代码部分
#include <reg52.h>
sfr AUXR=0X8E;
void SendString(unsigned char *str);
void HC138(unsigned char t)
{
switch(t)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
}
}
void Inisystem()
{
HC138(5);
P0=0x00;
HC138(4);
P0=0xff;
}
void Uart()
{
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
SCON=0X50;
AUXR=0X00;
EA=1;
ES=1;
}
unsigned char command=0x00;
void Service() interrupt 4
{
if(RI==1)
{
command=SBUF;
RI=0;
}
}
void Work()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
P0=(P0 | 0x0f) & ((~command)| 0xf0);
command=0x00;
break;
case 0xb0:
P0=(P0 | 0xf0) & (((~command)<<4)| 0x0f);
command=0x00;
break;
case 0xc0:
SendString("The system is running...");
command=0x00;
break;
}
}
}
void Send(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
Send(*str++);
}
}
void main()
{
Inisystem();
Uart();
SendString("Welcome to XMF system!");
while(1)
{
Work();
}
}
向上位机发送字符串是题目的重点,通过SendString()这个函数来实现。接收一个字符串的首个地址,通过指针来对字符串进行操作,使用while(*str !='\0')函数来确认函数是否到了最后一位,把第一位发送到Send后,*str++移动到第二位字符的地址,往复如此直到最后一位。
Work函数实现对接收指令command进行处理,首先if判断是否接收到数据,采用switch取接收状态,所以把低四位置0。确认状态后根据把command进行处理成相应的值赋给P0。该代码执行的结果需要用LED来实现,需要开启相应的寄存器。