/*************************************************
实验名称: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;
}