找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2961|回复: 4
打印 上一主题 下一主题
收起左侧

单片机+8255课程设计遇到的问题,求助!

[复制链接]
跳转到指定楼层
楼主
遇到两个问题    1.扩展口的PA口无法使用,我设定的程序是当P2.0口为低电平时将PA口循环输出信号经过光耦和驱动电路使得电机转动,但是无法实现。已经定义了这些不知道缺少了什么;

#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define PA XBYTE[0x0000]#define PB XBYTE[0x0001]
#define PC XBYTE[0x0002]
#define COM XBYTE[0x0003] //PA、PB、PC端口及命令端口地址定义
COM=0x80;//方式0,PA口与PB口均为输出
2.P2口接了按钮连了下拉电阻想按下按钮使得P2口的电平变为低电平,也无法做到。
单片机小白,求助大神!

111.png (71.9 KB, 下载次数: 44)

111.png

2222.png (57 KB, 下载次数: 35)

2222.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:402376 发表于 2018-9-27 18:23 | 只看该作者
本帖最后由 LonelyLiar 于 2018-9-27 18:25 编辑

还有LCD总是显示busy,无法显示..
回复

使用道具 举报

板凳
ID:402376 发表于 2018-9-27 18:25 | 只看该作者
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0x0000]
#define PB XBYTE[0x0001]
#define PC XBYTE[0x0002]
#define COM XBYTE[0x0003] //PA、PB、PC端口及命令端口地址定义
#define motor1 PA
#define        motor2 PB
sbit RS = P3^5;        //液晶引脚定义
sbit RW = P3^3;
sbit EN = P3^4;
sbit Xqj=P2^0;   //电机正转,X轴前进按钮
sbit Yqj=P2^1;   //电机正转,Y轴前进按钮
sbit Xht=P2^2;   //电机反转,X轴后退按钮
sbit Yht=P2^3;   //电机反转,Y轴后退按钮
sbit jiting=P2^4;//急停按钮
sbit dula=P2^6;         
sbit wela=P2^7;         
bit flag1=0;     //x轴正反转标志位
bit flag2=0;     //Y轴正反转标志位  
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xf8,0x80,0x90};//共阳极数码管编码
uchar code a1[]={0xf2,0xfa,0xf8,0xf9,0xf1,0xf5,0xf4,0xf6}; //八拍正转
uchar code a2[]={0xf6,0xf4,0xf5,0xf1,0xf9,0xf8,0xfa,0xf2}; //八拍反转
uchar temp1=0000,temp2=0000,temp3=0000,temp4=0000;
void delayms(uchar x)//延时程序
{                                                                                               
  uchar c,j;
  for(c=x;c>0;c--)
   for(j=123;j>0;j--);
}

/***********LED写入命令函数***********/
void write_com(uchar com)
{
  //while(LCD_Check_Busy()); //忙则等待
  RS=0;
  P1=com;
  _nop_();
  RW=0;
  EN=1;
  _nop_();
  EN=0;
  _nop_();
}
/**********LED写入数据函数**********/
void write_dat(uchar chr)
{
  //while(LCD_Check_Busy()); //忙则等待
  RS=1;
  P1= chr;
  _nop_();
  RW=0;
  EN=1;
  _nop_();
  EN=0;
  _nop_();
}
void write_shuzi(uchar dat)
{  
  uchar t;
  t=dat+'0';
  //while(LCD_Check_Busy()); //忙则等待
  RS=1;
  RW=0;
  P1=t;
  _nop_();
  EN=1;
  _nop_();
  EN=0;
}

void GotoXY(uchar x,uchar y)   
{   
   if(y==0)                         //第一行
     write_com(0x80|x);               //写地址
   if(y==1)                         //第二行
     write_com(0x80|(x+0x40));   
}
/*****LED初始化函数******/
void LCD_Init()
{
          RW=0;
        dula=0;         //关闭数码管显示
        wela=0;         //关闭数码管显示
   write_com(0x38); /*显示模式设置*/
   delayms(5);
   write_com(0x06);/*显示光标移动设置*/
   delayms(5);
   write_com(0x0C); /*显示开及光标设置*/
   write_com(0x01);  /*显示清屏*/
   }


void dispose()
{
  uchar a,b,bai1,shi1,ge1,bai2,shi2,ge2;
  a=(temp1-temp3)/8*75/36*5;
  b=(temp2-temp4)/8*75/36*5;
  bai1=a%1000/100;
  shi1=a%100/10;
  ge1=a%10;
  bai2=b%1000/100;
  shi2=b%100/10;
  ge2=b%10;
  write_shuzi(bai1);
  GotoXY(7,1);
  write_shuzi(shi1);
  GotoXY(8,1);
  write_shuzi(ge1);
  GotoXY(9,1);
  write_shuzi(bai2);
  GotoXY(7,2);
  write_shuzi(shi2);
  GotoXY(8,2);
  write_shuzi(ge2);
  GotoXY(9,2);
  write_dat('X');
  GotoXY(4,1);
  write_dat(':');
  GotoXY(5,1);
  write_dat('Y');
  GotoXY(4,2);
  write_dat(':');
  GotoXY(5,2);
  if(a<0)
  {
    write_dat('-');
    GotoXY(6,1);
  }
  if(b<0)
  {
    write_dat('-');
    GotoXY(6,2);
  }
}
void key()
{
  if(Xqj==0)
  {
   delayms(5);
   if(Xqj==0)
   {
     flag1=1;
     while(Xqj==0);
   }
  }
  if(Xht==0)
  {
    delayms(5);
    if(Xht==0)
    {
      flag1=~flag1;
      while(Xht==0);
    }
  }
  if(Yqj==0)
  {
    delayms(5);
    if(Yqj==0)
    {
      flag2=1;
      while(Yqj==0);
    }
  }
  if(Yht==0)
  {
    delayms(5);
    if(Yht==0)
    {
      flag2=~flag2;
      while(Yht==0);
    }
  }
}
void qudong()
{
if(flag1==1)
{
  uchar i;
  for(i=0;i<8;i++)          
  {
    if(jiting==0)
    {break;}
    PA=a1[i];
    temp1++;
  }
  i=0;                                 
}
if(flag2==1)
{
   uchar j;
  for(j=0;j<8;j++)          
  {
    if(jiting==0)
    {break;}
    PB=a1[j];
    temp2++;
  }
  j=0;                                 //八拍正转子程序
}
if(flag1==0)
{
  uchar k;
  for(k=0;k<8;k++)          
  {
    if(jiting==0)
    {break;}
    if(Xht==0)
    {PA=a2[k];}
    temp3++;
  }
  k=0;               
}
if(flag2==0)               
{          
  uchar u;
  for(u=0;u<8;u++)
  {
    if(jiting==1)
    {break;}
    if(Yht==1)
    {PB=a2[u];}
    temp4++;
  }                                           //八拍反转转子程序
  u=0;
}
}
void main()
{
COM=0x80;//方式0,PA口与PB口均为输出
  Xqj=1;  
  Yqj=1;   
  Xht=1;   
  Yht=1;   
  jiting=1;
while(1)
{
  key();
  dispose();
  qudong();
}
}
这是程序
回复

使用道具 举报

地板
ID:387733 发表于 2018-9-28 07:22 | 只看该作者
地址锁存器74S373的输入端顺序接反了,CPU的 P0.0~P0.7 依次连接了 373的 D7~D0,所以8255的地址全错了。把连线换过来,或者把地址定义改一下:
#define PA XBYTE[0x0000]
#define PB XBYTE[0x0080]
#define PC XBYTE[0x0040]
#define COM XBYTE[0x000C]
这样也是可以的
回复

使用道具 举报

5#
ID:402376 发表于 2018-9-28 15:46 | 只看该作者
sxhwdz 发表于 2018-9-28 07:22
地址锁存器74S373的输入端顺序接反了,CPU的 P0.0~P0.7 依次连接了 373的 D7~D0,所以8255的地址全错了。把 ...

谢谢       这个问题解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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