找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机的P3.2和P3.3口有区别吗?

[复制链接]
回帖奖励 30 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
proteus仿真里把P3.2设为信号输入判断高低电平计数,P3.3为计数启动键这里我想把这两个键对调一下,变为:P3.2启动键,P3.3信号输入键,程序里是外部定义全局变量,把P口改了,但是仿真里好像识别不到P3.3的信号?我的启动键一上一下反而计数值增加了,这是为什么?
程序如下:

sbit k1=P3^2; //sbit在外部定义全局变量 k1启动键
sbit P33=P3^3;
//变量


uint  now=0; //计数值
uint  set=10;
uint  bzbu=0;//设置
uint  bz=0;//模式
uint  qidong=0;//运行
//显示控制
void dis()
{
  //now
  lcd1602_adr(0x0B);  
  lcd1602_writenumber(0x30+now%10000/1000);
  lcd1602_writenumber(0x30+now%1000/100);
  lcd1602_writenumber(0x30+now%100/10);
  lcd1602_writenumber(0x30+now%10);
  //set
  lcd1602_adr(0x4B);  
  lcd1602_writenumber(0x30+set%10000/1000);
  lcd1602_writenumber(0x30+set%1000/100);
  lcd1602_writenumber(0x30+set%100/10);
  lcd1602_writenumber(0x30+set%10);
  if(bz==0)lcd1602_writenumber(' ');
  if(bz==1)lcd1602_writenumber('<'); //bz为1写入,为0???没看懂
   //启动
  if(bz==0)
  {
    if(k1==0)
                        {qidong=(qidong+1)%2;
                if(qidong==1)
                {;} //
                else {;}
                while(k1==0);}
   }
   //启动 K1为0 启动  %取余数
  if(qidong==1)
  {
    if(now>=set){qidong=0;_delay_ms(500);  }  //蜂鸣器叫,灯关
   }
   //启动

}
//按键功能函数
void key()
{
  //扫描
  key_z();
  if(keyn1<16)
  {       
   if((keyn1<10)&&(bz==1))
        {
         if(bzbu==0){set=keyn1;}
         if(bzbu==1){set=set*10+keyn1;}
         if(bzbu==2){set=set*10+keyn1;}
         if(bzbu==3){set=set*10+keyn1;}
         bzbu=(bzbu+1)%4;
        }
        if((keyn1==0x0a)&&(bz==0)){now=0;}//复位
        if((keyn1==0x0b)&&(bz==1)){set=0;}//复位输入
        if((keyn1==0x0c)&&(qidong==0)){bz=1;}//设置
        if(keyn1==0x0d){bz=0;}//退出
        keyn1=16;
  }
}
void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<120;i++);
        }
}

void SETP_MOTOR_FFW(uchar n)
{
        uchar i,j;
        for(i=0;i<5*n;i++)
        {
                 for(j=0;j<8;j++)
                {
                        
                        P1 = FFW[j];
                        DelayMS(25);
                        dis(); //显示
   key();

                }
        }
}

void SETP_MOTOR_REV(uchar n)
{
        uchar i,j;
        for(i=0;i<5*n;i++)
        {
                 for(j=0;j<8;j++)
                {
                        
                        P1 = REV[j];
                        DelayMS(25);
                        dis(); //显示
   key();
                }
        }
}
//-----------------------
void main()   
{
                uchar N = 3;
  _delay_us(10);
  _delay_ms(10);  
  //中断允许
  IT0=1;
  EX0=1;
  EA=1;  
  //初始化
  lcd1602_init();
  LCD1602_string(1,1,zifu0);
  LCD1602_string(1,1,zifu0);
  LCD1602_string(2,1,zifu1);
  while(1)
  {

                 if(K1 == 0)
                {
                         dis(); //显示
   key();
               
                        SETP_MOTOR_FFW(N);
               
                       
                }
                else if(K2 == 0)
                {
                         dis(); //显示
   key();
               
                        SETP_MOTOR_REV(N);
                       
                }
                else
                {
                         dis(); //显示
   key();
                 
                }
        }
}


//INT0中断函数
void  EX_INT0() interrupt 0
{
if(qidong==1)
{
  _delay_ms(3);if(P33==0)now=now+1;  
}
}




1589552934(1).jpg (2.19 KB, 下载次数: 52)

1589552934(1).jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:444385 发表于 2020-5-15 22:59 | 只看该作者
发现了,是中断方式那里的问题...
我把中断方式从0改为1,  IT0=1;  EX0=1; 改为  IT1=1;  EX1=1; ,再把最后void  EX_INT0() interrupt 0改为void  EX_INT1() interrupt 0

为啥还是不行?
回复

使用道具 举报

板凳
ID:755472 发表于 2020-5-21 15:35 | 只看该作者
两个IO共一个中断向量吗?如果不是,改了IO口就必须改对应的中断向量名称才能进入中断
回复

使用道具 举报

地板
ID:631508 发表于 2020-5-22 08:56 | 只看该作者
p3.2 3.3和其他IO口没什么区别,就是它本身多了个中断的功能,其他引脚怎么接与它无关,你想用中断功能就把要中断的外部器件接到它两其中一个上就好了,然后编写响应的中断程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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