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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1979|回復: 9
打印 上一主題 下一主題
收起左側

兩個51單片機串口通信程序遇到的疑惑

[復制鏈接]
跳轉到指定樓層
樓主
大家好最近學習單片機串口通信,教材給出的例子是一個數字密碼(935467)從甲傳遞給乙,再顯示到數碼管上。但通過Proteus仿真,一直顯示“8.8.8.8.8.8”,看不出問題在哪里。
發送端代碼如下:
  1. //程序:ex6_1.c
  2. //功能:甲機發送數據程序,采用查詢方式實現
  3. #include <reg51.h>  //包含頭文件reg51.h,定義51單片機的專用寄存器
  4. void main()                        //主函數
  5. {
  6.   unsigned char i;
  7. unsigned char send[]={9,3,5,4,6,7};  //定義要發送的動態密碼數據
  8.         TMOD=0x20;        //定時器T1工作于方式2
  9.         TL1=0xf4;         //波特率為2400bps
  10.         TH1=0xf4;
  11.         TR1=1;        
  12.         SCON=0x40;        //定義串行口工作于方式1
  13.     for (i=0;i<6;i++)
  14.     {
  15.             SBUF=send[i];     // 發送第i個數據
  16.             while(TI==0);     // 查詢等待發送是否完成
  17.             TI=0;                  // 發送完成,TI由軟件清0
  18.         }
  19.     while(1);
  20. }
復制代碼


接收端代碼如下:
  1. //程序:ex6_2.c
  2. //功能:乙機接收及顯示程序,采用查詢方式實現,采用中斷方式實現的程序參見
  3.       //6.3節中的ex6_5.c程序
  4. #include <reg51.h>     //包含頭文件reg51.h,定義51單片機的專用寄存器
  5. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6.                                                 //定義0~9共陽極顯示字型碼
  7. unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定義接收數據緩沖區
  8. void disp(void);    //顯示函數聲明
  9. void main()                        //主函數
  10. {
  11.     unsigned char i;
  12.         TMOD=0x20;      //定時器T1工作于方式2
  13.         TL1=0xf4;       //波特率定義
  14.         TH1=0xf4;
  15.         TR1=1;
  16.     SCON=0x40;      //定義串行口工作于方式1
  17.     REN=1;                 //接收允許
  18.     for(i=0;i<6;i++)
  19.     {
  20.              while(RI==0);                           //查詢等待,RI為1時,表示接收到數據
  21.              buffer[i]=SBUF;                         //接收數據
  22.              RI=0;                                            //RI由軟件清0
  23.     }
  24.     for(;;) disp();                                //顯示接收數據
  25. }
  26. //函數名:disp
  27. //函數功能:在6個LED上顯示buffer中的6個數
  28. //入口參數:無
  29. //出口參數:無
  30. void disp()
  31. {
  32.    unsigned char w,i,j;
  33.    w=0x01;              //位碼賦初值
  34.    for(i=0;i<6;i++)
  35.    {
  36.      P1=tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數組分量的下標
  37.      P2=~w;             // 送反相后的位碼
  38.      for(j=0;j<100;j++);// 顯示延時
  39.      w<<=1;                     // w左移一位
  40.    }
  41. }
復制代碼


因為乙的P2引腳電平一直沒有變化,懷疑是延時和串口通信沖突,又重新加載了接收端為中斷機制的程序:
  1. //程序:ex6_5.c
復制代碼

奇怪的是,仿真結果成了這樣,各位均為短橫"-":


P2電平狀態能正常切換,但字形依然不能正常顯示,似乎并沒有數據從甲成功傳遞。

各位大佬有知道的請指點一下,不勝感謝!

仿真程序.7z (22.31 KB, 下載次數: 6)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2023-6-6 01:05 | 只看該作者
P2口輸出經過了反相器74LS04,所以在程序中的P1和P2輸出剛好反好,應該為
P1=~tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數組分量的下標
     P2=w;             // 送反相后的位碼
另外仿真時,數碼管顯示未消影,所以最終要把程序改成如下就對了:
P1=0;
P1=~tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數組分量的下標
P2=w;             // 送反相后的位碼
回復

使用道具 舉報

板凳
ID:213173 發表于 2023-6-6 10:21 | 只看該作者
void disp()
{
        unsigned char w,i,j;
        w=0x01;                //位碼賦初值
        for(i=0;i<6;i++)
        {
                P2=0xff;           // 消隱
                P1=tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數組分量的下標
                P2=~w;             // 送反相后的位碼
                for(j=0;j<100;j++);// 顯示延時
                w<<=1;             // w左移一位
        }
}
回復

使用道具 舉報

地板
ID:1008259 發表于 2023-6-7 00:41 | 只看該作者
多謝樓上的回復,但似乎不是消隱的問題。
回復

使用道具 舉報

5#
ID:213173 發表于 2023-6-7 07:03 | 只看該作者
Intel2006 發表于 2023-6-7 00:41
多謝樓上的回復,但似乎不是消隱的問題。

消隱是問題之一,從你的圖片看明顯是數碼管用錯了,要用共陽。
回復

使用道具 舉報

6#
ID:213173 發表于 2023-6-7 07:04 | 只看該作者
Intel2006 發表于 2023-6-7 00:41
多謝樓上的回復,但似乎不是消隱的問題。


回復

使用道具 舉報

7#
ID:1008259 發表于 2023-6-7 08:01 | 只看該作者

是的,我昨晚也發現它用的是共陰極了。教材還是國家特等獎,但例程不止這一個有問題。
回復

使用道具 舉報

8#
ID:1008259 發表于 2023-6-7 13:15 | 只看該作者

多謝,但是我設置了消隱并修改了硬件為7SEG-MPX6-CA之后,顯示是6個“0”,還是沒解決啊?感覺甲機的數據傳送到乙(串口助手可以檢測到數據發送),但并沒有成功給buffer[]賦值,使得這個數組還是初始化的樣子。請問您知道里面的原因嗎?
回復

使用道具 舉報

9#
ID:213173 發表于 2023-6-7 15:49 | 只看該作者
Intel2006 發表于 2023-6-7 13:15
多謝,但是我設置了消隱并修改了硬件為7SEG-MPX6-CA之后,顯示是6個“0”,還是沒解決啊?感覺甲機的數據 ...

你仔細看一下甲機代碼,只在初始化時發送一次,如果乙機還沒有準備好,當然收不到,后續也沒有信號了。
回復

使用道具 舉報

10#
ID:1008259 發表于 2023-6-8 11:03 | 只看該作者
wulin 發表于 2023-6-7 15:49
你仔細看一下甲機代碼,只在初始化時發送一次,如果乙機還沒有準備好,當然收不到,后續也沒有信號了。

多謝,我再好好琢磨~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线小视频 | av一区二区三区四区 | 欧美一级二级在线观看 | 日韩电影一区 | 日韩欧美一级精品久久 | 日韩一区二区三区在线看 | 亚洲在线一区 | 日韩在线观看视频一区 | 欧美精品国产精品 | 午夜丁香视频在线观看 | 亚洲欧美视频一区二区 | 爱爱免费视频 | 成人不卡在线 | 久久精品久久久久久 | 精品国产一区二区三区成人影院 | 国产丝袜一区二区三区免费视频 | 国产免费看 | 日本不卡一区二区三区 | 无吗视频| 午夜影院在线观看视频 | 中文字幕亚洲区一区二 | 亚洲福利一区 | 亚州精品天堂中文字幕 | www.国产精品 | 国产片侵犯亲女视频播放 | 不卡一区二区三区四区 | 亚洲综合色婷婷 | 精品国产99 | 久久国产精品一区 | 日日骑 | 在线视频日韩 | 亚洲毛片在线 | 久久99精品久久久久久 | 久草青青草 | 成人国产精品色哟哟 | 日本在线观看视频 | 欧美视频xxx | 免费久久网| 欧美日韩国产一区 | 欧美在线视频网 | 免费黄色大片 |