找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1628|回复: 9
打印 上一主题 下一主题
收起左侧

单片机串行通信遇到 问题,求大神指点

[复制链接]
跳转到指定楼层
楼主
ID:429598 发表于 2019-6-8 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机串口通信,通过电脑发送01,02。当发送01时LED小灯亮,同时数码管的显示加1。发送02时小灯灭,数码管不加。现在的问题是,小灯能够正常亮与灭,但数码管不正常显示。即传输数据没问题,但是数码管会乱码,数码管使用的是共阳。发送01,小灯亮,数码管从0变到了8。问题出在哪里?求大神指点
#include<reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
unsigned char code  SMG[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char cnt=0;
uchar recv_dat;
void RESV()interrupt 4
{       
        RI=0;
        recv_dat=SBUF;
        SBUF=recv_dat;
        while(TI==0);
        TI=0;
}


void main()
{

TMOD=0X20;
TH1=TL1=0XFD;
PCON=0X00;
SCON=0X50;
ES=1;
EA=1;
TR1=1;
while(1)
        {
        if(recv_dat==0x01)
                {
            LED=0;
                cnt++;               
                }                                                                                                            
        else  if(recv_dat==0x02)
                {
                LED=1;
                }
                 P0 =SMG[cnt];
       
        }          
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:554109 发表于 2019-6-8 12:35 | 只看该作者
我觉得很大可能性是你的硬件方面存在问题。数码管使用的位数也需要注意。一位数码管和4位一体或者6位一体都不一样的
回复

使用道具 举报

板凳
ID:10947 发表于 2019-6-8 14:06 | 只看该作者
数码管显示数字,对应的笔画亮,哪几个笔画亮,是从哪里定义的?
回复

使用道具 举报

地板
ID:517466 发表于 2019-6-8 15:45 | 只看该作者
你的程序也有问题。对cnt没有加以限制,串口发送0x01给单片机超过9次的时候,cnt>9了,数组越界。如果程序区内相应的下一个单元数据为0,会导致数码管所有笔段全部被点亮。改成cnt=(cnt++)%10;不好吗?
另外,recv_dat在被中断程序中赋值以后,比如串口发了0x01,那么之后串口不发送任何数据,recv_dat会一直保持0x01,这样的结果是,在while循环中,if(recv_dat==0x01)会一直满足条件,一直执行cnt++;我觉得,你在完成if...else..处理中,最好加入recv_dat=0之类的清除处理,保证串口发来数据后,if...else中的处理被执行一次。
回复

使用道具 举报

5#
ID:517466 发表于 2019-6-8 15:47 | 只看该作者
if(recv_dat==0x01)
{
            LED=0;
            cnt=(cnt++)%10;
            recv_dat=0;
}
else  if(recv_dat==0x02)
{
                LED=1;
                recv_dat=0;
}
回复

使用道具 举报

6#
ID:517466 发表于 2019-6-8 15:49 | 只看该作者
你现在的现象,很正常,由于0x01被保持,主循环处理很快从0到9,以至于你观察不到数码管的显示过程。
回复

使用道具 举报

7#
ID:293387 发表于 2019-6-8 18:46 | 只看该作者
定义一个全局变量flag,在串口发送中断时置flag=1;在主函数里取判断这个flag==1,并且清零。也就是检测是否发生串口中断。
回复

使用道具 举报

8#
ID:519141 发表于 2019-6-8 19:29 | 只看该作者
首先if(recv_dat==0x01)这条语句会一直满足,肉眼是看不出来数码管的变化,你可以加两条调试语句进去查看数值的变化;
回复

使用道具 举报

9#
ID:519141 发表于 2019-6-8 19:30 | 只看该作者
其次,你需要确认数码管的引脚定义或者硬件连线上有没有问题
回复

使用道具 举报

10#
ID:93224 发表于 2019-6-9 17:27 | 只看该作者
这个不能只看程序的,还要看你的数码管的具体电路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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