电梯 毕业论文 单片机机不论是进入空闲模式还是掉电运

想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写?_百度知道
想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写?
想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写?写了好几遍没调试出来(触发元件我用的是红外避障,手碰下电平由高变低)
我有更好的答案
单片机进入空闲模式的方法:PCON |= (1&&0);单片机进入掉电模式的方法:PCON |= (1&&1);单片机允许外部中断0的程序:EX0 = 1;IT0 = 1;//----IT0 = 0也可以,前者是下降沿触发,后者是低电平触发,随便你.EA = 1; 如果你允许了外部断0中断,那么,即使单片机进入空闲模式,一旺有中断,单片机就可以被唤醒继续执行. 如果你的单片机进入了掉电模式,则单片机不会响应外部中断的,或者说单片机就等于是彻底关机了.,所以,即使你有外部中断,单片机也醒不了. 因为空闲模式,其实是让单片机的CPU睡着了,而掉电模式,则是让整个单片机睡觉,而外部中断属于单片机的一部分,因此,掉电模式使得整个单片机睡着了,那么外部中断0自然也睡着了,既然睡着了,就不会响应中断.
书上说掉电模式唤醒的方法有外部中断和硬件复位,外部中断应该是工作的吧
是这样的,我不知道你具体用的是哪个51单片机,所谓51单片机是指,以51系列的CPU为内核,加上外围设备组成的单片机.如果你用的是AT89C51,或者SH88F516,这个我可以保证的告诉你,掉电只有硬件复位能唤醒,外部中断是无法唤醒的,因为外部中断也是需要系统的时钟的支持才工作的,掉电模式是把整个系统的时钟全部关闭了,那么,外部中断也不例外. 如果是其他的,我就不一定保证了,但是空闲模式则是任何中断都可以使之退出的. 这样,你可以写个程序验证一下:
由于打字内容太多我截图追问下您
是这样的,我不知道你到底用的是边沿方式还是低电平方式,不过你的程序不太合理,按照我说的方法写一个: unsigned int count = 0; void READEx0(void){
if((count & 0x01) == 0x01)
PCON = 0x01;
//----如果你把这句屏掉,只保留 PCON = 0x02,那么 P1^0应该不会变化了
PCON = 0x02; //----如果你把这句屏掉,只保留 PCON = 0x01,那么 P1^0应该会变化
}} void EX0(void) interrupt 0{
if(count &= 100)
//----这里不一定非得是100,你根据需要自己修改 {
P1_0 = ~P1_0; //----这里不一定非得是 P1^0,最好是个连接了LED的引脚} }你所说的进入不了掉电模式,恐怕不是,恐怕是已经掉电了,你不知道罢了
我用的下降沿中断,我单独写了个掉电模式代码可以运行,我估计是上面的代码里哪里冲突了
哦,那可能STC89C52的外部中断可以唤醒掉电吧,这个我没尝试过,已经许久没有用过51系列的单片机了.
采纳率:68%
来自团队:
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51单片机空闲和掉电模式详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机空闲和掉电模式详解
&&51单片机空闲和掉电模式详解,及应用简单程序
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢单片机的空闲和掉电模式的应用
注意:电源管理寄存器PCON,它的最低两位IDL和PD分别用来设定是否单片机进入空闲模式和掉电模式
因此,单片机进入掉电模式只需要PCON= 0x01;进入空闲模式只需要PCON = 0x02;
空闲模式:
单片机进入空闲模式的时候,除了cpu处于休眠状态外,其余的硬件全部处于活动状态,芯片中未涉及的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值
单片机在空闲模式下可由任何一个中断或者是硬件复位唤醒,值得注意的是,使用中断唤醒单片机,程序将从原来的停止的地方继续运行,当使用硬件复位时,程序将从头开始执行
掉电模式:
当单片机进入掉电模式(也叫休眠模式)外部晶振停止震动,cpu,定时器,串口全部停止工作,只有外部中断继续工作,使单片机进入掉电模式的指令将成为休眠前单片机工作的最后一条指令,值得注意的是,使用中断唤醒单片机,程序将从原来的停止的地方继续运行,当使用硬件复位时,程序将从头开始执行
示例代码:(此代码实现,在单片机上开启两个外部中断,设置为低电平触发,用定时器计数并且显示在数码管的前两位,当计数到5时,单片机进入空闲或者是休眠模式,当单片机响应外部中断时,从休眠模式(空闲模式)返回 ,并同时启动定时器
错误代码:
#include&reg52.h&
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar num ,gw,sw,
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init()//初始化函数
TMOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
EX0 = 1;//打开外部中断0
IT0 = 0;//电平触发方式
EX1 = 1;//打开外部中断1
void delayms(uint x)//延时函数
for(i =i&0;i--)
for(j=110;j&0;j--);
void display(uchar gw,uchar sw)//显示函数
P0 = table[sw];
P0 = 0xff;
P0 = 0xfe;
delayms(5);
P0 = 0x0;//消影
P0 = table[gw];
P0 = 0xff;
P0 = 0xfd;
delayms(5);
void main()
display(gw,sw);
void timer0()interrupt 1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
if(aa ==20)
if(num == 99)
gw = num%10;
sw = num/10;
if(num == 6)
ET0 = 0;//关闭定时器
PCON = 0x01;//单片机进入空闲模式
void ex_int0()interrupt 0
PCON = 0;//可要可不要
void ex_int1()interrupt 2
PCON = 0;//可要可不要
正确代码:
#include&reg52.h&
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar num ,gw,sw,
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init()//初始化函数
TMOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
EX0 = 1;//打开外部中断0
IT0 = 0;//电平触发方式
EX1 = 1;//打开外部中断1
void delayms(uint x)//延时函数
for(i =i&0;i--)
for(j=110;j&0;j--);
void display(uchar gw,uchar sw)//显示函数
P0 = table[sw];
P0 = 0xff;
P0 = 0xfe;
delayms(5);
P0 = 0x0;//消影
P0 = table[gw];
P0 = 0xff;
P0 = 0xfd;
delayms(5);
void main()
if(aa ==20)
if(num == 99)
gw = num%10;
sw = num/10;
if(num == 6)
ET0 = 0;//关闭定时器
PCON = 0x01;//单片机进入空闲模式
display(gw,sw);
void timer0()interrupt 1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
void ex_int0()interrupt 0
PCON = 0;//可要可不要
void ex_int1()interrupt 2
PCON = 0;//可要可不要
错误代码中,把
if(aa ==20)
if(num == 99)
gw = num%10;
sw = num/10;
if(num == 6)
ET0 = 0;//关闭定时器
PCON = 0x01;//单片机进入空闲模式
这部分代码放在了定时器0的中断函数中,没有放在主函数中,导致外部中断无法响应,单片机无法从掉电模式或者是休眠模式中醒来
实验现象:数码管从00计数到05,之后进入休眠,数码管显示5,之后来一个外部中断,从5继续计数
版权所有,转载请注明链接地址:
阅读(...) 评论()查看: 6075|回复: 0
单片机空闲与掉电模式的应用
&&个人总结单片机省电的两个模式的使用:& &&&&&单片机正常工作时的功耗通常是4mA~7mA,进入空闲模式是其功耗降至2mA,进入掉电模式是的功耗可降至0.1uA以下。& &当单片机进入空闲模式时,除CPU处于休眠状态外,其他硬件全部都处于活动状态,芯片内部程序所设计的寄存器都保持原值。& &当单片机进入掉电模式时,外部晶振停振,CPU,定时器、串行口全部停止工作,只有外部中断继续工作。同样芯片内部程序所设计的寄存器都保持原值。& &值得注意的是,两者使用中断唤醒单片机时,程序从原来停止处继续运行;当使用硬件复位唤醒单片机时,程序将从头开始执行。运行效果图:
运行视频:(当数码管走到5时,就自动停止,需要外部中断0才能激活程序,数码管继续运行下去)
附上程序:#include&reg52.h&#define uint unsigned int#define uchar unsigned charvoid delayms(uint);void display(uchar shi,uchar ge);uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};void main(){& && & uchar a,b,num1;& && & TMOD=0x01;& && & TH0=()/256;& && & TL0=()%256;& && & EA=1;& && & ET0=1;& && & EX0=1;& && & TR0=1;& && & while(1)& && & {& && && && &&&if(num&=20)& && && && &&&{& && && && && && && &num=0;& && && && && && && &num1++;& && && && && && && &if(num1==6)& && && && && && && &{& && && && && && && && && & ET0=0;& && && && && && && && && & PCON=0x02;& && && && && && && &}& && && && && && && &a=num1/10;& && && && && && && &b=num1%10;& && && && &&&}& && && && &&&display(a,b);& && & }& & }void display(uchar a,uchar b){& && & P2=0& && & P0=table[a];& && & delayms(5);& && & P2=0x7f;& && & P0=table;& && & delayms(5);& &}void timer0() interrupt 1{& && & TH0=()/256;& && & TL0=()%256;& && & num++;&&}void ex_int0() interrupt 0{& && & PCON=0;& && & ET0=1;}void delayms(uint z){& && & uint x,y;& && & for(x=z;x&0;x--)& && && && &&&for(y=110;y&0;y--);}
Powered by51单片机进入退出空闲模式的问题 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
51单片机进入退出空闲模式的问题
20:56:46  
我的程序想实现的效果是当上位机发送0x01时单片机进入空闲模式,当定时器计数达到大概10左右吧,就退出空闲模式。其他时间正常发送温度湿度数据。
现在测试的效果是不管我发16进制的01 还是02 都停止发送数据,等很长时间也不会苏醒(再次发送)。
求大神帮忙分析一下。
20:57:40  
补上我的程序文件
本帖子中包含更多资源
才可以下载或查看,没有帐号?
08:31:29  
不应该在中断例程里面,应该在main里面操作PCON;
你的其他中断都被关掉了,你又是在定时器中断例程里面进入待机状态,而定时器中断在返回前,不管定时器是否完成计时,都不会再次产生中断,当然不会有反应了。
10:35:40  
不应该在中断例程里面,应该在main里面操作PCON;
你的其他中断都被关掉了,你又是在定时器中断例程里面进入 ...
我在main函数里把PCON该成0x00进空闲,关掉ES串行中断,没有关定时器中断。因为我看资料上说空闲模式中任何中断都会使单片机苏醒,而我又想定时让他苏醒。那我就留一个定时器,让他不停的计数,再给他一个num1,当num1计到足够的值时苏醒。考虑到定时器中断的几种情况,void Timer0_isr(void) interrupt 1
& & & & TH0 = 0xc3;
& & & & TL0 = 0x50;
& & & & num++;
& & & & num1++;
& & if(num==500)
& & & & & & & & num=0;
& & & & & & & & ReadFlag=1; //读标志位置1
& & & & if(receiveflag == 0x49 && num1 == 2000)
& & & & & & & & num1 = 0;
& & & & & & & & PCON = 0x00;
& & & & & & & & receiveflag == 0x48;
& & & & & & & & ES = 1;
& & & & else if(receiveflag == 0x48)
& & & & & & & & PCON =0x00;
& & & & else
& & & & & & & & PCON =0x01;
正常发送、
接受到休眠指令进入休眠、
正在休眠但num1计数不够不需要苏醒、计数达到,
我才在中断里头对PCON进行设置的,我还是不知道我哪里想错了,可以说的详细一点吗
17:29:57  
只要你在中断例程里面休眠了,没有更高优先级的中断发生,就不会被唤醒
18:59:42  
只要你在中断例程里面休眠了,没有更高优先级的中断发生,就不会被唤醒
那你的意思是我在主函数里加了pcon=0x01,定时器中断函数里就不该再写pcon=0x01了?那应该是怎么唤醒的?
21:11:36  
在main做一个循环,num1 & 2000 就继续休眠
while(num1 & 2000)
& && && &PCON = 0x01;
21:16:11  
在main做一个循环,num1 & 2000 就继续休眠
while(num1 & 2000)
我明天去实验室测试一下,谢谢了
21:52:47  
不过,建议你不要使用PCON = 0X01;&&而用PCON |= 1;
这样的话,不会影响PCON的其他位,比如SMOD:影响串口波特率、GF0\GF1;
还有一个问题,PCON的位0:IDL是由硬件清零的,而不是由软件清零,可以这样想:待机时啥指令都不会运行,又怎么会去清零IDL位呢?
10:35:37  
比较蒙,看着不懂
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 单片机掉电模式 的文章

 

随机推荐