标题: 51单片机双机通讯程序,单个数码管显示,Proteus仿真图 [打印本页]

作者: lf2    时间: 2023-6-14 15:08
标题: 51单片机双机通讯程序,单个数码管显示,Proteus仿真图
1、在发送端proteus图纸中,  按下按键K1和K2,可以改变要发送的数据num(数值范围0~9),按下K3通过串口发送num数据到接收端。

接收端能够接受数据,并在数码管上显示接受的数字。

2、接收端也可以进行数据的发送,也可以发送数据到发送端,同时发送端也能显示接收到的数据。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

keil程序编写:

/*
        串口发送与接受一体的控制代码
*/
#include <REGX51.H>
#include <intrins.h>

//共阳0-F dp-a
unsigned char code tab[16]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

#define uchar unsigned char
sbit K1=P1^0;//ADD  递增
sbit K2=P1^1;//DEC  递减
sbit K3=P1^2;//DEC  递减



void UartInit(void)        //9600bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    TMOD = 0x20;        //设定定时器1为8位自动重装方式
    TL1 = 0xFD;        //设定定时初值
    TH1 = 0xFD;        //设定定时器重装值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
    ES=1;//开串口中断
    EA=1;//开总中断
}

char putchar (uchar ch)//向串口发送数据
{
     SBUF=ch;
     while(!TI);//查询发生是否完毕
     TI=0;//发送完毕,TI由软件清零
    return ch;
}

/********************************************************

函数功能: 延时c  ms
参    数:  c
返回  值: 无
*********************************************************/

void delayms( unsigned int ms)        //@11.0592MHz
{
     unsigned char i, j;
    for(;ms>0;ms--)
        {
                _nop_();
                i = 2;
                j = 199;
                do
                {
                    while (--j);
                } while (--i);
        }
}

uchar Receive_nums=0;//接收到的  字符
void Uart1() interrupt 4
{   
    if (RI)
   {
            RI=0;        //清除RI位
            Receive_nums=SBUF;   
         
   }
}

void main(void)
{
    uchar Transmit_nums=0;//发送给乙机的数字
    UartInit();
   
    while(1)
    {
        P0=~tab[Receive_nums];//在数码管上显示数字
        if(K1==0)//递增按键
        {
            delayms(10);//消抖
             if(K1==0)
             {
                Transmit_nums++;
                 if(Transmit_nums>9)
                     Transmit_nums=9;
             }
             while(K1==0);//等待按键K1松开
        }
        
        if(K2==0)//递减按键
        {
            delayms(10);//消抖
             if(K2==0)
             {
                Transmit_nums--;
                 if(Transmit_nums<1)
                     Transmit_nums=0;     
             }
         while(K2==0);//等待按键K2松开
        }
        
        if(K3==0)//发送按键
        {
            delayms(10);//消抖
             if(K3==0)
             {
                putchar(Transmit_nums);
             }
             while(K3==0);//等待按键K3松开
        }
    }
}


需要先从百度下载 VSPD虚拟串口调试软件
Keil代码与Proteus7.5仿真dsn文件下载:
双机通信dsn文件.7z (32.58 KB, 下载次数: 19)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1