在使用串口通讯,为了更好的用好串口,我们往往会遇到更加复杂的代码,这一节就是比较正常的利用串口通讯来传输一些信息。
我们先看这道题目,这道题目由三个部分组成,需要发送三类信息,用到的知识点也是之前就学到的,但这次,我们将更加综合的利用他们。
首先,我们根据题目要求先将蜂鸣器与继电器等工具关闭,一些最最基础的代码函数请在最后面查看,相关解析在前面的文章里。
void InitSystem()//关闭蜂鸣器和继电器
{
Select573(5);
P0 = 0x00;
Select573(4);
P0 = 0xff;
}
在这次的题目中,我们需要发送字符串,在这里老师使用到了指针而我还没学到,所以就大概了解一下就好,等我学到,我再回来补上。(感觉*str是一种遍历?在字符串里面从第一个字符遍历到最后一个,也就是\0)
void SendDat(unsigned char n)
{
SBUF = n;
while(TI == 0);
TI = 0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendDat(*str++);
}
}
接着就是本讲的绝对重点,首先,我们先确定一下上位机(普遍意义上可以直接指的就是PC)发送的值不是0x00,然后我们将输入的值与上0xf0,保留了前四位,接着用switch语句选择。
在选择以后,我们可以有两种选择去点亮灯,第一种是利用if语句,这样代码比较直观但是也比较长。第二种是重点学习内容,简洁但是不宜读懂,但是必须得读懂。
由于51单片机是低电平也就是0启动,所以我们输入的数据和我们实际要展现的小灯是相反的,所以,我们可以先对数据进行取反,然后我们在利用或与门的知识,就可以直接让小灯按要求亮,这里需要一定的计算量,但是核心永远是下面的那俩句。
由于高四位为b时是要让L5到L8亮,所以,我应该让取反以后的dammand左移4位,那么低四位就会变成高四位了。再根据方法也能让对应的小灯亮
而第三部分,c0部分,在显示字符串以后,我们需要将dammand清零,否则,他会不断重复的发出这段字符串
0与任何数与都是0,f与任何数与都是任何数,0和任何数或都是任何数,f和任何数与都是0
unsigned char dammand = 0x00;
void Working()
{
if(dammand != 0x00)
{
switch(dammand & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~dammand | 0xf0);
break;
case 0xb0:
P0 = (P0 | 0xf0) & (~dammand << 4 | 0x0f);
break;
case 0xc0:
SendString("The system will run!\r\n");
dammand = 0x00;
break;
}
}
于是总结写下来,全部代码就是这些啦!
#include "reg52.h"
sfr AUXR = 0x8e;
void Select573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void InitSystem()//关闭蜂鸣器和继电器
{
Select573(5);
P0 = 0x00;
Select573(4);
P0 = 0xff;
}
void InitUART()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
SCON = 0x50;
AUXR = 0x00;
TR1 = 1;
EA = 1;
ES = 1;
}
void SendDat(unsigned char n)
{
SBUF = n;
while(TI == 0);
TI = 0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendDat(*str++);
}
}
unsigned char dammand = 0x00;
void ServeUART() interrupt 4
{
if(RI == 1)
{
RI = 0;
dammand = SBUF;
}
}
unsigned char dammand = 0x00;
void Working()
{
if(dammand != 0x00)
{
switch(dammand & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~dammand | 0xf0);
break;
case 0xb0:
P0 = (P0 | 0xf0) & (~dammand << 4 | 0x0f);
break;
case 0xc0:
SendString("The system will run!\r\n");
dammand = 0x00;
break;
}
}
}
void main()
{
InitSystem();
InitUART();
SendString("Welcome to XMF system!\r\n");
while(1)
{
Working();
}
}