串口助手发送数据到单片机并显示在液晶上

实验平台:51开发板
实验人:阿辉
实验现象:串口助手发送一串数据,实现LED状态翻转
数据:
eb 01 30 00 00 39 ed
eb 02 30 00 00 39 ed

实验代码如下:

#include "reg52.h"
#include "lcd1602.h"
//typedef unsigned char  uchar;
//typedef unsigned int   uint;
//typedef unsigned long  ulong;

sbit LED1 = P1^0;
sbit LED2 = P1^2;

uchar BUF[10];		   //数据存储缓冲区
uchar Usart_Step;    //用来切换程序步
uchar Usart_Cnt;     //用来计数接收到数据的个数
uint  LED1_Date_Move;//用来了;累计计数
uint  LED2_Date_Move;

bit LED1_Flag;//LED状态
bit	LED2_Flag;

uchar temp_H,temp_L;

void Usart_Init(void)
{
	SCON = 0x50;
	TMOD |= 0x20;
	TL1 = TH1 = 0xfd;
	TR1 = 1;
	ES = 1;
	EA = 1;
}

void main(void)
{
	Usart_Init();
	LCD1602_Init();
	while(1)
	{
		if(LED1_Flag)//标记位为1时执行状态翻转
		{
			LED1_Flag = 0;
			LED1 = !LED1;
			if(LED1 == 0)
			{
				print(line_one,1,'L');
				print(line_one,2,'E');
				print(line_one,3,'D');
				print(line_one,4,'1');
				print(line_one,5,':');
				print(line_one,6,'O');
				print(line_one,7,'N');
				print(line_one,8,' ');
//				print(line_one,8,temp_H+0x30);
//				print(line_one,9,temp_L+0x30);
			}
			else
			{
				print(line_one,1,'L');
				print(line_one,2,'E');
				print(line_one,3,'D');
				print(line_one,4,'1');
				print(line_one,5,':');
				print(line_one,6,'O');
				print(line_one,7,'F');
				print(line_one,8,'F');
			}
		}
		if(LED2_Flag)//标记位为1时执行状态翻转
		{
			LED2_Flag = 0;
			LED2 = !LED2;
			if(LED2 == 0)
			{
				print(line_two,1,'L');
				print(line_two,2,'E');
				print(line_two,3,'D');
				print(line_two,4,'2');
				print(line_two,5,':');
				print(line_two,6,'O');
				print(line_two,7,'N');
				print(line_two,8,' ');
			}
			else
			{
				print(line_two,1,'L');
				print(line_two,2,'E');
				print(line_two,3,'D');
				print(line_two,4,'2');
				print(line_two,5,':');
				print(line_two,6,'O');
				print(line_two,7,'F');
				print(line_two,8,'F');
			}
		}
	}
}

void USART_IRQ() interrupt 4
{
	if(RI)			 								//接收中断标记位
	{
		 RI = 0;	 								//清除中断标记
		 switch(Usart_Step)       
		 {
		 		case 0:								//进入程序步0
				{
					 BUF[0] = SBUF;     //缓冲区接收第一个数
					 if(BUF[0] == 0xeb) //判断是不是数据头
					 {
					 		BUF[0] = 0;		  //清除以便下次接收数据
							Usart_Cnt = 1;  //计数加1
							Usart_Step = 1; //切换到程序步1
					 }
				}break;								
				case 1:								//进入程序步1
				{
					 BUF[Usart_Cnt] = SBUF;//将剩余的数据传送到缓冲区
					 Usart_Cnt++;					 //计数累加
					 if(Usart_Cnt >= 7)		 //当加到7个数时
					 {
					 		if(BUF[6] == 0xed) //判断数据尾是不是为0xed
							{
								 BUF[6] = 0;		 //清零数据尾,方便下次接收
								 switch(BUF[1])	 //选择不同BUF【1】执行不同的功能
								 {
								 		case 0x01:	 //数据0x01时
										{
											LED1_Date_Move =  BUF[2];
											LED1_Date_Move =  LED1_Date_Move<<8;
											LED1_Date_Move += BUF[5];//上面的三个步骤负责累加数值 0x30<<8+0x39(十六进制)=12345(十进制)
											if(LED1_Date_Move == 12345)//判断累加数据是否为12345,进而准确接收数据位,当然我这没有写接收两个数据位实现什么
											{
												LED1_Flag = 1;//让标记位为1
												temp_L = BUF[4];
												temp_H = BUF[3];
											}
										}break;
										case 0x02:
										{
											LED2_Date_Move =  BUF[2];
											LED2_Date_Move =  LED2_Date_Move<<8;
											LED2_Date_Move += BUF[5];//上面的三个步骤负责累加数值 0x30<<8+0x39(十六进制)=12345(十进制)
											if(LED2_Date_Move == 12345)//判断累加数据是否为12345,进而准确接收数据位,当然我这没有写接收两个数据位实现什么
											{
												LED2_Flag = 1;//让标记位为1
											}
										}break;
								 }
							}Usart_Step = 0;//数据解析完后,返回程序步0,执行下一帧数据
					 }break;
				}
		 }
	}
	else 
	{
		TI = 0;
	}
}


  • 7
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值