[讨论] 求高手指点程序错误

simonprince   2009-9-14 08:13 楼主
//晶振12MHZ
功能:
1.外中断INT1,M1启动,延时3秒后,M2也启动
2.定时器T0,每50ms发送一次脉冲//


#include
#define uchar unsigned char
#define uint unsigned int
unsigned char data SendBuffer[]={};
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit ST = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit CS = P2^4;   
sbit SK = P2^5;   
sbit DI = P2^6;   
sbit DO = P2^7;
sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
sbit P3_2 = P3^2;
sbit P3_3 = P3^3;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;
uint count=0;
void delay(uint delaytime)
{
uint j=0;
for(;delaytime>0;delaytime--)
  {for(j=0;j<125;j++)
  {;}
  }
}
void service_int1()interrupt 2 using 2
{
  if(P3_3==0)
  delay(50);
  if(P3_3==0)
{P1_2=1;P1_0=1;delay(30000);P1_6=1;}
}

void time0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ST=0;
  ST=1;
}

void main()
{
  uint i;
  TMOD=0X11;  
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  ET0=1;
  TR0=1;
  EA=1;
  IP=0X04;
  IE=0X84;
  for(;;)
  {
  i=0;
  for(i=0;i<4;i++)
  {
   P1=0X7F;
   P0_1=i%2;
   P0_0=(i/2)%2;
   if(P2_1==0)
   delay(50);
   if(P2_1==0)
   {
   if(P0_0==0&P0_1==0){P1_4=1;P1_1=1;}
   else if(P0_0==0&P0_1==1){P1_5=1;P1_4=1;P1_1=1;P1_3=1;}
   else if(P0_1==0&P0_1==0){P1_5=1;P1_4=1;P1_1=1;P1_3=1;P1_6=1;}
   else if(P0_1==0&P0_1==1){P1_5=1;P1_3=1;}
   break;
   }
   if(P2_2==0)
   delay(50);
   if(P2_2==0)
   {
   if(P0_0==0&P0_1==0){P1_0=1;}
   else if(P0_0==0&P0_1==1){P1_0=1;P1_2=1;}
   else if(P0_1==0&P0_1==0){P1_6=1;P1_0=1;P1_2=1;}
   else if(P0_1==0&P0_1==1){P1_2=1;}
   break;
   }
   if(P2_3==0)
   delay(50);
   if(P2_3==0)
   {
   if(P0_0==0&P0_1==1){P1_6=1;P1_4=1;P1_1=1;P1_2=1;}
   else if(P0_0==1&P0_1==0){P1_1=1;P1_4=1;delay(30000);P1_5=1;P1_3=1;}
   break;
   }
   if(P2_0==0)
   delay(50);
   if(P2_0==0)
   {
   if(P0_0==0&P0_1==1){P1_6=1;P1_5=1;P1_0=1;P1_3=1;}
   else if(P0_0==1&P0_1==0){P1_2=1;delay(30000);P1_0=1;}
   break;
   }
  }
  }
}
*********************************************************

回复评论 (9)

这样估计大家都很难看懂
若提问的角度合适的话 大家都能帮你解决
每天进步一点点
点赞  2009-9-14 09:49
弄个附件上来,这样谁能看懂啊
点赞  2009-9-14 10:46

回复 沙发 hanker510 的帖子

版主指点下,我就是想问问这个程序能不能实现这2个功能:1.有外中断INT1响应时,M1启动,延时3秒后,M2也启动
2.定时器T0,每50ms发送一次脉冲//

[ 本帖最后由 simonprince 于 2009-9-14 12:42 编辑 ]
点赞  2009-9-14 12:31
楼主,你声明sbit P0_0 = P0^0;这么多干什么,一个#include都有了。发个电路,程序稍微注释些,其他人很容易看你的程序了。
点赞  2009-9-14 15:57
谢谢楼主,支持支持,学习学习
点赞  2009-9-14 20:07
这个程序的结构不是很好,在中断服务程序里面的语句要求尽量少,你还在中断里面调用函数,个人感觉不好!
点赞  2009-9-15 07:36
感谢大家的热情帮忙,对程序稍做修改,大家再帮忙看看
单片机控制继电器的电路省略

//晶振12MHZ
功能:
1.外中断INT1产生后,M1启动,延时3秒后,M2也启动
2.定时器T0,每50ms发送一次脉冲
3.按钮控制电机正反转
4.P2口通过驱动芯片连接到继电器(M1正转P2_0=1,M1反转P2_1=1,M2正转P2_2=1,M2反转P2_3=1,M3正转P2_4=1,M3反转P2_5=1,M4正转P2_6=1,M4反转P2_7=1)
P1.0、P1.1赋值0、1、2、3,程序启动后使SN74HC139N按次序依次循环输出低电平
P1.4P1.5检测低电平
例如:我要实现待SN74HC139N的第4引脚变成低电平时,当按下T1P1.4即可检测到并通过程序实现M1正转,若按下T2P1.5即可检测到实现M1反转

程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uint count=0;
sbit ST= P0^4;
void delay(uint delaytime)
{
uint j=0;
for(;delaytime>0;delaytime--)
  {for(j=0;j<125;j++)
  {;}
  }
}
void service_int1()interrupt 2 using 2
{
  if(P3_3==0)
  delay(50);
  if(P3_3==0)
{P2_1=1;delay(30000);P2_3=1;}//外中断INT1产生后,M1启动,延时3秒后,M2也启动
}

void time0() interrupt 1//定时器T0,每50ms发送一次脉冲,清0看门狗LTC1232
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ST=0;
  ST=1;
}

void main()
{
  uint i;
  TMOD=0X11;  
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  ET0=1;
  TR0=1;
  EA=1;
  IP=0X04;
  IE=0X84;
  for(;;)
  {
  i=0;
  for(i=0;i<4;i++)
  {
   P2=0X7F;//P2口通过驱动芯片连接到继电器
   P1_1=i%2;
   P1_0=(i/2)%2;
   if(P1_4==0)
   delay(50);
   if(P1_4==0)
   {
   if(P0_0==0&P0_1==0){P2_0=1;}
   else if(P0_0==0&P0_1==1){P2_2=1;}
   else if(P0_1==0&P0_1==0){P2_4=1;}
   else if(P0_1==0&P0_1==1){P2_6=1;}
   break;
   }
   if(P1_5==0)
   delay(50);
   if(P1_5==0)
   {
   if(P0_0==0&P0_1==0){P2_1=1;}
   else if(P0_0==0&P0_1==1){P2_3=1;}
   else if(P0_1==0&P0_1==0){P2_5=1;}
   else if(P0_1==0&P0_1==1){P2_7=1;}
   break;
   }
     }
  }
}

[ 本帖最后由 simonprince 于 2009-9-15 10:58 编辑 ]
  • 截图04副本.jpg
点赞  2009-9-15 10:53

这个问题不难

建议用PROTUS仿真或软件仿真下,
点赞  2009-9-15 10:57

回复 7楼 ptwang 的帖子

那外中断后,必须电机要动作,应该如何处理?谢谢指点
点赞  2009-9-15 11:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复