找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2013|回复: 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 单片机教程网

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