找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机双机通信发送8位动态密码(握手信号发送后只能显示第一个数字),求指导

[复制链接]
跳转到指定楼层
楼主
ID:1035752 发表于 2022-6-19 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
甲机发送:
#include<reg51.h>                //包含头文件reg.51,定义51单片机的专用寄存器
void main()                                //主函数
{
unsigned char i;
unsigned char led[]={3,2,3,4,5,6,7,8};         //定义要发送的动态密码数据
    TMOD=0x20;                                                         //定时器T1工作于方式2
    SCON = 0x50;                                                //定义串行口工作于方式1,允许接收
    TH1 = 0xfd;                                                        //波特率为9600bps
    TL1 = 0xfd;
    TR1 = 1;
        do{
           SBUF=0X01;
           while(!TI);
           TI=0;
           while(!RI);
           RI=0;
           } while( (SBUF^0x02)!=0 );
    for(i=0;i<8;i++)
        {
           SBUF=led[ i];
           while(TI==0);
           TI=0;
           }
        do{
           SBUF=0xaa;
           while(!TI);
           TI=0;
           while(!RI);
           RI=0;
        }while(SBUF!=0xaa);
   while(1);
}

乙机接收:
#include<reg51.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义0~9共阳极显示字型码
unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};        //定义1接收数据缓冲区
void disp(void);                     //显示函数声明
void delay(unsigned char i)         //定义延时函数声明
{
unsigned char j,k;                         //定义无符号字符型变量j和k
for(k=0;k<i;k++)                         //双重for循环语句实现软件延时
for(j=0;j<120;j++);
}
void main()                                         //主函数
{
unsigned char i;
TMOD=0x20;                                         //定时器T1工作于方式2
TH1=0xfd;                                         //波特率定义
TL1=0xfd;
SCON=0x50;                                         //定义串行口工作于方式1,允许接收
TR1=1;
while(1)
{
do{while(!RI)disp();
    RI=0;
   }while(SBUF!=0x01);
   SBUF=0x02;
   while(!TI)disp();
   TI=0;
   i=0;
   do{
      while(!RI)disp();
          RI=0;
          buffer[ i]=SBUF;
          i++;
          }while(SBUF!=0xaa);
   SBUF=0xaa;
   while(!TI)disp();
   TI=0;
   }                                       
}
void disp()        
{
unsigned char w,i;                        
w=0x01;                                
for(i=0;i<8;i++)
{
        P2=~w;                                        //送反相后的位码
    P1=tab[buffer[ i]];                //送共阳极显示字型段码,buffer[ i]作为数组分量的下标
    delay(10);                                //延时
    w<<=1;                                        //w左移一位
  }
  }


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

使用道具 举报

沙发
ID:161164 发表于 2022-6-19 20:57 | 只看该作者
本帖最后由 lkc8210 于 2022-6-19 21:19 编辑

以延时的方式显示数码管
仿碍了串口数握的接收

要不用串口中处理数握收发
要不开一个2毫秒中断处现数码管显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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