/*************************************************

实验名称:pcon,进入休眠模式实验

实验目的:用定时器显示数码管的前两位,当计数到5时

 使单片机进入休眠模式,同时关闭计时器,

 当单片机相应外部中断后,从休眠模式返回,

 同时启动计时器,数码管继续计数。

实验备注:当PCON=0x01时进入休闲模式,定时器不会停止,

 从而引发中断,所以要设置ET0关闭中断,

 当PCON=0x02时进入掉电模式,定时器停止,不

    会引起中断的发生,数码管停止计数。

*************************************************/


#include<reg52.h>


#define uchar unsigned char

#define uint unsigned int


sbit duan = P2^6;

sbit wei = P2^7;


uchar shi,ge,num,num1;



uchar code duan_table[]=

{0x3f,0x06,0x5b,0x4f,

 0x66,0x6d,0x7d,0x07,

 0x7f,0x6f,0x77,0x7c,

 0x39,0x5e,0x79,0x71};


uchar code wei_table[]=

{0xfe,0xfd,0xfb,

 0xf7,0xef,0xdf};


void delay_1ms(uchar);

void display(uchar, uchar);


void main()

{

shi = 0;

ge = 0;

num = 0;

TH0 = (65536-46080)/256;

TL0 = (65536-46080)%256;

TMOD = 0x01;

EA = 1;

ET0 = 1;

EX0 = 1;

EX1 = 1;

TR0 = 1;

while(1)

{

if(num == 20)

{

num = 0;

num1++;

if(num1 == 6)

{

// ET0 = 0;

PCON = 0x02;

}

shi = num1/10;

ge = num1%10;

}

display(shi,ge);

}


}


void delay_1ms(uchar x)

{

uchar i, j;

for(i =0; i < x; i++)

for(j = 0; j < 110; j++);

}


void display(uchar shi, uchar ge)

{

duan = 1;

P0 = duan_table[shi];

duan = 0;

P0 = 0xff;


wei = 1;

P0 = wei_table[0];

wei = 0;

delay_1ms(1);


duan = 1;

P0 = duan_table[ge];

duan = 0;

P0 =0xff;


wei = 1;

P0 = wei_table[1];

wei = 0;

delay_1ms(1);

}


void Timer0() interrupt 1

{

TH0 = (65536-46080)/256;

TL0 = (65536-46080)%256;

num++;

}


void Ex_int0() interrupt 0

{

PCON = 0;

// ET0 = 1;

}


void Ex_int1() interrupt 2

{

PCON = 0;

// ET0 = 1;

}