x01 单片机接收到之后将0x01赋值给P0 发送0x01 0x03 单片机收到后则将0x03赋值给P1,以此类推。也就是说前面的数据为地址,决定后面数据复制给谁!
求程序!
#definde uchar unsigned char
uchar cont=0;
uchar data,com;
uchar flag=0;
sbit out1=P0^1;
sbit out2=P0^2;
sbit out3=P0^3;
void init()
{
TMOD=0x20;
TH1=0xfd;
TH1=TL1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void UARTInterrupt() interrupt 4
{
RI=0;
TI=0;
cont++;
if(cont==1)//为1时进入
{
com=SBUF;
}
else
{
data=SBUF;
cont=0;
flag=1;
}
}
void main()
{
init();
while(1)
{
if(flag)
{
switch(com)
{
case 0x01:
switch(data)
{
case 0x01:
out1=~out1;
break;
case 0x02:
out2=~out2;
break;
case 0x03:
out3=~out3;
break;
}
break;
case 0x02:
P1=data;
break;
case 0x03:
P2=data;
break;
case 0x04:
P3=data;
break;
}
}
}
}
cont移位操作在程序中有什么作用呢?
还有就是在串口中断中,执行的语句较多,是否会引起第一次串口中断还没有执行完,下一个串口中断申请已经开始?
我模仿你的语句加上实际情况改写了一下程序,请帮忙看看是否有问题,能不能达到目的?
cont位移操作是作为标示符,并没有特殊意义。也就是让cont不等于0认为是第二次接收数据。
9600波特率处理这点还不至于堵塞中断通道。单片机是按微秒级运算的,串口的速度是1/9600*10
1秒 ÷ 9600位 x 8位数据1起始位1停止位 = 0.0010417s = 1.04ms
1.04ms已经足够单片机处理完这些内容了
看上去可以