完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
PCON寄存器
这里只介绍IDL和PD;PD=1时单片机进入掉电模式,IDL=1时单片机进入空闲模式 掉点模式与空闲模式的区别: 掉电模式:外部晶振,CPU,定时器,串口全部停止工作,只有外部中断继续工作。唤醒方式有两种:1)硬件复位,就是单片机上的复位按键。硬件复位时程序清零从头开始。2)中断唤醒,外部中断唤醒,外部中断就是外部中断1和外部中断2,都是低电平触发,对应引脚为P2.2 和 P2.3。 -空闲模式:空闲模式与掉电模式略有不同。空闲模式时,除了CPU处于休眠模式,其余硬件全部处于活动状态,如果计数器在工作的话,计时器寄存器的值还会增加 下边来看一个例子:摘自郭天祥的书。 #include #define uchar unsigned char #define uint unsigned int ***it dula=P2^6; ***it wela=P2^7; uchar num; unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7b,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uchar num_time) { uchar i,j; for(i=num_time;i>0;i--) for(j=110;j>0;j--); } void display(uchar shi,uchar ge) { dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(5); } void main() { uchar a,b,num1; TMOD=0x01; TH0=(65536-50000)/256; TL0=(63306-50000)/256; EA=1; ET0=1;//开定时中断0 EX0=1;//外部中断0 EX1=1;//外部中断1 TR0=1; WDT_CONTR=0x3f; while(1) { if(num==20) { num=0; num1++; if(num1==5) { ET0=0; PCON=0x01; } a=num1/10; b=num1%10; } display(a,b); } } void T0_time() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; } void ex_int0() interrupt 0 { //PCON=0; ET0=1; } void ex_int1()interrupt 2 { PCON=0; ET0=1; } 这个例子实现的是数码管计数到5然后关闭定时器进入空闲模式,等待触发外部中段,数码管继续接着显示数字,具体原理请看书。 这篇文的重点在于看门狗在这里的运用: 看门狗的第三位IDLE_WDT=1时,看门狗定时器在单片机的"空闲模式"计数。那么当这么设置的时候,当51芯片进入空闲模式,看门狗开始计数,等到计数溢出,程序复位,就相当于芯片从空闲模式走出来从头来过。 #include #define uchar unsigned char #define uint unsigned int ***it dula=P2^6; ***it wela=P2^7; sfr WDT_CONTR=0xe1; uchar num; unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7b,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uchar num_time) { uchar i,j; for(i=num_time;i>0;i--) for(j=110;j>0;j--); } void display(uchar shi,uchar ge) { dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(5); } void main() { uchar a,b,num1; TMOD=0x01; TH0=(65536-50000)/256; TL0=(63306-50000)/256; EA=1; ET0=1;//开定时中断0 EX0=1;//外部中断0 EX1=1;//外部中断1 TR0=1; WDT_CONTR=0x3f; while(1) { if(num==20) { num=0; num1++; if(num1==2) { ET0=0; PCON=0x01; } a=num1/10; b=num1%10; } display(a,b); } } void T0_time() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; } void ex_int0() interrupt 0 { //PCON=0; ET0=1; } void ex_int1()interrupt 2 { PCON=0; ET0=1; } sfr WDT_CONTR=0xe1; WDT_CONTR=0x3f; if(num1==2) 我们添加以及修改了这三句,看门狗选择了8.3886s溢出并在单片机空闲模式才开始计数的模式。这里的if语句中最好设置的小于8,我们取2效果明显。数码管显示到2的时候,进入空闲模式,数码管保持在1的样子(因为num=2之后就空闲模式了没有运行到显示数码管的语句),等在过5s到的时候看门狗溢出,数码管重新从0开始显示,这里的时间如果仔细做实验,从起初让开门狗工作到数码管再次从0开始显示应该是8秒。我掐着秒表看了一下,确实是8秒 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:36 , Processed in 0.994419 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号