精华内容
下载资源
问答
  • 题目:用两个 89C51 单片机实现双机通讯来做一个时钟,A 机用来产生数据,B 机用来显示。具体思路是 A 机产生 a、b、c 的具体值,然后把 abc 传给 B 机显示数据。做而论道回答:先设计出来电路,然后再谈编程的问题。...


    题目:用两个 89C51 单片机实现双机通讯来做一个时钟,A 机用来产生数据,B 机用来显示。


    具体思路是 A 机产生 a、b、c 的具体值,然后把 abc 传给 B 机显示数据。


    做而论道回答:先设计出来电路,然后再谈编程的问题。


    追问:不需要你给我完整的程序,我只需要通讯那一块的程序。端口什么的随便你用。


    我要的是 A 机发送 a, b, c 给 B 机,B 机拿来用。


    做而论道按照提问者的要求,写出了双方的通信部分,代码可见该问题的网址:


    http://zhidao.baidu.com/question/1731754753643347587.html


    但是,从后续的追问来看,提问者显然还是不知道怎么用。


    为此,做而论道就把这个时钟的全部仿真图,都画出来,显示函数、定时函数...,也都编写出来,供参考。


    PROTEUS 仿真电路图如下:


    51 单片机 C 语言串行双机通信的问题 - 非著名博主 - 电子信息角落

    图片链接:

    http://xiangce.baidu.com/picture/detail/8d7c506b7ade7f0feb49f353e22d81dfef5453dc


    //============================================


    B 机(显示数据)的程序如下:


    //--------------------------------


    #include<reg52.h>


    unsigned char  re_i = 0, r_buf[7] = {0,0,0,0,0,0,0};

    unsigned char  a = 13, b = 57, c = 40, d;


    //--------------------------------

    void delayms(unsigned int xms)

    {

        unsigned  int i, j;

        for(i = xms; i > 0; i--)  for(j = 110; j > 0; j--);

    //--------------------------------

    void display()

    {   

        char  i, dis[6];

        char code table[] = {

          0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};

        char code WEI[] = {1,2,4,8,16,32};


        dis[0] = a / 10; dis[1] = a % 10;

        dis[2] = b / 10; dis[3] = b % 10;

        dis[4] = c / 10; dis[5] = c % 10;


        for (i = 0; i < 6; i++) {

          P0 = table[dis[i]];

          P2 = WEI[i]; delayms(10); P2 = 0;

        }

    }

    //--------------------------------

    init()

    {

        PCON = 0;

        SCON = 0x50;

        TMOD = 0x20;

        TH1 = 0xfd;

        TL1 = 0xfd;

        TR1 = 1;

        ES = 1;

        EA = 1;

    }

    //--------------------------------

    main()        //乙机主函数

    {

        init();

        while(1) {

          display();

        }

    }

    //--------------------------------

    recv_abc()  interrupt 4  //乙机接收

    {

        if (RI) {

          RI = 0;

          d = SBUF;

          if (d == '$')  re_i = 0;

          r_buf[re_i] = d;

          re_i++;

          if (re_i == 7) {

            re_i = 0;

            a = (r_buf[1] - '0') * 10 + (r_buf[2] - '0');

            b = (r_buf[3] - '0') * 10 + (r_buf[4] - '0');

            c = (r_buf[5] - '0') * 10 + (r_buf[6] - '0');

          }

        }

    }


    //============================================


    A 机(产生数据)的程序如下:


    //--------------------------------


    #include<reg52.h>


    unsigned char  a = 13, b = 57, c = 40, d;

    bit  sec;

    //--------------------------------

    init()

    {

        PCON = 0;

        SCON = 0x50;

        TMOD = 0x21;

        TH1 = 0xfd;

        TL1 = 0xfd;

        TR1 = 1;

        EA = 1;


        TH0 = 0x4c;

        TR0 = 1;

        ET0 = 1;

    }

    //--------------------------------

    send(unsigned char x)    //甲机发送

    {

        SBUF = x;  while(!TI);  TI = 0;

    }

    //--------------------------------

    main()        //甲机主函数

    {

        init();

        while(1) {

          if(sec) {

            sec = 0;

            send('$');

            send(a / 10 + '0'); send(a % 10 + '0');

            send(b / 10 + '0'); send(b % 10 + '0');

            send(c / 10 + '0'); send(c % 10 + '0');

        } }

    }

    //--------------------------------

    T0_INT()  interrupt 1  //50ms定时中断函数

    {

        TH0 = 0x4c;

        d++;

        if (d >= 2) {  //20

          d = 0;

          sec = 1;

          c++;

          if (c == 60) {

            c = 0;

            b++;

            if (b == 60) {

              b = 0;

              a++;

              if (a == 24) a = 0;

        } } }

    }


    //============================================


    上述的两个程序,需分别编译,生成不同 HEX 文件;再分别用两个单片机来装入。


    程序执行后,即可显示出来前面插图的效果。B 机的显示器,每秒更新一次数据。


    当把中间的开关断开后,显示的数据便会停顿,不变了。


    再把中间的开关接通后,显示又会变化,而且数据并不受断开的影响。


    这说明,显示的内容,明显是从 A 机传送来的。


    //============================================


    本题目,需要传送的数据有时、分、秒共三个,这就属于多字节的串行通信。


    单片机的串行通信,每次只能传送一个字节,即 0~255。


    多字节的数据传送,需要制订协议。


    否则,连续传送一个一个的字节,到了接收方,也不知道哪个是时、哪个是分、哪个是秒。


    这时,一般要采用 ASCII 码来传送。


    用 0~9,即代表了一系列有用的数据。


    再用一个 0~9 之外的符号,当做《数据头》,就行了。


    本程序,就是以美元符 $ 当做数据头。


    传送了 $ 之后,接着就传送时的十位数、时的个位数、分的十位数、分的位数、秒的个位数。


    每次发送数据,就连续的发出七个字节。


    接收方收到了 $ 之后,就把后面再收到的当做时、分、秒的十位、个位保存。


    当收齐了七个字节,就把这后面的六个字节,送去显示。


    本题目要求比较简单,所以,做而论道编写的程序,也就没有包括《检错》的部分。


    //============================================


    展开全文
  • 《51单片机实现双机通信(自己整理的)》由会员分享,可在线阅读,更多相关《51单片机实现双机通信(自己整理的)(5页珍藏版)》请在人人文库网上搜索。1、左边1号机,右边2号机,功能实现1号机程序#include#define uint ...

    《51单片机实现双机通信(自己整理的)》由会员分享,可在线阅读,更多相关《51单片机实现双机通信(自己整理的)(5页珍藏版)》请在人人文库网上搜索。

    1、左边1号机,右边2号机,功能实现1号机程序#include#define uint unsigned int#define uchar unsigned charsbit p10=P10;uchar a,b,kk;/uchar code d_c=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;void delay_ms(uchar y)uchar i;while(y-)for(i=0;i#define uint unsigned int#define uchar unsigned charsbit L1=P20;sbit L2=P2。

    2、1;/uchar code d_c=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;void delay_ms(int x)uchar i;while(x-)for(i=0;i120;i+);void main()SCON=0x50; /串行口工作方式1,8位通用异步发送器TMOD=0x20; /定时器1工作方式2PCON=0x00; /波特率不倍增TH1=0xf4;TL1=0xf4;TR1=1;P1=0xc0;L1=L2=0;while(1)if(RI)RI=0;switch(SBUF)caseA:L1=L1;L2=0;P1=0xf9;break;caseB:L1=L1;L2=L2;P1=0xa4;break;caseC:L1=0;L2=0;P1=0xb0;break;delay_ms(100);/*if(RI)RI=0;if(SBUF=A)L1=L1;P1=0xf9;if(SBUF=B)L1=L1;L2=L2;P1=0xa4;if(SBUF=C)L1=0;L2=0;P1=0xc0;*/请浏览后下载,资料供参考,期待您的好评与关注。

    展开全文
  • 双机通信单片机的一个重要应用,MCS-51系列单片机上有一个通用异步接收/发送器UART,通过引脚RXD[P3.O]和TXD[P3.1]可与另一单片机进行全双工的串行异步通信,发送数据时由TXD端送出,接收时数据由RXD端输入。...
  • 51单片机-双机串行通信注释版,主机和从机是使用UART异步通讯方式,包括主机和从机完整源代码,如果需要仿真图,请关注我,从我的博客寻找下载
  • 大学本科生毕业论文 《单片机串行通信在双机通信中的应用》开题报告
  • 用两个 89C51 单片机实现双机通讯来做一个时钟,A 机用来产生数据,B 机用来显示。 具体思路是 A 机产生 a、b、c 的具体值,然后把 abc 传给 B 机显示数据。 A 机发送 a, b, c 给 B 机,B 机拿来用。 写出了...

    用两个 89C51 单片机实现双机通讯来做一个时钟,A 机用来产生数据,B 机用来显示。

    具体思路是 A 机产生 a、b、c 的具体值,然后把 abc 传给 B 机显示数据。

    A 机发送 a, b, c 给 B 机,B 机拿来用。

    写出了双方的通信部分,代码可见该问题的网址:

     http://zhidao.baidu.com/question/1731754753643347587.html

    为此,从网上找来这张图,显示函数、定时函数...,也都编写出来,供参考。



     
    PROTEUS 仿真电路图如下:
    



    图片链接:

    http://xiangce.baidu.com/picture/detail/8d7c506b7ade7f0feb49f353e22d81dfef5453dc

     

    //============================================

     

    B 机(显示数据)的程序如下:

     

    //--------------------------------

     

    #include<reg52.h>

     

    unsigned char  re_i = 0, r_buf[7] = {0,0,0,0,0,0,0};

    unsigned char  a = 13, b = 57, c = 40, d;

     

    //--------------------------------

    void delayms(unsigned int xms)

    {

        unsigned  int i, j;

        for(i = xms; i > 0; i--)  for(j = 110; j > 0; j--);

    //--------------------------------

    void display()

    {   

        char  i, dis[6];

        char code table[] = {

          0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};

        char code WEI[] = {1,2,4,8,16,32};

     

        dis[0] = a / 10; dis[1] = a % 10;

        dis[2] = b / 10; dis[3] = b % 10;

        dis[4] = c / 10; dis[5] = c % 10;

     

        for (i = 0; i < 6; i++) {

          P0 = table[dis[i]];

          P2 = WEI[i]; delayms(10); P2 = 0;

        }

    }

    //--------------------------------

    init()

    {

        PCON = 0;

        SCON = 0x50;

        TMOD = 0x20;

        TH1 = 0xfd;

        TL1 = 0xfd;

        TR1 = 1;

        ES = 1;

        EA = 1;

    }

    //--------------------------------

    main()        //乙机主函数

    {

        init();

        while(1) {

          display();

        }

    }

    //--------------------------------

    recv_abc()  interrupt 4  //乙机接收

    {

        if (RI) {

          RI = 0;

          d = SBUF;

          if (d == '$')  re_i = 0;

          r_buf[re_i] = d;

          re_i++;

          if (re_i == 7) {

            re_i = 0;

            a = (r_buf[1] - '0') * 10 + (r_buf[2] - '0');

            b = (r_buf[3] - '0') * 10 + (r_buf[4] - '0');

            c = (r_buf[5] - '0') * 10 + (r_buf[6] - '0');

          }

        }

    }

     

    //============================================

     

    A 机(产生数据)的程序如下:

     

    //--------------------------------

     

    #include<reg52.h>

     

    unsigned char  a = 13, b = 57, c = 40, d;

    bit  sec;

    //--------------------------------

    init()

    {

        PCON = 0;

        SCON = 0x50;

        TMOD = 0x21;

        TH1 = 0xfd;

        TL1 = 0xfd;

        TR1 = 1;

        EA = 1;

     

        TH0 = 0x4c;

        TR0 = 1;

        ET0 = 1;

    }

    //--------------------------------

    send(unsigned char x)    //甲机发送

    {

        SBUF = x;  while(!TI);  TI = 0;

    }

    //--------------------------------

    main()        //甲机主函数

    {

        init();

        while(1) {

          if(sec) {

            sec = 0;

            send('$');

            send(a / 10 + '0'); send(a % 10 + '0');

            send(b / 10 + '0'); send(b % 10 + '0');

            send(c / 10 + '0'); send(c % 10 + '0');

        } }

    }

    //--------------------------------

    T0_INT()  interrupt 1  //50ms定时中断函数

    {

        TH0 = 0x4c;

        d++;

        if (d >= 2) {  //20

          d = 0;

          sec = 1;

          c++;

          if (c == 60) {

            c = 0;

            b++;

            if (b == 60) {

              b = 0;

              a++;

              if (a == 24) a = 0;

        } } }

    }

     

    //============================================

     

    上述的两个程序,需分别编译,生成不同 HEX 文件;再分别用两个单片机来装入。

     

    程序执行后,即可显示出来前面插图的效果。B 机的显示器,每秒更新一次数据。

     

    当把中间的开关断开后,显示的数据便会停顿,不变了。

     

    再把中间的开关接通后,显示又会变化,而且数据并不受断开的影响。

     

    这说明,显示的内容,明显是从 A 机传送来的。

     

    //============================================

     

    本题目,需要传送的数据有时、分、秒共三个,这就属于多字节的串行通信。

     

    单片机的串行通信,每次只能传送一个字节,即 0~255。

     

    多字节的数据传送,需要制订协议。

     

    否则,连续传送一个一个的字节,到了接收方,也不知道哪个是时、哪个是分、哪个是秒。

     

    这时,一般要采用 ASCII 码来传送。

     

    用 0~9,即代表了一系列有用的数据。

     

    再用一个 0~9 之外的符号,当做《数据头》,就行了。

     

    本程序,就是以美元符 $ 当做数据头。

     

    传送了 $ 之后,接着就传送时的十位数、时的个位数、分的十位数、分的位数、秒的个位数。

     

    每次发送数据,就连续的发出七个字节。

     

    接收方收到了 $ 之后,就把后面再收到的当做时、分、秒的十位、个位保存。

     

    当收齐了七个字节,就把这后面的六个字节,送去显示。


    展开全文
  • 基于51单片机双机串行通信设计

    热门讨论 2010-12-22 22:30:55
    利用单片机来完成一个系统,实现双片单片机串行通信。通信的结果实用数码管进行显示,数码管采用查表方式显示。两个单片机之间采用RS232进行双机通信。在通信过程中,使用通信协议进行通信。
  • 文章阐述了一种采用RS—232 标准通信接口实现双机串行通信的设计方法, 介绍了Mo to ro la 司提供的通用电平转换芯片MC1488 和MC1489 的使用方法。
  • 单片机双机串行通信多数据传输汇编语言编程实现.pdf
  • 单片机STC15双机通信&异步串行通信Proteus 矩阵键盘 中断

    ●题目

    在这里插入图片描述
    在这里插入图片描述

    ●原理图

     1、CPU

       STC15W4K32S4系列

    STC15W4K32S4系列内含多种具体型号的单片机。下图摘自数据手册。
    在这里插入图片描述

    在这里插入图片描述

    !!! Proteus的网络标号不区分大小写
    乙机为区别甲机,乙机的标号前端加了下划线 _

     2、矩阵键盘

       ●矩阵键盘并没有按照 示意图接限流电阻(图中300欧姆的电阻,可能是限流,不理解该处电阻的作用);也未接上拉电阻(感觉没必要)。
       ●示意图中矩阵键盘的扫描接口接的是P0口,后经DL指点P0有BUG,测试见文末,改为P6口。
       ●四路与门是在调试矩阵键盘时,为中断扫描所连接的;在这个实验中矩阵键盘的接法为查询扫描&多行扫描

    在这里插入图片描述

    附:在Proteus的库中有已经封装好的矩阵键盘模块。
    在这里插入图片描述

    关于矩阵键盘可详见: 矩阵键盘.

     3、显示部分

      ●LED、数码管

       ●4个LED采用灌电流接法,经300欧姆排阻接VCC。
       ●使用了4个一位八段共阴数码管。
       ●LED对应按键值0—15,亮为1,灭为0,以8421BCD码显示按键值。
       ●数码管显示十进制0—15。
    在这里插入图片描述

      ●数码管驱动电路(74HC573锁存器)

       ●数码管采用静态驱动,为节省IO口资源外接了锁存器。
    在这里插入图片描述
    在这里插入图片描述

    ●程序

    代码为完整代码,关于双机通信单独的例子以及课本例程测试,可见 双机通信.

    #include<STC15.H>
    #include<intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    #define KeyBus P6    //定义矩阵键盘接口
    
    uchar Key_res =0; 
    uchar i=0;
    uchar temp=0XFF;     //串行发送临时传递参数
    uchar temp1=0XFF;    //串行接收临时传递参数 
    uchar busy;     //正忙标志(数据正在传输)
    code uchar A[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};  //无点,数码管驱动数组
    
    void GPIO(void);    //IO口初始化函数
    void Delay5ms();		//@11.0592MHz
    void UartInit(void);		//9600bps@11.0592MHz 串行口1初始化函数
    uchar Key16_Scan(void);//矩阵键盘扫描函数子程序
    void Key16_Function(void); //矩阵键盘服务(功能)子函数
    void SendData(void);  //发送串口数据 (串行发送采用查询方式)
    
    void main(void)
    {
    	GPIO();     //IO口初始化函数
        UartInit(); //串行口1初始化函数
    	ES=1;       //允许串行口1中断
    	EA=1;       //总中断允许控制位
    	while(1) 
    	{
    		Key_res =0; 
    		i=Key16_Scan();   //矩阵键盘扫描函数子程序
            switch(i)
    			{
    			  case  1: temp=0X00;break;
    			  case  2: temp=0X01;break;
    		      case  3: temp=0X02;break;
    		      case  4: temp=0X03;break;
    			  case  5: temp=0X04;break;
    			  case  6: temp=0X05;break;
    			  case  7: temp=0X06;break;
    			  case  8: temp=0X07;break;
    			  case  9: temp=0X08;break;
    			  case 10: temp=0X09;break;
    			  case 11: temp=0X0A;break;
    			  case 12: temp=0X0B;break;
    			  case 13: temp=0X0C;break;
    			  case 14: temp=0X0D;break;
    			  case 15: temp=0X0E;break;
    			  case 16: temp=0X0F;break;
    			  default: break;
    			}
            SendData();  //发送串口数据
    	}
    }
    
    //-----------------------------------IO口初始化函数-----------------------------//
    void GPIO(void)
    {
    	P0M1=0;
    	P0M0=0;
    	P1M1=0;
    	P1M0=0;
    	P2M1=0;
    	P2M0=0;
    	P3M1=0;
    	P3M0=0;
    	P4M1=0;
    	P4M0=0;
    	P5M1=0;
    	P5M0=0;
    }
    //------------------------------------软件延时---------------------------------------//
    void Delay5ms()		//@11.0592MHz
    {
    	unsigned char i, j;
    	i = 54;
    	j = 199;
    	do
    	{
    	  while (--j);
    	} while (--i);
    }
    //-------------------------------------串行口1初始化函数-----------------------------//
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	SCON = 0x50;		 //8位数据,可变波特率
    	AUXR |= 0x40;		 //定时器1时钟为Fosc,即1T
    	AUXR &= 0xFE;		 //串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		 //设定定时器1为16位自动重装方式
    	TL1 = 0xE0;		   //设定定时初值
    	TH1 = 0xFE;		   //设定定时初值
    	ET1 = 0;		     //禁止定时器1中断
    	TR1 = 1;		     //启动定时器1
    }
    
    
    //---------------------------------------矩阵键盘扫描函数子程序-------------------------//
    
    uchar Key16_Scan(void)
    {
    	uchar X_temp = 0,Y_temp = 0;
    	uchar Key_down = 0;
    	
    	KeyBus = 0XFF;	
    	KeyBus = 0X0F;	//高4位置0,低4位置1,此时有按键按下时,低四位的某一位会被拉低,由此定位按下的按键在第几列
    	Y_temp = KeyBus&0X0F;
    	
    	if(Y_temp!=0X0F)	//如果检测到某列有按键按下(有按键按下时,低四位会有一位被拉低)
    	{
    		Delay5ms();    //按键消抖(不知道有无必要)
    		KeyBus = 0X0F; 	
    	    Y_temp = KeyBus&0X0F;//将KeyBus低四位的按键信息赋值给Y_temp
    		if(Y_temp!=0X0F)
    		{
    			KeyBus = 0X0F;
    			Y_temp = KeyBus&0X0F;  //将KeyBus低四位的按键信息赋值给Y_temp,反应列信息
    			KeyBus = 0XF0;
    			X_temp = KeyBus&0XF0;  //将KeyBus高四位的按键信息赋值给X_temp,反应行信息
    			if(Key_down == 0)      //按键抬起检测,	
    			{
    			  switch(Y_temp)    //判断列
    			  {
    				  case 0X07: Key_res=1; break;
    				  case 0X0B: Key_res=2; break;
    				  case 0X0D: Key_res=3; break;
    				  case 0X0E: Key_res=4; break;
    				  default: return 0;    //无按键按下,返回0
    			  }
    			 switch(X_temp)    //判断行
    			  {
    				 case 0X70: return Key_res+12;break;
    			     case 0XB0: return Key_res+ 8;break;
                     case 0XD0: return Key_res+ 4;break;
                     case 0XE0: return Key_res;   break;
                     default: return 0;	 //无按键按下,返回0	
    			 }
    		 }
    	 }
    	}
    	else
    		Key_down = 0;	//按键被松开
    	if(Key_res)
    		Key_down = 1;	//标志按键被按下,防止重入
    	return Key_res;
    }
        
    
    //-----------------------------------矩阵键盘服务(功能)子函数-------------------//
    void Key16_Function(void) 
    {
    	if(i != 0)    //按键按下
    		{
    			switch(i)
    			{
    			  case  1: P1=0XFE;P2=0XFF;break;
    			  case  2: P1=0XFD;P2=0XFF;break;
    		      case  3: P1=0XFB;P2=0XFF;break;
    		      case  4: P1=0XF7;P2=0XFF;break;
    			  case  5: P1=0XEF;P2=0XFF;break;
    			  case  6: P1=0XDF;P2=0XFF;break;
    			  case  7: P1=0XBF;P2=0XFF;break;
    			  case  8: P1=0X7F;P2=0XFF;break;
    			  case  9: P1=0XFF;P2=0XFE;break;
    			  case 10: P1=0XFF;P2=0XFD;break;
    			  case 11: P1=0XFF;P2=0XFB;break;
    			  case 12: P1=0XFF;P2=0XF7;break;
    			  case 13: P1=0XFF;P2=0XEF;break;
    			  case 14: P1=0XFF;P2=0XDF;break;
    			  case 15: P1=0XFF;P2=0XBF;break;
    			  case 16: P1=0XFF;P2=0X7F;break;
    			  default:P1=0X00;P2=0X00;break;
    			}
    	}
    }
    
    //------------------------串行接收中断函数 (串行接收采用中断方式)---------------------//
    void uart_isr() interrupt 4
    {
    	if(RI)
    	{
    	    RI=0;       //清除RI位
            temp1=SBUF;
            switch(temp1)
    	   	 {
    			   case 0x00:P4=0XFF;P2=0X01;P7=A[0];P2=0X02;P7=A[0];break;
    			   case 0x01:P4=0XFE;P2=0X01;P7=A[0];P2=0X02;P7=A[1];break;
    			   case 0x02:P4=0XFD;P2=0X01;P7=A[0];P2=0X02;P7=A[2];break;
    			   case 0x03:P4=0XFC;P2=0X01;P7=A[0];P2=0X02;P7=A[3];break;
    			   case 0x04:P4=0XFB;P2=0X01;P7=A[0];P2=0X02;P7=A[4];break;
    		       case 0x05:P4=0XFA;P2=0X01;P7=A[0];P2=0X02;P7=A[5];break;
    			   case 0x06:P4=0XF9;P2=0X01;P7=A[0];P2=0X02;P7=A[6];break;
    			   case 0x07:P4=0XF8;P2=0X01;P7=A[0];P2=0X02;P7=A[7];break;
    			   case 0x08:P4=0XF7;P2=0X01;P7=A[0];P2=0X02;P7=A[8];break;
    			   case 0x09:P4=0XF6;P2=0X01;P7=A[0];P2=0X02;P7=A[9];break;
    			   case 0x0A:P4=0XF5;P2=0X01;P7=A[1];P2=0X02;P7=A[0];break;
    		       case 0x0B:P4=0XF4;P2=0X01;P7=A[1];P2=0X02;P7=A[1];break;
    			   case 0x0C:P4=0XF3;P2=0X01;P7=A[1];P2=0X02;P7=A[2];break;
    			   case 0x0D:P4=0XF2;P2=0X01;P7=A[1];P2=0X02;P7=A[3];break;
    		       case 0x0E:P4=0XF1;P2=0X01;P7=A[1];P2=0X02;P7=A[4];break;
    		       case 0x0F:P4=0XF0;P2=0X01;P7=A[1];P2=0X02;P7=A[5];break;
    			   default:P4=0XFF;break;
    		  }		
       }
    	 if(TI)
        {
           TI = 0;         //清除TI位
           busy = 0;       //清零正忙标志
        }
    
    }
    //-----------------------发送串口数据(串行发送采用查询方式)-------------------------------//
    void SendData(void)
    {
        while(busy);          //等待前面的数据发送完成
        busy = 1;             //将正忙标志置1,
    	SBUF = temp;          //串行发送
    }
    
    

    ●P0口BUG

      刚开始按照示意图使用P0口作为矩阵键盘的检测扫描接口,并没有实现功能。过程中发现P0口部分IO口不会被正常拉低、拉高,而是产生短路。尝试之后发现,只有P01和P03会和其它P0端的IO口发生短路,其他IO口正常。
    (具体分析ing)
    正常拉低:
    在这里插入图片描述

    发生短路:
    在这里插入图片描述
    在这里插入图片描述
    外接上拉电阻后,P01,P03的短路情况得到改变,能够被正常拉低。但是P04和P06此时却没有了电平指示(既不是高电平,低电平,也不是高阻态或者短路)
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 单片机双机通信实验报告计算机与信息工程学院综合性实验报告专业:物联网 年级/班级: 2015—2016学年第一学期课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目名称单片机双机通信实验类型...
  • 两片单片机利用串行口进行串行通信串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。串行口工作方式为方式1的全双工串行通信
  • 单片机】— {STC15}—{双机通信&矩阵键盘&异步串行通信&Proteus}例二 ●题目 ●原理图 ●CPU ●乙机 ●甲机矩阵键盘 ●甲机矩阵键盘 ●LCD12864 ●程序 例二  ●题目  ●原理图  ●CPU ...
  • 单片机双机串行通讯,两个单片机之间数据通信的仿真的实现
  • 单片机技术与应用(耿淬)教师教学时使用的教学PPT文档,项目八 单片机双机串行通信
  • #include"reg51.h" //此文件中定义了单片机的一些特殊功能寄存器 #include"math.h" #define PI 3.14 sbit P36=P3^6; //P36=0是单片机2数据发送完毕的标志 sbit P37=P3^7; //P37=0是单片机1数据发送完毕的标志 ...
  • 本文主要讲了51单片机双机通信硬件电路图及C程序,下面以来学习一下
  • 课题七 单片机双机通信 任务一 与PC通信 任务二 双机通信 课题目标 通过本任务学习什么是计算机的通信什么是 串口通信什么是并口通信学习用串行通信的方式实现单片机之间的信息交换学会应用单片机串行端口进行数据...
  • 双机串行通信 单片机单片机课程设计 容易的东西你懂得
  • 单片机双机通信 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 掌握89C51单片机异步串行口的通信原理和编程 掌握串行口工作方式1的使用及其波特率的计算 ...
  • 单片机双机通信

    万次阅读 多人点赞 2017-12-27 14:21:49
    单工通信主机控制从机。主机工作方式/********************初始化串口 bps为波特率**********************************/ void uart_init(unsigned int bps) { unsigned char t; SCON=0x50;//(0101)工作方式一:8...
  • 自己写的双机通信程序。资源类型:application/x-rar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 447
精华内容 178
关键字:

单片机串行双机通信