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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4102|回復: 6
打印 上一主題 下一主題
收起左側(cè)

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

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:559790 發(fā)表于 2019-7-24 15:58 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一個主機,三個從機,撥碼開關前三個是選擇想要通信的從機,矩陣鍵盤是  將0-F  16個字符輸入到主機,在發(fā)送到從機,數(shù)碼管顯示

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



主機代碼
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define SUCC 0x2A                // 接收成功
#define ERR 0xF0                // 接收錯誤
#define MAXLEN 64            // 緩沖區(qū)最大長度
#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)        //發(fā)送數(shù)據(jù)函數(shù)
{
                TI = 0;
                TB8 = 0;                                // 發(fā)送數(shù)據(jù)幀
                SBUF =buf;        
                while(!TI);
                TI = 0;
}

void init_serial()                    // 串口初始化函數(shù)
{
        TMOD = 0x20;                        
        {
        
        };
                // 定時器T1使用工作方式2
        TH1 = 250;
        TL1 = 250;
        TR1 = 1;                                        // 開始計時
        PCON = 0x80;                                // SMOD = 1
        SCON = 0xd0;                                // 工作方式3,9位數(shù)據(jù)位,波特率9600kbit/s,允許接收SM2=0
}
uchar keyscan()          //鍵盤處理函數(shù)
{
        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;         //將兩個數(shù)據(jù)融合
                 switch(a)      //對比數(shù)據(jù)值
                 {
                         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;                                // 發(fā)送地址幀        
          SBUF = addr;
          while(!TI);
          TI = 0;
          senddata(buf);          // 發(fā)送數(shù)據(jù)
         
        }
        
}
從機代碼
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define SUCC 0x2A                // 接收成功
#define ERR 0xF0                // 接收錯誤
#define MAXLEN 64            // 緩沖區(qū)最大長度

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

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

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

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

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

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

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

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

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

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


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






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:431611 發(fā)表于 2019-7-25 01:09 | 只看該作者
下載下來試了一下,提示錯誤,仿真不呢能夠正常運行
回復

使用道具 舉報

板凳
ID:247623 發(fā)表于 2019-8-7 08:27 | 只看該作者
樓主,請教一下,我用的proteus7.8和proteus8.0都無法打開你的仿真文件,是哪里出問題了嗎
回復

使用道具 舉報

地板
ID:559790 發(fā)表于 2019-8-21 10:58 | 只看該作者
yilinghai 發(fā)表于 2019-8-7 08:27
樓主,請教一下,我用的proteus7.8和proteus8.0都無法打開你的仿真文件,是哪里出問題了嗎

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

使用道具 舉報

5#
ID:559790 發(fā)表于 2019-8-21 11:01 | 只看該作者
yinxiangxv 發(fā)表于 2019-7-25 01:09
下載下來試了一下,提示錯誤,仿真不呢能夠正常運行

上面三個是從機,請?zhí)砑訌臋Chex文件,就下面一個是主機,要添加主機hex文件。壓縮包里有兩個hex文件的
回復

使用道具 舉報

6#
ID:508562 發(fā)表于 2019-11-18 14:02 | 只看該作者
樓主 你叢機P1的值是干嘛用啊  看你的仿真電路圖 P1口又沒用
回復

使用道具 舉報

7#
ID:745845 發(fā)表于 2020-5-15 15:52 | 只看該作者
仿真以后按開關沒反應
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91人人澡人人爽 | 日韩一级黄色毛片 | 国产欧美一区二区三区国产幕精品 | 久久精品一区二区视频 | 亚洲444eee在线观看 | 香蕉久久a毛片 | av手机在线免费观看 | 久久99国产精一区二区三区 | 欧美精品一区二区在线观看 | 亚洲免费久久久 | 91网站视频在线观看 | 99只有精品 | 在线观看国产视频 | 欧美三区在线观看 | 亚洲欧美中文日韩在线v日本 | 国产在线视频在线观看 | 欧美一级艳情片免费观看 | 欧美三级久久久 | 免费观看一区二区三区毛片 | 日韩电影中文字幕 | 天天影视亚洲综合网 | 久久综合国产精品 | 国产在线视频一区二区 | 激情福利视频 | 一区二区成人在线 | 欧洲精品视频一区 | 国产精品视频在线播放 | 午夜影院在线观看视频 | 国产精品久久久久久久免费大片 | 天堂免费看片 | 国产成人免费视频网站高清观看视频 | 人人干超碰| 91精品国产综合久久久久蜜臀 | 成年人黄色一级毛片 | www.久久久久久久久 | 皇色视频在线 | 国产在线拍偷自揄拍视频 | 天堂色区 | 亚洲成人av | 天天玩夜夜操 | 日本精品一区二区在线观看 |