标题: 51单片机 实现不了串口双向数据通信 [打印本页]
作者: 单片机小白。。 时间: 2016-6-22 12:34
标题: 51单片机 实现不了串口双向数据通信
这是我的程序,问题在哪里呢?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void send(uint num)
{
SBUF=num;
while(!TI);
RI=0;
}
void matrixkeyscan()
{ uint num;
if(key1==0)
delayms(100);
{
if(key1==0)
{
num=num+1;
if(num==1000)
{
num=0;
}
}
}
if(key2==0)
delayms(100);
{
if(key2==0)
{
num=num-1;
if(num==0)
{
num=1000;
}
}
}
send(num);
}
void display(uint num)
{ uint bai,shi,ge;
bai=num/100;
shi=num%100/10;
ge=num%10;
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
}
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
matrixkeyscan();
}
}
void ser() interrupt 4
{
uint a;
RI=0;
a=SBUF;
display(a);
}
作者: gaozhaohong 时间: 2016-6-22 12:55
为什么不设置串口寄存器呢?
作者: ahshmj 时间: 2016-6-22 15:49
本帖最后由 ahshmj 于 2016-6-22 16:03 编辑
void send(uchar num)
{ ES=0; //关闭串口中断
SBUF=num;
while(!TI);
// RI=0; //这一句不对
TI=0; //应这样.....
ES=1; //开....
}
作者: 小伍 时间: 2016-6-22 16:03
同意楼的想法,设置串口寄存器,这个问题就可以解决了
作者: ahshmj 时间: 2016-6-22 16:04
void ser() interrupt 4
{
if(RI==1)
{ uchar a;
RI=0;
a=SBUF;
display(a);
}
}
作者: 单片机小白。。 时间: 2016-6-22 17:17
串口寄存器 上电不是默认是0吗?需要怎么设置呢?
作者: 单片机小白。。 时间: 2016-6-22 17:19
我改了,然后发现数据传的不正确,而且有时候按下键盘并没有反应。
作者: ahshmj 时间: 2016-6-23 19:06
本帖最后由 ahshmj 于 2016-6-23 19:15 编辑
SCON是要设置的。楼主已经设置了。SM1=1,SM0=0,REN=1
等效于 "SCON = 0x50; //方式1,充许接收"
作者: ahshmj 时间: 2016-6-23 19:16
你板子上的晶振是多少的?
作者: bx2008love 时间: 2016-6-25 23:39
是不是一编译有警告,按键函数写了怎么不放到主函数,写的也有问题
作者: 51小孟菜鸟 时间: 2016-6-26 00:51
这东西还管晶振的事吗
作者: zl2168 时间: 2016-6-26 14:58
本帖最后由 zl2168 于 2016-6-26 15:00 编辑
实例77 双机串行通信方式1
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-6-26 15:00
实例78 双机串行通信方式2
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-6-26 15:02
实例79 双机串行通信方式3
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-6-26 15:03
实例80 带RS 232接口的双机通信
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-6-26 19:44
本帖最后由 zl2168 于 2016-6-26 19:45 编辑
单片机与PC机虚拟串行通信
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: 747732490 时间: 2016-6-26 19:52
单片机与PC机虚拟串行通信
作者: liuyimao485812 时间: 2016-6-27 06:24
EA=1; ES=1;
顺序错了,应该是:
ES=1; EA=1;
作者: zl2168 时间: 2016-6-27 14:52
这个顺序无所谓。
作者: anyone 时间: 2016-6-27 15:17
单片机与PC机虚拟串行通信
作者: anyone2 时间: 2016-6-28 14:46
同意楼的想法,设置串口寄存器,这个问题就可以解决了
作者: geminiguy_07 时间: 2016-7-1 12:01
用状态机试一试,虽然复杂一点,不过很好用,很灵敏
作者: 1058098234 时间: 2016-7-2 13:39
寄存器问题吧
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |