单片机串口 把单片机程序设置为接收到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;
}
} 展开
可是当我把程序改成 接收到 '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;
}
} 展开
2个回答
展开全部
首先需要说明一点
你在电脑端利用串口助手发送的 1,是以字符形式发送的,并不是纯数字
然而单片机中,接收的只能是字符或十六进制数,所以一般的串口助手上
同样只能选择字符或十六进制数,所以不能直接发送数值型数据
如果你想发送数字,那么就要在单片机中进行格式转换,或直接使用十六进制数表示
单片机中字符的表达方式就是用两个单引号括起来 ' '
所以你的语句 if(myKEY == '1') 是可以成立的,但其表达的数值则是 31
你把数值31赋值给端口,就相当于把大于0的数值赋给端口,单片机中大于0的数值都属于 1
所以你的整个程序时成立的
另外你的串口接收中断函数中,写的有些麻烦,可以简化成下面这样
void int_int0(void) interrupt 4 //串口中断程序
{
myKEY = SBUF; //接收电脑发送过来的键盘值
while(!RI); //等待接收完成,最好是加入这个命令,以免出错
RI = 0; //不用特意去判断 RI,这是中断,只有数据来的时候才会进入此函数
}
你在电脑端利用串口助手发送的 1,是以字符形式发送的,并不是纯数字
然而单片机中,接收的只能是字符或十六进制数,所以一般的串口助手上
同样只能选择字符或十六进制数,所以不能直接发送数值型数据
如果你想发送数字,那么就要在单片机中进行格式转换,或直接使用十六进制数表示
单片机中字符的表达方式就是用两个单引号括起来 ' '
所以你的语句 if(myKEY == '1') 是可以成立的,但其表达的数值则是 31
你把数值31赋值给端口,就相当于把大于0的数值赋给端口,单片机中大于0的数值都属于 1
所以你的整个程序时成立的
另外你的串口接收中断函数中,写的有些麻烦,可以简化成下面这样
void int_int0(void) interrupt 4 //串口中断程序
{
myKEY = SBUF; //接收电脑发送过来的键盘值
while(!RI); //等待接收完成,最好是加入这个命令,以免出错
RI = 0; //不用特意去判断 RI,这是中断,只有数据来的时候才会进入此函数
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询