单片机双机通信问题

[复制链接]
 楼主| 新手求关照 发表于 2015-11-15 11:22 | 显示全部楼层 |阅读模式
将两个单片机的TXD RXD交叉连接 GND共地后,按一个单片机的键盘,另一个单片机显示数字,下面是自己写的程序,实现不了这个功能,求大神指导
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
uchar flag;
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71
};
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SCON=0x50;
        EA=1;
        ES=1;
}
void display(uchar num)
{
        P0=table[num];
        dula=1;
        dula=0;
}
void send(uchar key_num)
{
        while(1)
        {
                if(flag==1)
                {
                        flag=0;
                        ES=0;
                        TI=1;
                        SBUF=key_num;
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }
}
void keyscan()
{
        uchar key,temp;
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:
                                        key=0;
                                        break;
                                case 0xde:
                                        key=1;
                                        break;
                                case 0xbe:
                                        key=2;
                                        break;
                                case 0x7e:
                                        key=3;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        send(key);
                }
        }
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:
                                        key=4;
                                        break;
                                case 0xdd:
                                        key=5;
                                        break;
                                case 0xbd:
                                        key=6;
                                        break;
                                case 0x7d:
                                        key=7;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        send(key);
                }
        }
        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:
                                        key=8;
                                        break;
                                case 0xdb:
                                        key=9;
                                        break;
                                case 0xbb:
                                        key=10;
                                        break;
                                case 0x7b:
                                        key=11;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        send(key);
                }
        }
        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:
                                        key=12;
                                        break;
                                case 0xd7:
                                        key=13;
                                        break;
                                case 0xb7:
                                        key=14;
                                        break;
                                case 0x77:
                                        key=15;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        send(key);
                }
        }
}
void main()
{
        init();
        P0=0xc0;
        wela=1;
        wela=0;
        while(1)
        {
                keyscan();
        }
}
void ser() interrupt 4
{
        uchar a;
        RI=0;
        a=SBUF;
        flag=1;
        display(a);
}
cpu51 发表于 2015-11-15 11:55 | 显示全部楼层
你应该说出具体现象,这么多程序,谁会一行一行看?
 楼主| 新手求关照 发表于 2015-11-15 14:46 | 显示全部楼层
cpu51 发表于 2015-11-15 11:55
你应该说出具体现象,这么多程序,谁会一行一行看?

在一个单片机上按键,另一个单片机上没反应
NE5532 发表于 2015-11-15 20:20 | 显示全部楼层
程序分模块调,不要想一口吃成胖子,请读 程序调试黑宝书
airwill 发表于 2015-11-16 18:52 | 显示全部楼层
代码写得还是蛮规整的. 支持一下新人.
可惜一条注释都没有, 这不适合拿出来跟人家交流讨论, 你应该让大家尽快看明白你的代码. 节约大家的时间才对.
你可以借助串口调试工具, 单个程序先调, 然后再联调通信
 楼主| 新手求关照 发表于 2015-11-16 19:24 | 显示全部楼层
airwill 发表于 2015-11-16 18:52
代码写得还是蛮规整的. 支持一下新人.
可惜一条注释都没有, 这不适合拿出来跟人家交流讨论, 你应该让大家尽 ...

谢谢
ningling_21 发表于 2015-11-17 17:56 | 显示全部楼层
先调试串口发送和接收,先用电脑发送/接收,单片机接收/发送 到且正确再调试单片机发送单片机接收
落叶情怀 发表于 2015-11-17 20:35 | 显示全部楼层
send key 函数有问题吧
mochou 发表于 2015-11-19 10:26 | 显示全部楼层
楼主有没有调试通呢?
sio4 发表于 2015-11-19 11:11 | 显示全部楼层
没空来看你的程序,先跟PC串口助手之类的调试吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部