我想使用89S52单片机做一个控制LED灯的实验,要求为:PC通过串口工具发送指令控制单片机,让其点亮或熄灭LED即可;
我尝试过发单字节是可以实现的,比如发 00给单片机,LED灯亮,发FF,LED灯灭;
我现在的问题是:比如我要发送多个字节来控制LED灯就不行了,例如:发送“1b 30 01”LED1点亮,发送“1b 30 02” LED1熄灭,发送“1b 31 01”LED2点亮,发送“1b 30 02”LED2熄灭;
请问如何才能实现同时发送多字节及识别出来?最好有详细的代码,谢谢!
你好,我按你上面说的把代码加上去了,但是好像没有看到有效果喔?请帮忙指正,谢谢!
追答#include
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void input(unsigned char str)
{
static unsigned char cont;//接收计数
static unsigned char temp;//临时变量
switch(cont)
{
case 0:
if(str==0x1b)//检测第一个起始码
{cont=1;
return;}
case 1:
temp=str-0x30;//获取要点亮的LED号
temp=cont<<temp;
cont=2;
return;
case 2:
if(str-1)//判断点亮还是熄灭
P1|=temp;
else //P1口输出指定数据
P1&=~temp;
cont=0;
return;
}
}
void main(void)
{
InitUART();
while(1);
}
void UARTInterrupt(void) interrupt 4//串口中断
{
if(RI)
{
RI = 0;
input(SBUF);
}
else
TI = 0;
}
你好,我试了把你上面的代码下载到芯片里面测试,但好像LED灯不能受PC的控制喔,请帮忙指正,谢谢!
追答#include
#define uchar unsigned char
uchar getdat[16],getp,putp;
sbit LED=P1^0;
void serisr() interrupt 4
{
if(RI)
{
RI=0;
getdat[putp]=SBUF;
putp++;
putp&=0x0f;
}
}
main()
{
uchar comd[5],i;
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
getp=putp=0;
while(1)
{
if(getp!=putp)
{
if((getdat[getp]==0x1b)||(i>0))
{
comd[i]=getdat[getp];
i++;
}
getp++;
getp&=0x0f;
}
if(i==2)
{
i=0;
if((comd[0]==0x1b))&&(comd[1]==0x31)&&(comd[2]==0x01))LED=0;
if((comd[0]==0x1b))&&(comd[1]==0x30)&&(comd[2]==0x02))LED=1;
}
}