标题: 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
gaozhaohong 发表于 2016-6-22 12:55
为什么不设置串口寄存器呢?

串口寄存器 上电不是默认是0吗?需要怎么设置呢?
作者: 单片机小白。。    时间: 2016-6-22 17:19
ahshmj 发表于 2016-6-22 15:49
void send(uchar num)
{             ES=0;             //关闭串口中断
        SBUF=num;

我改了,然后发现数据传的不正确,而且有时候按下键盘并没有反应。
作者: 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
ahshmj 发表于 2016-6-23 19:16
你板子上的晶振是多少的?

这东西还管晶振的事吗
作者: zl2168    时间: 2016-6-26 14:58
本帖最后由 zl2168 于 2016-6-26 15:00 编辑

实例77  双机串行通信方式1


Proteus仿真一下,确认有效。
实例77 双机通信方式1.rar (40.4 KB, 下载次数: 13)


以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版

书中电路和程序设计有详细说明,程序语句条条有注解。






作者: zl2168    时间: 2016-6-26 15:00
实例78  双机串行通信方式2


Proteus仿真一下,确认有效。
实例78 双机通信方式2.rar (46.57 KB, 下载次数: 5)




以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。





作者: zl2168    时间: 2016-6-26 15:02
实例79  双机串行通信方式3


Proteus仿真一下,确认有效。
实例79 双机通信方式3.rar (45.3 KB, 下载次数: 3)




以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。





作者: zl2168    时间: 2016-6-26 15:03
实例80  带RS 232接口的双机通信


Proteus仿真一下,确认有效。
实例80 带RS232接口的双机通信.rar (45.52 KB, 下载次数: 4)




以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。





作者: zl2168    时间: 2016-6-26 19:44
本帖最后由 zl2168 于 2016-6-26 19:45 编辑

单片机与PC机虚拟串行通信


Proteus仿真一下,确认有效。
实验16 与PC机虚拟串行通信.rar (151.41 KB, 下载次数: 4)




以上摘自张志良编著《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
单片机小白。。 发表于 2016-6-22 17:19
我改了,然后发现数据传的不正确,而且有时候按下键盘并没有反应。

用状态机试一试,虽然复杂一点,不过很好用,很灵敏
作者: 1058098234    时间: 2016-7-2 13:39
寄存器问题吧




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1