51单片机的串行通信怎么传送16位二进制的数

[复制链接]
1789|16
 楼主| zwll 发表于 2014-7-1 21:37 | 显示全部楼层 |阅读模式
51单片机的串行通信怎么传送16位二进制的数
chuxh 发表于 2014-7-1 21:38 | 显示全部楼层
分两次发呗;
juventus9554 发表于 2014-7-1 21:39 | 显示全部楼层
软件模拟
llljh 发表于 2014-7-1 21:39 | 显示全部楼层
两个组合在一起有先后顺序就可以了吧
司徒老鹰 发表于 2014-7-1 21:41 | 显示全部楼层
是要连续传送16位数据位呢,还是连续传送两字节?
llljh 发表于 2014-7-1 21:41 | 显示全部楼层
分两次发,单片机一次只能发送八位,在接收端对数据做下处理即可
dingy 发表于 2014-7-1 21:42 | 显示全部楼层
利用共用体!
 楼主| zwll 发表于 2014-7-1 21:42 | 显示全部楼层
呵呵 我也说不清楚啦  就是要传送16位二进制的数 要在数码管上显示出来 就是这样 题目
pengf 发表于 2014-7-1 21:43 | 显示全部楼层
挺容易的。供参考:

#include "reg51.h"               
#include <absacc.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管编码,共阳极。
unsigned char dat;

void Init_Com(void)
{
        TMOD = 0x20;                                                        //定时器工作方式2,初值自动装入
        PCON = 0x00;                                                        //波特率不增倍
        SCON = 0x50;                                                        //串行工作方式设定                        
        TH1 = 0xFd;                                                        //定时器初值高位
        TL1 = 0xFd;                                                        //定时器初值低位
        TR1 = 1;                                                                //启动定时器                                
}
/*函数功能ED数码管延时程序*/
void delay(void)
{
int k;
for(k=0;k<600;k++);
}
/*函数功能ED数码管显示程序*/
void display(int k)
{
           P2=0xfe;                                                                //位选                        
           P0=tab[k/1000];                                                        //显示千位数字
           delay();                                                                //延时
           P2=0xfd;                                                                //位选
           P0=tab[k%1000/100];                                                //显示百位数字
           delay();                                                                //延时
           P2=0xfb;                                                                //位选
           P0=tab[k%100/10];                                                //显示十位数字
           delay();                                                                //延时
           P2=0xf7;                                                                //位选
           P0=tab[k%10];                                                        //显示个位数字
           delay();                                                                //延时
           P2=0xff;                                                                //位选
}
/*函数功能:主程序*/
void main()
{   
      P2=0xff;                                                                //端口初始化,关LED显示
             P0=0xff;
           Init_Com();                                                                //调用串口初始化程序
              while(1)                                                                //主循环
      {
                   if ( RI )                                                        //判断是否收到数据
                  {
               dat = SBUF;                                                //接收数据
               RI = 0;                                                        //软件清除标志位
                   }
         display(dat-48);                                                        //显示收到的数据
      }
}
renyaq 发表于 2014-7-1 21:44 | 显示全部楼层
如果想在一个起始位和停止位序列内传送16位数据,只能软件模拟了,建议自己先动手,然后有针对性的问问题,这样回答的也有针对性,否则太笼统了
supernan 发表于 2014-7-1 21:44 | 显示全部楼层
已经完成了90%的程序了。最后10%  LZ不想自己做?

aa=SBUF;
bb=aa&0x0F;  //屏蔽16进制高4位。
P1=tab[bb];    // 取低4位显示码显示。
bb=aa>>4;
P1=tab[bb];   //取高4位16进制显示码显示。

如何分开显示高、低位?
栩栩如生 发表于 2014-7-1 21:44 | 显示全部楼层
不是,我下面就不知道怎么写了
supernan 发表于 2014-7-1 21:45 | 显示全部楼层
分高八位和低八位字节即可
houcs 发表于 2014-7-1 21:45 | 显示全部楼层
这个困难
kangzj 发表于 2014-7-1 21:46 | 显示全部楼层
串行多少为都行吧
弥勒开怀笑 发表于 2014-7-2 10:18 | 显示全部楼层
如果我的理解没错的话,串行是不管多少位都行的,可以接收后缓存在数组里,再从数组中读取来显示
ningling_21 发表于 2014-7-2 15:06 | 显示全部楼层
既然是串行,就要把16位数据分成16位二进制位分多次进行传送的一次传送一个位,就像单行道行车一辆接着一辆....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

885

主题

11314

帖子

5

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