想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写

想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写,第1张

单片机进入空闲模式的方法:

PCON |= (1<<0);

单片机进入掉电模式的方法:

PCON |= (1<<1);

单片机允许外部中断0的程序:

EX0 = 1;

IT0 = 1;//----IT0 = 0也可以,前者是下降沿触发,后者是低电平触发,随便你

EA = 1;

如果你允许了外部断0中断,那么,即使单片机进入空闲模式,一旺有中断,单片机就可以被唤醒继续执行

如果你的单片机进入了掉电模式,则单片机不会响应外部中断的,或者说单片机就等于是彻底关机了

,所以,即使你有外部中断,单片机也醒不了

因为空闲模式,其实是让单片机的CPU睡着了,而掉电模式,则是让整个单片机睡觉,而外部中断属于单片机的一部分,因此,掉电模式使得整个单片机睡着了,那么外部中断0自然也睡着了,既然睡着了,就不会响应中断

1利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,反射器发射出去的红外光被大部分反射回来。于是传感器输出低电平0。

2当平面中有一条黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射的红外光很少,打不到传感器动作的水平,所以传感器输出1。

所以当探头经过黑线时,传感器上的开关指示灯会熄灭,输出的是高电平。如果没有经过黑线,一直保持低电平。

3红外传感器

它具有三个引脚,分别是:VCC  GND  OUT

有障碍物灯就会亮,所以有障碍物代表低电平,没有障碍物高电平。

自己看注释改一下就行 函数都写好了了 没用的删掉就可以了

#include<reg52h>

#include<mathh>

#define uchar unsigned char

#define uint unsigned int

#define L_M 1

#define R_M 2

uchar temp2,temp1,t,m1,m2,redline;

sbit tr=P2^4; //超声波

sbit ec=P2^5; //

sbit en=P2^7; //液晶的EN

sbit rs=P2^6; //液晶RS选择端

//液晶数据口 P0口

sbit Rin_1=P2^0; //寻迹管脚输入

sbit Rin_2=P2^1;

sbit Lin_2=P2^2;

sbit Lin_1=P2^3;

sbit L_EN=P1^0; //左侧电机使能

sbit L_1=P1^1; //左侧电机控制 1

sbit L_2=P1^2; //左侧电机控制 2

sbit R_1=P1^3; //右侧电机控制 1

sbit R_2=P1^4; //右侧电机控制 2

sbit R_EN=P1^5; //右侧电机使能

void delay(uint z) //延时程序1

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void delay1s(uchar t) //1s延时函数

{

uchar a,h,i,j,k;

for(a=t;a>0;a--)

{

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}

}

void v_cotrol(uchar number,uchar speed)

{

if(speed<100)

{

if(number==1)

m1=abs(speed);

if(number==2)

m2=abs(speed);

}

}

void turnleft()

{

L_1=1; // left fan zhuan //

L_2=0;

R_1=1; // right fanzhuan

R_2=0;

}

void turnright()

{

L_1=0; // left zheng zhuan

L_2=1;

R_1=0; // right fanzhuan

R_2=1;

}

void gostright()

{

L_1=0; // left zheng zhuan

L_2=1;

R_1=1; // right zhengzhuan

R_2=0;

}

void goback()

{

L_1=1; // left zheng zhuan

L_2=0;

R_1=0; // right zhengzhuan

R_2=1;

}

void stop()

{

L_1=1; // stop

L_2=1;

R_1=1; // stop

R_2=1;

}

void timer0_int()

{

TMOD=0X01;

TH0=-100/256;

TL0=-100%256;

EA=1;

ET0=1;

TR0=1;

}

state_int()

{

Rin_1=1;

Rin_1=1;

Lin_1=1;

Lin_1=1;

t=0;

m1=50;

m2=50;

stop();

}

void main()

{

timer0_int();

state_int();

while(1)

{

//避障程序

if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))

gostright();

if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

turnleft();

if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))

turnright();

if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

goback();

if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))

gostright();

if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

turnleft();

if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))

turnright();

if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

goback();

}

while(1);

}

timer0() interrupt 1

{

TH0=-100/256;

TL0=-100%256;

if(t==0)

{

temp1=m1;

temp2=m2;

}

if(t==temp1)

L_EN=0;

if(t==temp2)

R_EN=0;

t++;

if(t==50)

{

t=0;

L_EN=1;

R_EN=1;

}

}

以上就是关于想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写全部的内容,包括:想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写、51pcb避障功能是主板哪里、用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10122153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存