单片机串口控制LED亮灭:
我要实现在PC端输入0,LED0亮,输入1,LED0灭,输入其他不做任何动作,如下编程是否可以?怎么有时候收不到返回的数据?有类似命令行cmd的串口工具吗?#includ...
我要实现在PC端输入0,LED0亮,输入1,LED0灭,输入其他不做任何动作,如下编程是否可以?怎么有时候收不到返回的数据?有类似命令行cmd的串口工具吗?
#include <reg51.h>
#include <string.h>
sbit LED0=P2^0; //P2.0口接led0,开机常亮,发送任意指令后熄灭;
/*******串口通信初始设定*******/
void init_serialcom( void )
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD = 0x20 ; //定时器设定,为模式2,8位,自动重装
TH1 = TL1= 0xFA ; //定时器设定,Baud:9600 fosc="11".0592MHz
PCON = 0x80 ; //SMOD=1;
EA=1; //中断设定,因为总中断开关是控制所有中断的,所以要把它打开
ES=1; //中断设定,允许串口收到数据后产生中断通知我们
TR1 = 1 ; //定时器设定,启动定时器,串口开始工作
}
/*******MCU发送一个字符给PC*******/
void send_char( unsigned char ch)
{
SBUF=ch;
while (TI==0);
TI=0;
}
/*******MCU发送一个字符串给PC*******/
void send_string(unsigned char *cp)
{
ES=0;
while(*cp)
{
send_char(*cp);
cp++;
}
ES=1;
}
/*******PC向MCU发送中断指令,MCU处理指令*******/
void serial () interrupt 4 using 3
{ ES=0;
if (RI)
{
RI=0 ;
if(SBUF==0)
{LED0=0;
send_string("LED on...\r\n"); //串口向终端发送字符串,结尾处回车换行
}
if(SBUF==1)
{LED0=1;
send_string("LED off...\r\n"); //串口向终端发送字符串,结尾处回车换行
}
ES=1;
}
}
/*******主程序*******/
void main()
{
init_serialcom(); //初始化串口
while ( 1 ) //空循环,什么都不做,等待串口中断
{
}
} 展开
#include <reg51.h>
#include <string.h>
sbit LED0=P2^0; //P2.0口接led0,开机常亮,发送任意指令后熄灭;
/*******串口通信初始设定*******/
void init_serialcom( void )
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD = 0x20 ; //定时器设定,为模式2,8位,自动重装
TH1 = TL1= 0xFA ; //定时器设定,Baud:9600 fosc="11".0592MHz
PCON = 0x80 ; //SMOD=1;
EA=1; //中断设定,因为总中断开关是控制所有中断的,所以要把它打开
ES=1; //中断设定,允许串口收到数据后产生中断通知我们
TR1 = 1 ; //定时器设定,启动定时器,串口开始工作
}
/*******MCU发送一个字符给PC*******/
void send_char( unsigned char ch)
{
SBUF=ch;
while (TI==0);
TI=0;
}
/*******MCU发送一个字符串给PC*******/
void send_string(unsigned char *cp)
{
ES=0;
while(*cp)
{
send_char(*cp);
cp++;
}
ES=1;
}
/*******PC向MCU发送中断指令,MCU处理指令*******/
void serial () interrupt 4 using 3
{ ES=0;
if (RI)
{
RI=0 ;
if(SBUF==0)
{LED0=0;
send_string("LED on...\r\n"); //串口向终端发送字符串,结尾处回车换行
}
if(SBUF==1)
{LED0=1;
send_string("LED off...\r\n"); //串口向终端发送字符串,结尾处回车换行
}
ES=1;
}
}
/*******主程序*******/
void main()
{
init_serialcom(); //初始化串口
while ( 1 ) //空循环,什么都不做,等待串口中断
{
}
} 展开
4个回答
展开全部
电脑上,你是用什么软件发送数据的?用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送的0,1,是以什么数据格式发送的,通常以字符格式发送的,即是ASCII码。所以,单片机接收时,也要按字符格式发才行。而你的程序是按十六进制数的格式判断的,也就是二进制数,所以,发送和接收格式不统一,单片机就不能正常接收控制LED0,也就不能正常返回数据。
if(SBUF==0) //这是按二进制数接收的
if(SBUF==1) //这也是按二进制数接收的
这样写程序,要求电脑上,要按二进制数即十六进制数发送才行。
还是按字符格式收发比较好。
这样,程序改一下就行了。
if(SBUF==‘0’) //这就是按字符接收的
if(SBUF==‘1’) //这也是按字符接收的
其它行不用动。
这样,收发比较可靠。
if(SBUF==0) //这是按二进制数接收的
if(SBUF==1) //这也是按二进制数接收的
这样写程序,要求电脑上,要按二进制数即十六进制数发送才行。
还是按字符格式收发比较好。
这样,程序改一下就行了。
if(SBUF==‘0’) //这就是按字符接收的
if(SBUF==‘1’) //这也是按字符接收的
其它行不用动。
这样,收发比较可靠。
更多追问追答
追问
感谢,我改成如下是否也可以:
if(SBUF==0x30) //这就是按字符接收的
if(SBUF==0x31) //这也是按字符接收的
追答
这样改当然也行了,其实0x30就是字符0的ASCII码,0x31是字符1的ASCII码.
但是这样写程序不好懂,写成'0' , '1' ,程序更容易懂。
展开全部
你好!如果实现这个功能,你的程序有点复杂化了
追问
有更简单的方法吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单
追答
如果需要可以教你!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
同学,你好,你先要跟我说下你那些k是低电平有效还是高电平效。还有led是底电平亮还是高电平亮。k与led是通过那些i/o口与单片机连在一起的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询