打印

串口通信:labview 向单片机发送一个百位数问题

[复制链接]
5139|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
虚拟小张|  楼主 | 2013-5-16 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位高手,我想通过labview向单片机发送一个百位数(任意一个百位数),通过串口中断,存储在数组中,然后在数码管上显示,老是显示不出来,不知道问题出在哪里哈?我感觉是接收到数组中百位数的数字不对。有没有更好的方法哈。烦死了,求解哈!!!!!!

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char a[3];
uchar flag;
void delay_20ms(uint t)
{
        uchar j;
        for(;t>0;t--)
        for(j=6245;j>0;j--);
}

/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
        SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收
        TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
        TH1 = 0xFD; // TH1: 重装值2400 波特率晶振12MHz
        TR1 = 1; // TR1: timer 1 打开
        EA = 1; //打开总中断
        ES = 1; //打开串口中断
}




/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
        unsigned char i;
        unsigned int j;
        InitUART();
        if(flag==1)
        {
                ES=0;
                flag=0;
       
                        SBUF=a[0];
                        P0=SBUF;
                        P2=0x04;
                        delay_20ms(20);
                        SBUF=a[1];
                        P0=SBUF;
                        P2=0x05;
                        delay_20ms(20);
                        SBUF=a[2];
                        P0=SBUF;
                        P2=0x06;
                        delay_20ms(20);

                                
                 ES=1;
        }
}                                                            

/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
        unsigned char i;
        if(RI) //判断是接收中断产生
        {
                a[i]=SBUF;
                i++;
                if(i==3) i=0;
                flag=1;
                RI=0; //标志位清零                
        }
}

相关帖子

沙发
虚拟小张|  楼主 | 2013-5-16 15:55 | 只看该作者
顶一下,别沉了

使用特权

评论回复
板凳
spydf| | 2013-5-16 16:43 | 只看该作者
中断服务子程序变量i定义成静态变量

使用特权

评论回复
地板
gxs64| | 2013-5-16 16:46 | 只看该作者
labview设置对?

使用特权

评论回复
5
ayb_ice| | 2013-5-16 16:57 | 只看该作者
SBUF是个特殊的东西,其实有两个SBUF一个只读,一个只写,分别用于接收与发送的,读写代表不同的操作,

普通RAM写数据后再读出来数据是一样的,但SBUF可不是这样的

使用特权

评论回复
6
ayb_ice| | 2013-5-16 16:58 | 只看该作者
3L说的也很对

使用特权

评论回复
7
ayb_ice| | 2013-5-16 17:00 | 只看该作者
本帖最后由 ayb_ice 于 2013-5-16 17:01 编辑

你一位显示延时delay_20ms(20);

这么长时间20*20=400ms,怎么可能能正常显示呢

3位总共是1.2S了,这么长的时间关了中断,上位机发数据岂不是收不到了

使用特权

评论回复
8
虚拟小张|  楼主 | 2013-5-16 17:05 | 只看该作者
spydf 发表于 2013-5-16 16:43
中断服务子程序变量i定义成静态变量

还是不行呀。我的想法是将一个百位数(如213)拆分成2,1,3数字,一个个发送进单片机,然后存储进一个数组,再显示。先发送213,延时,再发送213,感觉我的单片机数组中存储的根本不是2,1,3;况且感觉后面两个数组中的数字可以是2,可以是1,不知道问题出在哪里了?

使用特权

评论回复
9
虚拟小张|  楼主 | 2013-5-16 17:06 | 只看该作者
gxs64 发表于 2013-5-16 16:46
labview设置对?

labview设置对呀,我就是搞labview的,这部分没问题。

使用特权

评论回复
10
虚拟小张|  楼主 | 2013-5-16 17:08 | 只看该作者
ayb_ice 发表于 2013-5-16 16:57
SBUF是个特殊的东西,其实有两个SBUF一个只读,一个只写,分别用于接收与发送的,读写代表不同的操作,

普通RAM ...

这个我知道哈,我这里只读,就是把缓存区的数读进一个数组中,但感觉读进的数不对哈。

使用特权

评论回复
11
虚拟小张|  楼主 | 2013-5-16 17:11 | 只看该作者
ayb_ice 发表于 2013-5-16 17:00
你一位显示延时delay_20ms(20);

这么长时间20*20=400ms,怎么可能能正常显示呢

这个可以收到的,我的上位机是循环发送,如发送2,1,3;2,1,3.。。就照这个顺序。我的问题是我的数组中不能正确的存储2,1,3.我的数码管显示没问题哈。

使用特权

评论回复
12
gxs64| | 2013-5-16 17:12 | 只看该作者
1.RX TX连线是OK?用示波器测一下,通记时应有波形。
2。能否进入中断?

使用特权

评论回复
13
ayb_ice| | 2013-5-16 17:24 | 只看该作者
// 中断程序改一下


void UART_SER (void) interrupt 4 //串行中断服务程序
{
        static unsigned char i = 0;

        if(RI) //判断是接收中断产生
        {
                a[i]=SBUF;
                RI=0; //标志位清零

                i++;
                if(i==3) i=0;
                flag=1;
        }

                if(TI){
                        TI = 0;
                }
}

使用特权

评论回复
14
虚拟小张|  楼主 | 2013-5-16 19:06 | 只看该作者
ayb_ice 发表于 2013-5-16 17:24
// 中断程序改一下

还是不行哈,显示的是311,前两个数码管闪烁,最后一个显示1,不变。

使用特权

评论回复
15
虚拟小张|  楼主 | 2013-5-16 19:28 | 只看该作者
ayb_ice 发表于 2013-5-16 17:24
// 中断程序改一下

高手,如果是向单片机发送0x01,0xD5,这两个十六进制数,如何在中断程序中存储呢?高手,帮帮忙哈。。。

使用特权

评论回复
16
gxs64| | 2013-5-16 21:41 | 只看该作者
将数据从SBUF读出,存入BUFFER就OK。

使用特权

评论回复
17
NE5532| | 2013-5-17 08:14 | 只看该作者
呵呵,楼主确实连主循环都没有呢。另外建议数据封装为帧,否则容易混乱。

使用特权

评论回复
18
虚拟小张|  楼主 | 2013-5-17 08:38 | 只看该作者
dwh000 发表于 2013-5-17 08:01
主程序都不对,写个循环好不好啊!

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?

使用特权

评论回复
19
虚拟小张|  楼主 | 2013-5-17 08:39 | 只看该作者
NE5532 发表于 2013-5-17 08:14
呵呵,楼主确实连主循环都没有呢。另外建议数据封装为帧,否则容易混乱。 ...

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?具体如何操作呢?我是新手哈。

使用特权

评论回复
20
虚拟小张|  楼主 | 2013-5-17 08:40 | 只看该作者
gxs64 发表于 2013-5-16 21:41
将数据从SBUF读出,存入BUFFER就OK。

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?具体如何操作呢?我是新手哈。

使用特权

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

本版积分规则

7

主题

34

帖子

1

粉丝