找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4595|回复: 22
收起左侧

51单片机 实现不了串口双向数据通信

  [复制链接]
ID:127657 发表于 2016-6-22 12:34 | 显示全部楼层 |阅读模式
这是我的程序,问题在哪里呢?
#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);
}


评分

参与人数 1黑币 +4 收起 理由
51小孟菜鸟 + 4 赞一个!

查看全部评分

回复

使用道具 举报

ID:61876 发表于 2016-6-22 12:55 | 显示全部楼层
为什么不设置串口寄存器呢?
回复

使用道具 举报

ID:7485 发表于 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;            //开....
}
回复

使用道具 举报

ID:127682 发表于 2016-6-22 16:03 | 显示全部楼层
同意楼的想法,设置串口寄存器,这个问题就可以解决了
回复

使用道具 举报

ID:7485 发表于 2016-6-22 16:04 | 显示全部楼层
void ser() interrupt 4
{
       if(RI==1)
         { uchar a;
        RI=0;
        a=SBUF;
        display(a);
         }
}
回复

使用道具 举报

ID:127657 发表于 2016-6-22 17:17 | 显示全部楼层
gaozhaohong 发表于 2016-6-22 12:55
为什么不设置串口寄存器呢?

串口寄存器 上电不是默认是0吗?需要怎么设置呢?
回复

使用道具 举报

ID:127657 发表于 2016-6-22 17:19 | 显示全部楼层
ahshmj 发表于 2016-6-22 15:49
void send(uchar num)
{             ES=0;             //关闭串口中断
        SBUF=num;

我改了,然后发现数据传的不正确,而且有时候按下键盘并没有反应。
回复

使用道具 举报

ID:7485 发表于 2016-6-23 19:06 | 显示全部楼层
本帖最后由 ahshmj 于 2016-6-23 19:15 编辑

SCON是要设置的。楼主已经设置了。SM1=1,SM0=0,REN=1
等效于        "SCON = 0x50;         //方式1,充许接收"

      
回复

使用道具 举报

ID:7485 发表于 2016-6-23 19:16 | 显示全部楼层
你板子上的晶振是多少的?
回复

使用道具 举报

ID:101595 发表于 2016-6-25 23:39 来自手机 | 显示全部楼层
是不是一编译有警告,按键函数写了怎么不放到主函数,写的也有问题
回复

使用道具 举报

ID:127315 发表于 2016-6-26 00:51 | 显示全部楼层
ahshmj 发表于 2016-6-23 19:16
你板子上的晶振是多少的?

这东西还管晶振的事吗
回复

使用道具 举报

ID:111634 发表于 2016-6-26 14:58 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-26 15:00 编辑

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


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

评分

参与人数 1黑币 +9 收起 理由
absflash + 9 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2016-6-26 15:00 | 显示全部楼层
实例78  双机串行通信方式2


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

使用道具 举报

ID:111634 发表于 2016-6-26 15:02 | 显示全部楼层
实例79  双机串行通信方式3


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

评分

参与人数 1黑币 +9 收起 理由
absflash + 9 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2016-6-26 15:03 | 显示全部楼层
实例80  带RS 232接口的双机通信


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

评分

参与人数 1黑币 +9 收起 理由
absflash + 9

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2016-6-26 19:44 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-26 19:45 编辑

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


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

使用道具 举报

ID:128204 发表于 2016-6-26 19:52 | 显示全部楼层
单片机与PC机虚拟串行通信

回复

使用道具 举报

ID:110895 发表于 2016-6-27 06:24 | 显示全部楼层
EA=1;  ES=1;
顺序错了,应该是:
ES=1; EA=1;
        
回复

使用道具 举报

ID:111634 发表于 2016-6-27 14:52 | 显示全部楼层
这个顺序无所谓。
回复

使用道具 举报

ID:128297 发表于 2016-6-27 15:17 | 显示全部楼层
单片机与PC机虚拟串行通信
回复

使用道具 举报

ID:128426 发表于 2016-6-28 14:46 | 显示全部楼层

同意楼的想法,设置串口寄存器,这个问题就可以解决了
回复

使用道具 举报

ID:71099 发表于 2016-7-1 12:01 | 显示全部楼层
单片机小白。。 发表于 2016-6-22 17:19
我改了,然后发现数据传的不正确,而且有时候按下键盘并没有反应。

用状态机试一试,虽然复杂一点,不过很好用,很灵敏
回复

使用道具 举报

ID:128414 发表于 2016-7-2 13:39 | 显示全部楼层
寄存器问题吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表