单片机中断
数码管依次显示000000~999999
#include<reg52.h>
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char ledbuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
unsigned int m=0;
unsigned char n=0;
unsigned char i=0;
void main()
{
unsigned long sec=0;
EA=1; //ê1Äü×üÖD¶Ï
ENLED=0;
TMOD=0x01; //T0ÎaÄ£ê½1
TH0=0xfc; //¸øT0¸33õÖμ0xfc18(T0Îa16¸ö×Ö½ú)
TL0=0x18;
ET0=1; //ê1ÄüT0ÖD¶Ï
TR0=1; //T0Æô¶ˉ
while(1)
{
if(n==1)
{
n=0;
sec++;
ledbuff[0]=table[sec%10];
ledbuff[1]=table[sec/10%10];
ledbuff[2]=table[sec/100%10];
ledbuff[3]=table[sec/1000%10];
ledbuff[4]=table[sec/10000%10];
ledbuff[5]=table[sec/100000%10];
}
}
}
/*¶¨ê±Æ÷0μÄÖD¶Ï·tÎñoˉêy*/
void time()interrupt 1
{
TH0=0xfc; //ÖØD¼óÔØ3õÖμ
TL0=0x67;
m++;
if(m>=1000)
{
m=0;
n=1;
}
P0=0xff; //ò2¿é¸ÄÎaP0=0x00 ÏÔê¾Ïûòt
switch(i)
{
case 0:
A2=1;A1=0;A0=1; i++; P0=ledbuff[0];
break;
case 1:
A2=1;A1=0;A0=0; i++; P0=ledbuff[1];
break;
case 2:
A2=0;A1=1;A0=1; i++; P0=ledbuff[2];
break;
case 3:
A2=0;A1=1;A0=0; i++; P0=ledbuff[3];
break;
case 4:
A2=0;A1=0;A0=1; i++; P0=ledbuff[4];
break;
case 5:
A2=0;A1=0;A0=0; i=0; P0=ledbuff[5];
break;
default:break;
}
}
T0初始值的计算
公式:(2^16 -x)×12÷晶振频率=定时时间(默认单位为:us)
1s=1000ms 1ms=1000us
当晶振频率一定时,若最大定时时间仍小于所需定时时间,那么就需要退一步计算,先找到在范围内
合适的定时时间,再通过循环,来得到所需得定时时间。
|