打印

我的51唤醒不了?

[复制链接]
3061|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fzp121|  楼主 | 2007-12-11 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, vr, AC, hm, AI
想试试51的空闲和等待模式,可是我的程序让51进入了低功耗模式,但是却无法从这个模式返回,返回就是从进入模式的下一句开始执行,我的复位了之后总是从头开始,谁能帮看看是怎么一回事?
程序如下:
    org 0000h
    sjmp main
    org 30h
main:
    mov p1,#0ffh
    mov sp,#60h
    clr p1.7
    acall del1s         ;顺序点亮1.7和1.5脚
    clr p1.5
    acall del1s
                            ;进入低功耗模式
    mov pcon,#02h
    mov p0,87h
    clr p1.1       ;若能推出模式则点亮p1.1一秒钟
    acall del1s
    ajmp $

;标准一秒延时子程序
del1s:
        mov r2,#0ah
a2:    mov r1,#0a8h
a1:    mov r0,#0f7h
w1:    djnz r0,w1
    djnz r1,a1
     djnz r2,a2  ;此循环定义为998030us,还差1970us
     mov r3,#5h        ;产生1960us的延时
a4:  mov r4,#0c3h
a3:    djnz r4,a3
     djnz r3,a4 
    nop
       nop
    nop
    nop            
    nop
    nop
    nop
    nop            
    nop
     ret     

    end
我在改变pcon的赋值,测量到ale和psen的确在两种状态的不同电平,因此确认单片机进入了掉电模式,

相关帖子

沙发
infree| | 2007-12-11 09:50 | 只看该作者

这个模式就应该是这样的呵

看你写的控制字,是进入了掉电模式,掉电模式被复位唤醒后就是要从头开始执行程序;如果需要判断是首次上电后执行还是掉电复位执行,你可以在片内RAM中设置标志来区分。
(注:这是标准51的行为模式,而其它一些如Philip或STC的51是可以实现外部中断将MCU从掉电模式中唤醒,中断例程返回后就会执行进入掉电模式语句后的紧接着的一条语句)。

使用特权

评论回复
板凳
农民讲习所| | 2007-12-11 09:51 | 只看该作者

中断退出空闲

使用特权

评论回复
地板
infree| | 2007-12-11 09:53 | 只看该作者

补充一句

   以我个人的经验,学习使用51,最全面的一个技术手册就是INTEL的MCS51 user manual,可以从网上找一份看一下,好多国内的教材内容都是copy的这个手册,并且copy得不全面,组织得不合理,让人看后容易糊涂。

使用特权

评论回复
5
fzp121|  楼主 | 2007-12-11 16:34 | 只看该作者

谢谢infree

谢谢infree的帮助,我在同学的帮助下,用外部中断唤醒了空闲的模式,但是掉电模式退出的唯一办法就是硬件复位,可是硬件复位我同学的理解是对于进入掉电模式,无法唤醒的原因是只有硬件复位,而硬件复位按键时间远大于2ms,可能早就唤醒,以至于刚刚复位,就又重新复位,所以程序会对从头开始执行

使用特权

评论回复
6
xwj| | 2007-12-11 16:44 | 只看该作者

51下不管你是什么复位,程序都会从头开始执行

所以你的理解根本就是错的

使用特权

评论回复
7
ayb_ice| | 2007-12-11 17:00 | 只看该作者

其它的单片机复位应该也是从头开始执行

使用特权

评论回复
8
infree| | 2007-12-12 08:39 | 只看该作者

楼上两位说的都对

只要你在Reset管脚加上了有效的复位信号,程序就会从头开始执行。

使用特权

评论回复
9
zusen| | 2007-12-12 08:47 | 只看该作者

更准确地说 是从 0000H 开始吧

   

使用特权

评论回复
10
arm86| | 2007-12-12 09:12 | 只看该作者

掉电乎?空闲乎?闲得没事测测乎?

2楼的:“这是标准51的行为模式,而其它一些如Philip或STC的51是可以实现外部中断将MCU从掉电模式中唤醒”
“如果需要判断是首次上电后执行还是掉电复位执行,你可以在片内RAM中设置标志来区分。”

把二楼的回帖次序变一下,楼主再加上一段掉电复位判断程序,大概就能实现楼主的意图了。

使用特权

评论回复
11
fzp121|  楼主 | 2007-12-12 10:25 | 只看该作者

那硬件复位退出空闲和掉电模式该怎么理解?

那硬件复位使单片机退出空闲和掉电模式该怎么理解?
是不是这样:
程序是肯定从头开始,而不过需要加上一段掉电复位判断程序在主程序最开头对吧,这样就可以判断如果是为唤醒而复的位,可以跳转到使单片机进入掉电模或空闲式之后的下条语句继续执行

使用特权

评论回复
12
xwj| | 2007-12-12 10:29 | 只看该作者

是的

使用特权

评论回复
13
arm86| | 2007-12-12 10:31 | 只看该作者

我的理解跟楼主上面所说的一样

只是我没有测过,也没有这么使用过。因为没有遇到那么严格的场合,所以……

就看楼主的了

使用特权

评论回复
14
xwj| | 2007-12-12 11:01 | 只看该作者

呵呵,给你一个上电检测的基本框架

/***************************************************************************/
void main()
{
    unsigned int i;
    EA=0;
    SFCF=0X01;
    AUXR=0X01;
    first_power_on=0;
    if(soft_reset_flag!=0Xaa)       //是否上电复位,{}里面是上电复位的动作,你要不放心的话可以用多个标志
    {
        P0=0XFF;
        P1=0XFF;
        P2=0XFF;
        P3=0XFF;
        P4_RAM=0XFF;
        WR_P4();
        clean_pdata();
        clean_idata();
        for(i=0;i<0xffff;i++)           //上电延时
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
        if(verify_byte(flag_addr,0x55)) //检查首次上电(EEPROM区标志)
        {
            first_power_on=1;
            init_parameter();
        }
    }
    soft_reset_flag=0X55;
    init_watchdog();                    //启动看门狗
    init_system();                      //系统初始化,关屏

    init_touch_monitor();               //首次上电触摸屏设置,由first_power_on触发
    while(1)
    {
        scan_work();
        if (key_ok)
        {
            key_ok=0;
            operation();  //打开主屏
        }
        else if(~key_time_flag)         //按键nn秒没操作后
        {
            soft_reset_flag=0Xaa;       //软复位,一复位就回复到光屏的待机状态了
            SFCF|=0X02;                 //或者你要进待机、掉电模式随便你

        }

    }
}

void init_system(void)                  //系统初始化,关屏
{
    TMOD=0X11;
    //其他的....
    
    video_power_ctrl=1;
}
//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog 或发送邮件至:xwjfile@21cn.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

187

帖子

1

粉丝