实验内容
在pc端的串口调试助手中发送1,LED全亮;发送2,LED全闪烁;发送3,LED1~LED17流水;发送4,LED17-LED1流水。
思路分析
需要用到中断服务函数,检测发送过来的是什么
如果要实现在pc的串口调试助手发送一个字符,在pc端可以显示相应的字符:
大致过程就是先将单片机中SBUF的值取出到receiveData,表示数据已经被接收,然后清除接收中断标志位(需要手动清0)。
再将取到的数据送入SBUF发送出去,等到数据发送完成,清除发送完成标志位。
如果不需要在pc端显示的话,就不用再将数据发送回去。直接先手动清0,取出SBUF中的数据即可。
代码实现
#include<reg52.h>
#include<intrins.h>
unsigned char receiveData;
unsigned char a;
unsigned char b;
sbit led17=P3^6;
void UsartInit();
void Delay(unsigned int x);
void Full();//全亮
void Null();//全灭
void dispa();
void dispb();
void main()
{
UsartInit();
while(1)
{
switch(receiveData)
{
case '1':
Full();
break;
case '2':
Null();
break;
case '3':
a=0x7f;
b=0xfe;
dispa();
break;
case '4':
a=0x7f;
b=0xfe;
dispb();
break;
default:
break;
}
}
}
void UsartInit()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF4;
TL1=0XF4;
ES=1;
EA=1;
TR1=1;
}
void Usart() interrupt 4
{
RI=0;//手动清零
receiveData=SBUF;
}
void Delay(unsigned int x)
{
unsigned int j;
for(;x>0;x--){
for(j=110;j>0;j--);
}
}
//全亮
void Full()
{
P0=0x00;
P2=0x00;
led17=0;
}
//闪烁
void Null()
{
//灭
P0=0xff;
P2=0xff;
led17=1;
Delay(1000);
//亮
P0=0x00;
P2=0x00;
led17=0;
Delay(1000);
//灭
P0=0xff;
P2=0xff;
led17=1;
//Delay(10000);
}
//顺时针流水
void dispa()
{
unsigned int i=0;
while(i<17)
{
//控制D1~D8的流水
if(i<8&&i>=0)
{
P2=a;
Delay(300);
a=_cror_(a,1);
}
//D17
if(i==8)
{//i=0;
P2=0xff;
led17=0;
Delay(300);
led17=1;
}
//控制D16~D9的流水
if(i>8)
{
P0=b;
Delay(300);
b=_crol_(b,1);
if(i==16)
{
P0=0xff;
}
}
i++;
}
}
//逆时针流水
void dispb()
{
unsigned int i=0;
while(i<17)
{
//控制D9~D16的流水
if(i<8&&i>=0)
{
P0=a;
Delay(300);
a=_cror_(a,1);
}
//D17
if(i==8)
{
P0=0xff;
led17=0;
Delay(300);
led17=1;
}
//控制D1~D8的流水
if(i>8)
{
P2=b;
Delay(300);
b=_crol_(b,1);
if(i==16)
{
P2=0xff;
}
}
//D17
i++;
}
}
实验效果
发送1,灯全亮;
然后发送2,可以看到灯先灭后亮再灭,达到一个闪烁的效果;
发送3和4,分别进行相应的流水。
串口调试助手控制心形灯