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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2607|回復: 7
收起左側

51單片機+8255可編程器件進行端口擴展項目討論

[復制鏈接]
ID:140239 發表于 2019-11-14 12:33 | 顯示全部樓層 |閱讀模式
因為手頭項目,要做端口的外部擴展,原本是FPGA進行主控,之前學了STM32,所以用32進行主控,現在出現了問題改成51進行芯片的仿真測試,找到了問題所在,把問題拿出來和大家討論,希望有經驗的大佬可以幫忙分析指點,沒有做過的兄弟們幫忙提供建設性意見,再次感謝。

直奔主題,在51測試的時候發現,可以獨立控制8255A的A口和B口進行外部輸出,這個經過測試是沒問題的,但是當用同樣的代碼進行對c口操作時,c口操作無效,而且還影響了AB口的狀態,查閱了8255的數據手冊,發現按道理時可以獨立操作ABC三個端口,問什么會出現這個問題呢?
其次8255A數據手冊中關于groupA、B分組的問題,可以將A口和C口的高4位進行整合為A組,可以將B口和C口的低4位進行整合為B組,這里的整合怎么操作?這里的操作是指怎么通過指令進行操作。
最后一個問題,在定義8255a的地址時,沒有使用傳統定義的給地址段,只是通過單一的控制A0、A1、CS指令進行控制有沒有影響?
此外,我完全把這個芯片當做數字芯片進行的操作

proteus仿真圖

proteus仿真圖

單片機源程序如下:
  1. #include "reg51.h"
  2.                         
  3. #define DATA P0                                   //定義數據輸出端口

  4. sbit    ADD0   = P2^0;   
  5. sbit    ADD1   = P2^1;   
  6. sbit    ADD2   = P2^2;
  7. sbit    ADD3   = P2^3;                   //定義地址端口

  8. sbit        CS0    = P1^0;
  9. sbit        CS1    = P1^1;                   //定義片選端口

  10. sbit        WR0    = P1^2;
  11. sbit        WR1    = P1^3;                   //定義寫操作端口

  12. sbit    LED    = P1^4;
  13. unsigned int keyvalue1,keyvalue2;

  14. void delay(unsigned int i)
  15. {
  16.     char j;
  17.     for(i; i > 0; i--)
  18.         for(j = 200; j > 0; j--);
  19. }


  20. void main()
  21. {
  22.         IT0=1;         //下降沿觸發
  23.         EX0=1;
  24.         IT1=1;         //下降沿觸發
  25.         EX1=1;
  26.         EA=1;               //外部中斷初始化
  27.      
  28.         keyvalue1=1;
  29.         keyvalue2=1;   
  30.     WR0=1;//數據初始化
  31.            while(1)
  32.            {
  33.                     if(keyvalue1==0)
  34.                  {
  35.                         delay(10);
  36.                         if(keyvalue1==0)
  37.                         {
  38.                            CS0=0;
  39.                            ADD0=1;
  40.                            ADD1=1;
  41.                            delay(300);
  42.                            WR0=0;
  43.                            DATA=0x80;
  44.                            delay(100);
  45.                            WR0=1;
  46.                            delay(300);          //控制字寫入

  47.                            ADD0=0;
  48.                            ADD1=0;
  49.                            delay(300);
  50.                            WR0=0;
  51.                            DATA=0x55;
  52.                            delay(100);
  53.                            WR0=1;
  54.                            delay(300);         //A口數據輸出
  55.                            

  56. //
  57. //                           ADD0=1;
  58. //                           ADD1=1;
  59. //                           delay(300);
  60. //                           WR0=0;
  61. //                           DATA=0x80;
  62. //                           delay(100);
  63. //                           WR0=1;
  64. //                           delay(300);          //控制字寫入

  65.                            ADD0=1;
  66.                            ADD1=0;
  67.                            delay(300);
  68.                            WR0=0;
  69.                            DATA=0xCC;                 //11001100
  70.                            delay(100);
  71.                            WR0=1;
  72.                            delay(300);         //B口數據輸出



  73. //                           ADD0=1;
  74. //                           ADD1=1;
  75. //                           delay(300);
  76. //                           WR0=0;
  77. //                           DATA=0x80;
  78. //                           delay(100);
  79. //                           WR0=1;
  80. //                           delay(300);          //控制字寫入
  81. //
  82. //                           ADD0=0;
  83. //                           ADD1=1;
  84. //                           delay(300);
  85. //                           WR0=0;
  86. //                           DATA=0x0F;         //00001111  ,00001101 ,00001011 ,00001001 ,00000111,00000101  00000011  00000001
  87. //                           delay(100);
  88. //                           WR0=1;
  89. //                           delay(300);         //C口數據輸出
  90.                          keyvalue1=1;

  91.                         }
  92.                
  93.                  }
  94.                      if(keyvalue2==0)
  95.                  {
  96.                         delay(10);
  97.                         if(keyvalue2==0)
  98.                         {
  99.                     
  100.                         }

  101.                  }
  102.         
  103.            }

  104. }



  105. /********************************************************
  106. * INT0中斷函數                                          *
  107. ********************************************************/
  108. void  counter0(void) interrupt 0  using 1
  109. {
  110.   
  111.    EX0=0;  
  112.    keyvalue1=0;
  113.    EX0=1;
  114. }
  115. /********************************************************
  116. * INT1中斷函數                                          *
  117. ********************************************************/
  118. void  counter1(void) interrupt 2 using 2
  119. {
  120.    
  121.   EX1=0;
  122.   keyvalue2=2;
  123.   EX1=1;
  124. }
  125. /********************************************************/
復制代碼
回復

使用道具 舉報

ID:140239 發表于 2019-11-14 12:34 | 顯示全部樓層
希望大家幫小弟解決一下這個問題,謝過了
回復

使用道具 舉報

ID:140239 發表于 2019-11-14 16:53 | 顯示全部樓層
頂一下熱度
回復

使用道具 舉報

ID:631219 發表于 2019-11-14 19:46 | 顯示全部樓層
回答最后一個問題:
最后一個問題,在定義8255a的地址時,沒有使用傳統定義的給地址段,只是通過單一的控制A0、A1、CS指令進行控制有沒有影響?

可以的,但要時序合適,一個寫操作周期應依次為 數據、A0/A1、CS、WR有效,延時(可選),WR、CS、A0/A1失效。一個讀操作周期應依次為 A0/A1、CS、RD有效,延時(可選)讀數據、RD、CS、A0/A1失效。
都要幾個指令,比較慢,而用給地址段的方法只要一條讀或寫指令,但要一般要硬件譯地址碼。
回復

使用道具 舉報

ID:140239 發表于 2019-11-14 21:25 | 顯示全部樓層
oldwood_hmgh 發表于 2019-11-14 19:46
回答最后一個問題:
最后一個問題,在定義8255a的地址時,沒有使用傳統定義的給地址段,只是通過單一的控 ...

謝謝回復,我在嘗試一下,現在問題主要在于第一個和第二個,說白了就是怎么對端口c進行操作,用c語言寫的代碼對程序的影響度如何沒法驗證
回復

使用道具 舉報

ID:123289 發表于 2019-11-16 09:13 | 顯示全部樓層
8255就是個邏輯電路,用什么CPU對控制都可以,只要符合手冊的規定就可以了。
回復

使用道具 舉報

ID:140239 發表于 2019-11-17 00:58 | 顯示全部樓層
哎,沒弄出來,可以實現AB單獨控制,C口控制不了,原因不詳,換方案了
回復

使用道具 舉報

ID:669864 發表于 2019-12-21 17:13 | 顯示全部樓層
感謝分享,嚶嚶嚶
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频一区二区 | 狠狠入ady亚洲精品经典电影 | 中文字幕视频在线观看 | 免费看国产一级特黄aaaa大片 | 黄色网址在线免费观看 | 欧美日韩久久久久 | 久久99网站 | 日韩中文字幕久久 | 特黄色一级毛片 | 日韩一区二区三区在线观看 | 欧美黑人体内she精在线观看 | 欧美日在线 | 色偷偷人人澡人人爽人人模 | 色综合久久天天综合网 | www亚洲精品 | 中文字幕av一区二区三区 | 国产精品99| 精品久久电影 | 美女国产 | 精品三区 | 日本一区二区三区免费观看 | 欧美一区二区在线 | wwwsihu| 国产我和子的乱视频网站 | 91精品国产高清一区二区三区 | 91大神在线资源观看无广告 | 国产激情一区二区三区 | 亚洲成人精品 | 久久综合久久久 | 久久久久久国产精品 | 最新中文字幕在线 | 日本免费在线看 | 国产亚洲精品久久情网 | 久久精品国产精品青草 | 日韩色视频 | 超碰一区二区 | 91国产视频在线观看 | 亚洲成人精品 | 日韩精品一区二区三区中文在线 | 黄色日批视频 | 国产精品1区2区3区 中文字幕一区二区三区四区 |