51单片机驱动ULN2003和传感器模块的一个问题

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3; //UNL2003引脚定义

sbit IN21=P1^0;
sbit IN22=P1^1;
sbit IN23=P1^2;
sbit IN24=P1^3; //ULN2003引脚定义
sbit D0=P0^4; //大气质量检测模块,直接输出TTL电平信号,大气质量差是输出低电平
sbit FM=P2^3; //蜂鸣器

uchar tt,i;

void Amove()//以下是两个电机驱动程序
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}

void Bmove()
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
}

void Cmove()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}

void Dmove()
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
}

void STOP()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN21=0;
IN22=0;
IN23=0;
IN24=0;
}

void init() //初始化中断程序
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void main()
{
init();//初始化
while(1)
{
if(D0==0) //检测大气质量检测模块电平信号
{
FM=0;
STOP(); //若检测到低电平,全部电机停止并响起蜂鸣器
}
Amove();
A2move();
delay(5);
Bmove();
B2move();
delay(5);
Cmove();
C2move();
delay(5);
Dmove();
D2move();
delay(5); //步进电机1驱动程序
}
}

void move() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;//定时器计时
if(tt==35)
{
tt=0;
{
for(i=50;i>0;i--)
{
Dmove(); //步进电机2驱动程序
D2move();
delay(5);
Cmove();
C2move();
delay(5);
Bmove();
B2move();
delay(5);
Amove();
B2move();
delay(5);
}
}
}
}
如上,由于字数限制删去了延时子函数和另一个步进电机驱动子函数,这个程序最终出来的效果是电机不能在一定角度内规则运动,大气质量检测模块不能正常工作,请问是什么原因?

    tt没有初始化;

     if(tt==35)最好改为if(tt>=35)

    //###重要###//你把反转的程序放在中断里,你跑那个反转的for循环语句的时候,定时器还是在走的,基本来说问题就出在这儿。

 一般来说,定时器只是修改FLAG值,像这种执行语句最好还是放在main主循环里执行。你可以sbit一个FLAG,中断中FLAG=~FLAG;在main里判断,if(FLAG==0)正转,else反转。

    什么电机 2 ??不是正反转么。。。

追问

这样子写的话,也能控制它来回转动吗?那就等于不需要计时了?
是正反转的,因为有两个电机,所以后面的程序可以看见都是两个芯片端口一起写

追答

你在主程序里判断,if(FLAG==0)正转,else反转。中断里仅仅处理一下标志位。中断里面的语句越多,反转固然没有问题,能转足200个步子,但是正转跟你预设的定时时间相差会很大。

追问

if(flag==0)

{
……
}
else
{
……
}

void move() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
flag=~flag;
}

是这个意思吗?修改后电机转动幅度很小,几乎看不出效果

追答

void move() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
if(tt>=35)
{
tt=0;
flag=~flag;
}
}

追问

可以了!谢谢!又学到东西了!

追答

可以了就采纳啊,才不枉费我一番心意啊。

追问

现在还剩那个大气质量模块的问题,模块一共四个引脚,电平信号输出脚没有接错,接线也和单片机共地了,上面程序这样检测有错吗?还有什么情况吗?

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-23
没有电路,不好分析。追问

电路很简单,可以描述一下,两个电机、一个传感器接最小系统电源,两个电机、传感器接到相应引脚就是了

追答

在定时中断函数中,再调用延时函数,其实,是不合理的。

另外:
for(i=50;i>0;i--) {
Dmove(); D2move(); delay(5); //步进电机2驱动程序
Cmove(); C2move(); delay(5);
Bmove(); B2move(); delay(5);
Amove(); B2move(); delay(5);--A、B2 ? 和前三行相比,反常!!!
}

追问

谢谢你!第二个问题的确是因为粗心了!导致电机二运行不正确,那第一个问题应该怎么解决?还有一个传感器模块无法使用

追答

大气质量检测模块不能正常工作,请问是什么原因?

--是这个吗?
--这个器件,没有用过。

--什么是不能正常工作?
--难道,它不输出高、低电平?

--如果,它输出了高低电平,给了单片机,
--你打算,进行什么操作?

追问

那一个模块只是检测到有情况时输出低电平,
程序上写的是,如果引脚检测到低电平,蜂鸣器响起,电机停止运作,
不能正常工作是指,我们把烟雾喷到探头上芯片没有做出相应的反应,
或者说当程序恰好进入中断时,模块检测到有问题但是芯片正在处理中断,所以不能正常运作?

追答

那一个模块只是检测到有情况时输出低电平,
不能正常工作是指,我们把烟雾喷到探头上芯片没有做出相应的反应,
--没有反应,是什么意思?
--你应该用万用表测试一下,模块有没有输出低电平?

--估计,模块并没有坏。
--你说的没有反应,显然,是你的程序有错。

程序上写的是,如果引脚检测到低电平,蜂鸣器响起,电机停止运作,
--谁写的程序,肯定是写错了。

--你觉得,应该有什么结果,你就说一说,你自己的想法。
--别拿错误的东西,当成标准。

或者说当程序恰好进入中断时,模块检测到有问题但是芯片正在处理中断,
所以不能正常运作?

--程序,肯定是正常工作的。
--问题是,程序,写错了:
--中断期间,不应该调用延时函数。

==================

前面问你:
--如果,它输出了高低电平,给了单片机,
--你打算,进行什么操作?

你并没有回答。

追问

十分感谢答主认真的回答,这个程序是我写的,最终按楼上那哥们改过来最终实现了想要的效果。学到的是在定时器中断处理中不应该过多放程序和延迟,一般只做标志位和计时就好了。
这个程序是我写的,所以检测到电平信号的时候相应的处理是响起蜂鸣器和停止两个电机运作。

追答

哦,你是《检测到电平信号的时候相应的处理是响起蜂鸣器和停止两个电机运作。》
这个设计要求,和时间,没有任何的关系吧?

看你的程序,好像:if(D0==0) FM=0。这一句,就是响起蜂鸣器?
真是这样的话,你就不用编程了,只要把 D0、FM 直接连上,即可实现。

检测 D0,应该用 while(D0==0) 语句,这才能停止两个电机运作。
等待 D0 上升之后,再令电机转动。
------------------
另外,看不来你的定时器有什么用处。
改变标志位,也不是非得用定时器。

你始终不肯透露:
《它输出高、低电平给单片机,你打算进行什么操作?》

仅提供参考程序如下:

void main()
{
init();//初始化

while(1) {

FM = D0; //这一句,可省略

while (D0 == 0) STOP();//停止两个电机,等待 D0 上升

for(i = 50; i > 0; i--) { //正转50步
Dmove(); D2move(); delay(5);
Cmove(); C2move(); delay(5);
Bmove(); B2move(); delay(5);
Amove(); A2move(); delay(5);
}

for(i = 50; i > 0; i--) { //再倒转50步
Amove(); A2move(); delay(5);
Bmove(); B2move(); delay(5);
Cmove(); C2move(); delay(5);
Dmove(); D2move(); delay(5);
}
}
D0 = 1 期间,就循环的正转、倒转,正转、倒转,...

这么简单的问题,再使用定时器,就是浪费资源。
你采纳的答案,所说的,基本上,一无是处。

追问

这确实是一个很好的思路!对于我这些初学者来说,尝试做一些简单的项目反而会把问题复杂化。依然感谢你对我的提问认真仔细的思考。但是方法也不是唯一的,全盘否定他人也不是一件颇有风度的事,所以感谢你的回答!祝生活愉快!

追答

呵呵,说的对呀!

无用的东西,对于某些生物,也是食量。

相似回答