标题:
新手请教一下单片机串口PC通信控制灯的问题
[打印本页]
作者:
LIPPPP
时间:
2017-6-18 00:56
标题:
新手请教一下单片机串口PC通信控制灯的问题
新手自学到串口通信那部分,用了教程里面的发送a数据的串口通信程序例子,串口调试助手可以显示数据a。然后我自己尝试写了,当a = 0x01 led亮,但是串口调试助手有显示接收到的数据,可是开发板的灯却没亮。 下面是程序,先谢谢论坛中的为我解答的人
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define LED P1
uchar dat,num = 0,a=0;
uchar ON = 0;
uchar OFF = 1;
sbit led1 = P1^0;
void initial_com();
void delay(unsigned int z); // 忽略这延时,本来还想用串口通信实现呼吸流水之类的,现在连灯亮都不行
void delay2(unsigned int t);
void initial_com(void)
{ SCON = 0x50;
TMOD|= 0x20; //设置波特率 9600
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
REN = 1; //串口初始化
SM0 = 0;
SM1 = 1;
EA = 1;
ES = 0; //串口中断开启位
SBUF = 0x01; //开发板开关开启接收到,01 FF数据
while(!TI);
TI = 0;
ES = 1;
}
void main()
{
initial_com();
while(1)
{
if(num==1)
{
ES = 0;
num = 0;
SBUF = a; //
while(!TI);
TI = 0;
ES = 1;
}
}
}
void ser() interrupt 4
{
RI=0;
a = SBUF;
// ES=0; //关闭串口中断
num=1;
/*在调试助手上确实可以显示接收到 0x01 ,但是灯没亮*/
if(a == 0x01)
{
led1 = 0;
}
if(a == 0x02)
{
led1 = 1;
}
}
复制代码
作者:
HC6800-ES-V2.0
时间:
2017-6-18 09:27
我用你的程序,在我的板子上试验了一下,完全是正确的。输入HEX的数据1,可以开灯,输入HEX的数据2,可以关灯。
可能你的问题是:
我读你程序时,特别注意了你的判断用的数据类型——HEX十六进制数据类型,所以,串口通讯实验时,我特地将输入的选项,设置为HEX,所以是成功的。
如果你输入的数据类型是字符型,输入、输出看起来都是1,但单片机可不那么想,‘1’和0x01是不同的。
你注意一下,返回的是01,则说明输入的1是十六进制数据,若返回的是1,就是输入的字符数据。
切切!数据类型在串口通讯中控制时,重要!!!
作者:
LIPPPP
时间:
2017-6-18 21:51
HC6800-ES-V2.0 发表于 2017-6-18 09:27
我用你的程序,在我的板子上试验了一下,完全是正确的。输入HEX的数据1,可以开灯,输入HEX的数据2,可以关 ...
原来如此!!! 我搞了好久不知道哪里出错。我这 新手确实好多小细节都没弄懂,学习学习了。
作者:
yzwzfyz
时间:
2017-6-18 23:19
执行“SBUF = 0x01; //开发板开关开启接收到,01 FF数据”,是向串口发送一个01,发完后会产生一个中断,程序转入中断服务去。
在中断服务程序中你:“a = SBUF;” -----由于SBUF中原来没有一个确定的数据(发送的SBUF与接收的SBUF是不同的,请你认真仔细读单片机手册),所以a不知道是等于什么,=01的可能性为1/256。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1