单片机串口 把单片机程序设置为接收到1时亮灯,灯不亮,为什么把程序改成 接收到 '1' 就可以亮了?

RT,我在单片机串口中,把单片机程序设置为接收到1时亮灯,通过串口调试助手我发送过去一个1,但是灯不亮。可是当我把程序改成接收到'1'时再输入1就可以亮了?接收数据的变量... RT,我在单片机串口中, 把单片机程序设置为接收到1时亮灯,通过串口调试助手我发送过去一个 1, 但是灯不亮。
可是当我把程序改成 接收到 '1' 时 再输入1 就可以亮了?
接收数据的变量是用 unsigned int 定义的
那如果说我一定要实现 输入数字1使灯亮,应该怎么做?

下面是源程序:

#include <reg52.h>

sbit LED=P0^0;
unsigned int myKEY; //存放电脑发送过来的按键

void main()
{
SCON = 0xD0; //串口工作模式3,允许接收
TMOD = 0x20; //定时器1工作模式2
ES = 1; //允许串口中断
EA = 1; //允许CPU中断
TH1 = 0xFD; //定时器初值,波特率:9600bps
TL1 = 0xFD;
TR1 = 1; //启动定时器

P0 = 0xFF;

while(1)
{

if(myKEY == '1') //
{
LED = 0; //P0.1连接LED的阴极
}
else
{
LED = 1;
}
}
}

void int_int0(void) interrupt 4 //串口中断程序
{
if(RI) //如果是接收中断
{
myKEY = SBUF; //接收电脑发送过来的键盘值
RI = 0;
}
else
{
TI = 0;
}
}
展开
 我来答
休闲居大伟
2014-12-18 · TA获得超过5419个赞
知道大有可为答主
回答量:6865
采纳率:91%
帮助的人:1.1亿
展开全部
首先需要说明一点

你在电脑端利用串口助手发送的 1,是以字符形式发送的,并不是纯数字

然而单片机中,接收的只能是字符或十六进制数,所以一般的串口助手上

同样只能选择字符或十六进制数,所以不能直接发送数值型数据

如果你想发送数字,那么就要在单片机中进行格式转换,或直接使用十六进制数表示

单片机中字符的表达方式就是用两个单引号括起来 ' '

所以你的语句 if(myKEY == '1') 是可以成立的,但其表达的数值则是 31

你把数值31赋值给端口,就相当于把大于0的数值赋给端口,单片机中大于0的数值都属于 1

所以你的整个程序时成立的

另外你的串口接收中断函数中,写的有些麻烦,可以简化成下面这样

void int_int0(void) interrupt 4 //串口中断程序
{
myKEY = SBUF; //接收电脑发送过来的键盘值
while(!RI); //等待接收完成,最好是加入这个命令,以免出错
RI = 0; //不用特意去判断 RI,这是中断,只有数据来的时候才会进入此函数
}
查晓筠0i5
2014-12-18 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4953万
展开全部

需要帮你做设计吗

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式