您当前的位置: 首页 >  liyatjj 单片机

C51单片机串口调试助手控制心形灯

liyatjj 发布时间:2022-10-07 11:22:33 ,浏览量:4

实验内容

在pc端的串口调试助手中发送1,LED全亮;发送2,LED全闪烁;发送3,LED1~LED17流水;发送4,LED17-LED1流水。

思路分析

需要用到中断服务函数,检测发送过来的是什么 如果要实现在pc的串口调试助手发送一个字符,在pc端可以显示相应的字符: 大致过程就是先将单片机中SBUF的值取出到receiveData,表示数据已经被接收,然后清除接收中断标志位(需要手动清0)。

再将取到的数据送入SBUF发送出去,等到数据发送完成,清除发送完成标志位。

如果不需要在pc端显示的话,就不用再将数据发送回去。直接先手动清0,取出SBUF中的数据即可。

代码实现
#include
#include
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(i8)
		{
			P0=b;
			Delay(300);
			b=_crol_(b,1);
			if(i==16)
			{
				P0=0xff;
			}
		}
		i++;
		}
}

//逆时针流水
void dispb()
{
	unsigned int i=0;
	while(i8)
		{
			P2=b;
			Delay(300);
			b=_crol_(b,1);
			if(i==16)
			{
				P2=0xff;
			}
		}
		//D17
		i++;
	}
}

	
实验效果

发送1,灯全亮; 然后发送2,可以看到灯先灭后亮再灭,达到一个闪烁的效果; 发送3和4,分别进行相应的流水。

串口调试助手控制心形灯

关注
打赏
1688896170
查看更多评论

liyatjj

暂无认证

  • 4浏览

    0关注

    99博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1477s