久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4064|回復: 6
收起左側

單片機多機通信,數碼管顯示通信信息,C語言代碼+proteus仿真

  [復制鏈接]
ID:559790 發表于 2019-7-24 15:58 | 顯示全部樓層 |閱讀模式
一個主機,三個從機,撥碼開關前三個是選擇想要通信的從機,矩陣鍵盤是  將0-F  16個字符輸入到主機,在發送到從機,數碼管顯示

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

proteus仿真

proteus仿真



主機代碼
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define SUCC 0x2A                // 接收成功
#define ERR 0xF0                // 接收錯誤
#define MAXLEN 64            // 緩沖區最大長度
#define KEY P2

uchar buf;
uchar addr;         
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};        

void delay(uint t)         // 延時t毫秒
{
            uint i,j;        
                for (i=0;i<t;i++)
                for (j=0;j<125;j++);        
}
void senddata(uchar buf)        //發送數據函數
{
                TI = 0;
                TB8 = 0;                                // 發送數據幀
                SBUF =buf;        
                while(!TI);
                TI = 0;
}

void init_serial()                    // 串口初始化函數
{
        TMOD = 0x20;                        
        {
        
        };
                // 定時器T1使用工作方式2
        TH1 = 250;
        TL1 = 250;
        TR1 = 1;                                        // 開始計時
        PCON = 0x80;                                // SMOD = 1
        SCON = 0xd0;                                // 工作方式3,9位數據位,波特率9600kbit/s,允許接收SM2=0
}
uchar keyscan()          //鍵盤處理函數
{
        uchar a,b,c;
        KEY=0x0f;               //鍵盤口置00001111
        if(KEY!=0x0f)      //查詢鍵口值是否變化
        {
                delay(20);       //去抖
                if(KEY!=0x0f)    //        有鍵按下
                {
                        a=KEY;       //鍵值放在寄存器a中               
                }
                 KEY=0xf0;                //將鍵盤口置11110000
                 c=KEY;         //將第二次取得值放入寄存器c中
                 a=a|c;         //將兩個數據融合
                 switch(a)      //對比數據值
                 {
                         case  0xee  :  b=0;break;
                        case  0xde  :  b=1;break;
                        case  0xbe  :  b=2;break;
                        case  0x7e  :  b=3;break;
                        case  0xed  :  b=4;break;
                        case  0xdd  :  b=5;break;
                        case  0xbd  :  b=6;break;
                        case  0x7d  :  b=7;break;
                        case  0xeb  :  b=8;break;
                        case  0xdb  :  b=9;break;
                        case  0xbb  :  b=10;break;
                        case  0x7b  :  b=11;break;
                        case  0xe7  :  b=12;break;
                        case  0xd7  :  b=13;break;
                        case  0xb7  :  b=14;break;
                        case  0x77  :  b=15;break;
                        default:break;   //鍵值錯誤處理
                 }
        }
        return(b);   //將b作為返回值
}

void main()
{
        while(1)
    {
               
                 buf=keyscan();
                  P1=duanma[keyscan()];
            /* 通過P0口讀要訪問的從機地址 */
          P0 = 0xff;
          addr = P0&0x0f;
          init_serial();                // 串口初始化

          EA = 1;                                // 打開所有中斷
        
          TI = 0;
          TB8 = 1;                                // 發送地址幀        
          SBUF = addr;
          while(!TI);
          TI = 0;
          senddata(buf);          // 發送數據
         
        }
        
}
從機代碼
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define SUCC 0x2A                // 接收成功
#define ERR 0xF0                // 接收錯誤
#define MAXLEN 64            // 緩沖區最大長度

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar buf;                        //數據寄存
uchar addr;                    //地址寄存

sbit led= P3^4;                // 此引腳控制發光管

/* 延時t毫秒 */
void delay(uint t)
{
        uint i,j;
                for (i=0;i<t;i++)
                for (j=0;j<125;j++);
}

/* 接受數據函數 */
uchar recvdata()
{

        /* 接收數據 */
                while(!RI);
                if (RB8==1)
                        return 0xee;                // 若接收的為地址幀,則返回0xee
                buf = SBUF;        
                RI = 0;        
        return 0;                                        // 返回0
}

/* 串口初始化函數 */
void init_serial()
{
        TMOD = 0x20;                                // 定時器T1使用工作方式2
        TH1 = 250;
        TL1 = 250;
        TR1 = 1;                                        // 開始計時
        PCON = 0x80;                                // SMOD = 1
        SCON = 0xd0;                                // 工作方式,9位數據位,波特率9600kbit/s,允許接收
}

/* 主程序 */
void main()
{
        uchar i = 0;
        uchar tmp = 0xff;
        P1= 0xff;
        addr = P1&0x0f;                                // 獲取本機地址
        led = 1;                                        // 發光管不亮
        
        init_serial();                                // 串口初始化

        EA = 1;                                                // 打開所有中斷
        

        while(1)                    //進入從機應答
        {
                SM2 = 1;                                // 只接收地址幀
               
                while (tmp!=addr)        // 如果接收到的地址幀不是本機地址,則繼續等待
                 {
                         P0=0XFF;            //如果不是本機,就關掉數碼管
                        RI = 0;
                        while(!RI)
                        tmp = SBUF;
                        RI = 0;
                 }        
                    SM2 = 0;                                // 允許接收數據
                                
            tmp = recvdata();    // 數據接收  
            
                     if (tmp==0x00)           
                     {                 
                          P0=table[buf];

                            led = 0;                        
                            delay(30);
                            led = 1;
                        
                     }            
        // 如果接收數據時發現地址幀,則重新開始整個接收過程        
        }
}


如果打開運行出錯,請重新添加下hex文件,就可以了的。
全部資料51hei下載地址:
多機通信.zip (98.09 KB, 下載次數: 94)
回復

使用道具 舉報

ID:431611 發表于 2019-7-25 01:09 | 顯示全部樓層
下載下來試了一下,提示錯誤,仿真不呢能夠正常運行
回復

使用道具 舉報

ID:247623 發表于 2019-8-7 08:27 | 顯示全部樓層
樓主,請教一下,我用的proteus7.8和proteus8.0都無法打開你的仿真文件,是哪里出問題了嗎
回復

使用道具 舉報

ID:559790 發表于 2019-8-21 10:58 | 顯示全部樓層
yilinghai 發表于 2019-8-7 08:27
樓主,請教一下,我用的proteus7.8和proteus8.0都無法打開你的仿真文件,是哪里出問題了嗎

請用最新的版本,proteus8.6的就可以打開
回復

使用道具 舉報

ID:559790 發表于 2019-8-21 11:01 | 顯示全部樓層
yinxiangxv 發表于 2019-7-25 01:09
下載下來試了一下,提示錯誤,仿真不呢能夠正常運行

上面三個是從機,請添加從機hex文件,就下面一個是主機,要添加主機hex文件。壓縮包里有兩個hex文件的
回復

使用道具 舉報

ID:508562 發表于 2019-11-18 14:02 | 顯示全部樓層
樓主 你叢機P1的值是干嘛用啊  看你的仿真電路圖 P1口又沒用
回復

使用道具 舉報

ID:745845 發表于 2020-5-15 15:52 | 顯示全部樓層
仿真以后按開關沒反應
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费成人在线网站 | 播放一级黄色片 | 噜噜噜色网 | 91色视频在线 | 欧美三级在线 | 欧美在线观看免费观看视频 | 日韩精品一区二区三区在线 | 国产高清精品在线 | 中文字幕四虎 | 久久三区 | 黄色毛片免费 | 久久com| www.免费看片.com | 精品国产青草久久久久96 | 91免费看片 | 久草视频在线看 | 欧美日一区二区 | 夜色www国产精品资源站 | 日日夜夜免费精品视频 | 综合久久av | 亚洲欧美在线观看 | 成人免费网站 | av午夜电影| 刘亦菲国产毛片bd | 视频二区 | 伊人精品在线 | 欧美一区二区三区电影 | 成人三级网址 | 欧美国产91| 成人免费看片 | 伊人二区 | 日韩在线一区二区 | 日韩字幕| 欧洲妇女成人淫片aaa视频 | 99精品国产一区二区三区 | 视频一区二区在线观看 | 亚洲国产精品区 | 久久日韩精品 | 精品一区久久 | 国产精品日韩欧美一区二区三区 | 国产精品久久久久久婷婷天堂 |