一、复位电路
上电复位:从没有电到上电的瞬间,电容进行充电,此时电容对电路来说相当于导线,RST引脚为高电平;随着电容充电越来越多,电流越来越小,直至电容充满电,不再有电流,RST引脚变为低电平。
按键复位(手动复位):按下按键前RST为低电平,按下按键后,电路导通,电容瞬间放电,RST处于高电平,然后松开按键,之后则与上电复位类似。
复位时间:t(单位:s)=1.2*R(单位:Ω)*C(单位:F)
二、函数的调用
#include<reg52.h> //000000μ½999999£¨ÖD¶Ï£©
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};//0123456789ABCDEF
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 interrupttime()interrupt 1
{
TH0=0xfc; //ÖØD¼óÔØ3õÖμ
TL0=0x67;
m++;
if(m>=5000)
{
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;
}
}
将下面程序和上面进行对比,可以看出下程序中的count函数和led函数在主函数中是同时进行的,通过函数的调用可以是程序的结构更加清晰明了
注意:当函数调用时,需要提前在主函数前进行说明
#include<reg52.h> //000000μ½999999£¨ÖD¶Ï£©
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};//0123456789ABCDEF
unsigned char ledbuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
void count();
void led();
void main()
{
EA=1; //ê1Äü×üÖD¶Ï
ENLED=0;
TMOD=0x01; //T0ÎaÄ£ê½1
TH0=0xfc; //¸øT0¸33õÖμ0xfc18(T0Îa16¸ö×Ö½ú)
TL0=0x18;
TR0=1; //T0Æô¶ˉ
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xfc; //ÖØD¼óÔØ3õÖμ
TL0=0x67;
count();
led();
}
}
}
void count()
{
static unsigned int m=0;
static unsigned long sec=0;
m++;
if(m>=5000)
{
m=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];
}
}
void led()
{
static unsigned char i=0;
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;
}
}
三、独立按键
首先应理解独立式按键的原理图,然后将矩阵按键进行拆分,再进行理解
#include<reg52.h>
sbit A3=P2^3;
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit K1=P2^4;
sbit K2=P2^5;
sbit K3=P2^6;
sbit K4=P2^7;
void main()
{
A3=1;
A2=1;
A1=1;
A0=0;
ENLED=0;
P0=0x7f; //起到指示灯作用,可更改
while(1)
{
D3=K1;
D2=K2;
D1=K3;
D0=K4;
}
}
|