我想通过串口通信发送1的时候第一个LED灯亮,第二个LED灯灭,第三个LED等闪烁三十次 这个程序哪里错了啊?
解决时间 2021-02-27 18:06
- 提问者网友:世勋超人
- 2021-02-27 00:29
#include
#include
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
unsigned char flag,i,a;
unsigned int x;
unsigned char code table[]="DONE";
void start()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void delay(unsigned int y)
{
for(;y>0;y--)
for(x=0;x++;x<1000);
}
void main()
{
start();
while(1)
{
if(flag==1)
{
ES=0;
if(a==1)
{
P1_0=0;
for(i=0;i<30;i--)
{
P1_2=0;
delay(1000);
P1_2=1;
delay(1000);
}
for(i=0;i<4;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
flag=0;
ES=1;
}
}
}
}
void ver() interrupt 4
{
RI=0;
a=flag;
flag=1;
}
最佳答案
- 五星知识达人网友:怙棘
- 2021-02-27 01:02
void ver() interrupt 4
{
RI=0;
a=flag;
flag=1;
}
这个中断程序有问题,无论你发的是1还是其他任何数,在中断函数里面的a和flag的值都没有发生改变,我想你要表达的意思应该是a=SBUF;
然后你可以在主程序里面用
switch....case语句,这样你就可以通过发不同的数据,控制不同的LED灯状态了
全部回答
电脑上,你是用什么软件发送数据的看用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送的0,1,是以什么数据格式发送的,通常以字符格式发送的,即是ascii码。所以,单片机接收时,也要按字符格式发才行。而你的程序是按十六进制数的格式判断的,也就是二进制数,所以,发送和接收格式不统一,单片机就不能正常接收控制led0,也就不能正常返回数据。
if(sbuf==0) //这是按二进制数接收的
if(sbuf==1) //这也是按二进制数接收的
这样写程序,要求电脑上,要按二进制数即十六进制数发送才行。
还是按字符格式收发比较好。
这样,程序改一下就行了。
if(sbuf==‘0’) //这就是按字符接收的
if(sbuf==‘1’) //这也是按字符接收的
其它行不用动。
这样,收发比较可靠。
我要举报
大家都在看
推荐资讯