找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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