实验平台: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;
}
}