打印
[51单片机]

通过对串口下发指令,来操作数码管,但是发现通讯可以...

[复制链接]
1208|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
鲁亦|  楼主 | 2015-8-4 23:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过对串口下发指令,来操作数码管,但是发现通讯可以,数码管就是不亮,求解释!!!!
#include <reg52.h>
uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint datbuf;
sbit beep = P3^5;
bit flag;
void delay_ms(uchar t)
{
         uchari;
         for(;t>0;t--)
                   for(i=110;i>0;i--);
}
void Display()
{
         uchari;
         P2= 0x00;
         
         for(i=0;i<16;i++)
         {
                                     P0= ~table;
                                     delay_ms(2000);
         }
}
void uart_init()
{
         TMOD&=0x0F;
         TMOD|=0x20;
         
         SCON= 0x50;
         
         TH1= 0xFD;
         TL1= 0xFD;
         
         EA= 1;
         ES= 1;
         
         TR1= 1;
         
}
void main()
{
         uart_init();
         while(1)
         {
                   if(flag)
                   {
                            ES= 0;
                            flag= 0;
                           
                            if(datbuf  == '1')
                            {
                                               Display();
                            }
                                               
                     SBUF = datbuf;
                            while(!TI);
                            TI= 0;
                           
                            ES= 1;
                           
                   }
         }
}
void uart_isr() interrupt 4
{
         RI= 0;
         datbuf= SBUF;
         flag= 1;
         
}

/***********************
原理图见附件!
************************/

信盈达单片机v2.1.pdf

70.19 KB

相关帖子

沙发
nixianmin| | 2015-8-5 07:43 | 只看该作者
先单独试下数码管能不能量,再仿真确定下通讯能不能进入中断
SBUF = datbuf;
while(!TI);
TI= 0;

这段死循环用来干嘛?你要保证数码管一直在扫描

使用特权

评论回复
板凳
ayb_ice| | 2015-8-5 08:02 | 只看该作者
你这显示程序肯定有问题
for(i=0;i<16;i++)
         {
                                     P0= ~table;
                                     delay_ms(2000);
         }
首先应该是P0= ~table[datbuf];
其次延时这么长时间干嘛,而且还循环16次,这段时间怎么响应其它事件

使用特权

评论回复
地板
xyz549040622| | 2015-8-5 08:20 | 只看该作者
单独数码管的显示就没调通。先把这个搞通。

使用特权

评论回复
5
鲁亦|  楼主 | 2015-8-5 11:35 | 只看该作者
nixianmin 发表于 2015-8-5 07:43
先单独试下数码管能不能量,再仿真确定下通讯能不能进入中断
SBUF = datbuf;
while(!TI);

1:数码管能亮,可能你看到的“table”后面缺少“”,我也不知道为什么上传上来就没有!
2:while(!TI);TI:中断发送标志位,因为我要传送SBUF寄存器的数据(也就是datbuf);

使用特权

评论回复
6
鲁亦|  楼主 | 2015-8-5 11:36 | 只看该作者
ayb_ice 发表于 2015-8-5 08:02
你这显示程序肯定有问题
for(i=0;i

问题的确出现在显示这块,通讯OK!我试一下你的建议!

使用特权

评论回复
7
鲁亦|  楼主 | 2015-8-5 11:37 | 只看该作者
xyz549040622 发表于 2015-8-5 08:20
单独数码管的显示就没调通。先把这个搞通。

单独搞数码管,显示0-F,是ok!本来在“table”后面是有中刮号的!

使用特权

评论回复
8
鲁亦|  楼主 | 2015-8-5 11:55 | 只看该作者
大家好!已经调好!谢谢大家!
代码如下和附件
/**************************************************************************
×??o±àD′μ?
*****************************************************************************/
#include <reg52.h>

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


uint datbuf;
sbit beep = P3^5;

bit flag;

void delay_ms(uint t)
{
        uchar i;
        for(;t>0;t--)
                for(i=110;i>0;i--);
}


void Display()
{
        uchar i;
        P2 = 0x00;
       
       
        while(1)
        {
                        for(i=0;i<15;i++)
                {
                                        P0 = ~table[i];
                                        delay_ms(5200);
                }
        }
       
}

void uart_init()
{
        TMOD &=0x0F;
        TMOD |=0x20;
       
        SCON = 0x50;
       
        TH1 = 0xFD;
        TL1 = 0xFD;
       
        EA = 1;
        ES = 1;
       
        TR1 = 1;
       
}
void main()
{
        uart_init();
        while(1)
        {
               
                if(flag)
                {
                        ES = 0;
                        flag = 0;

                       
                        if( datbuf  == '1')
                        {
                                        Display();
                               
                               
                        }
                                       
                  SBUF = datbuf;
                        while(!TI);
                        TI = 0;
                       
                        ES = 1;
                       
                }
        }
}

void uart_isr() interrupt 4
{
        RI = 0;
        datbuf = SBUF;
        flag = 1;
       
}

使用特权

评论回复
9
songchenping| | 2015-8-5 15:37 | 只看该作者
先把单个调通再调试其他的

使用特权

评论回复
10
windlfs| | 2015-8-5 16:01 | 只看该作者
不管 通讯,先让  显示 循环 显示,测试  显示 程序。  再  加上 通讯!

使用特权

评论回复
11
鲁亦|  楼主 | 2015-8-8 20:28 | 只看该作者
songchenping 发表于 2015-8-5 15:37
先把单个调通再调试其他的

是的,先简单调通,一个个调,,,

使用特权

评论回复
12
鲁亦|  楼主 | 2015-8-8 20:30 | 只看该作者
windlfs 发表于 2015-8-5 16:01
不管 通讯,先让  显示 循环 显示,测试  显示 程序。  再  加上 通讯!

是的,是这样,已经调好!谢谢!不过你的建议不错!

使用特权

评论回复
13
songchenping| | 2015-8-8 21:25 | 只看该作者
鲁亦 发表于 2015-8-8 20:28
是的,先简单调通,一个个调,,,

调通了就好啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝