⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 keil c程序,用于AT89S52单片机.使用了T2计数器,有频率计的功能
💻 C
字号:
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sfr T2MOD=0X0C9; 

sbit backlightkey=P2^7 ;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcde=P1^2;
sbit lcdbusy=P0^7;

sbit key1=P2^1;
sbit key2=P2^2;
sbit key3=P2^3;


static uchar timecount=0,timechange=0,count=0;
static uchar eorrflag=0;
uint counth=0,countl=0;
char rbuff[10],scount=0;//串口接收缓冲区和缓冲区已存数据个数

void lcdbusywait()
{
 P0=0x0ff;
 lcdrs=0;
 lcdrw=1;
 lcde=0;
 ;
 lcde=1;
 while(lcdbusy);
 lcde=1;
 }

void waitcmd()
{
 lcdrs=0;// clr p1.0
 lcdrw=0;//clr p1.1
 lcde=0;//clr p1.2
 lcdbusywait();//acall busy
 lcde=1;//setb p1.2
}

void lcdinit()
{
 P0=0X01;
 waitcmd();
 P0=0X38;
 waitcmd();
 P0=0X0C;
 waitcmd();
 P0=0X06;
 waitcmd();
 P0=0X80;
 waitcmd(); 	
}

void write(uchar *str)
{
 do{
 P0=*str;
 lcdrs=1;
 lcdrw=0;
 lcde=0;
 lcdbusywait();
 lcde=1;
 }while(*(++str)!='\0');

}

void writenum(uint num,uchar bitnum)
{uchar str[8];
 str[bitnum]='\0';
 do
 {
 str[bitnum-1]=num%10+48;
 num/=10;
 }while(bitnum--);
 write(str); 
}

void ledbacklight(bit on) //on=1表示开灯,on=0表示关灯
{
 backlightkey=~on;
}

void cursestatus(uchar statusx,uchar statusy)
{
 if(statusx>16||statusx<1||statusy<1||statusy>2)
 return;
 else
 {
 if(statusy==1)
 {
 P0=0x80+statusx-1;
 waitcmd();
 }
 else
 {P0=0x0c0+statusx-1;
  waitcmd();
  }
 } 
}

void delay()
{uchar i,j;
 for(i=0xff;i>0;i--)
 for(j=0xff;j>0;j--)
 ;
 }

 void cleardisplay()
 {
 P0=1;
 waitcmd();
 }

void sentbyte(uchar var)
{ES=0;
 SBUF=var;
 while(TI==0);TI=0;
 ES=1;
 }

void serial() interrupt 4	  //串口中断服务程序
{
   if(TI)
	{
	 TI=0;
	 }

	if (RI) {
		RI = 0;		
		rbuff[scount] = SBUF;
		SBUF=rbuff[scount];
		scount++;
		if(scount==10)scount=0;
		}
}

void counter()interrupt 3 using 2
{
TL1=0;
TH1=0;
eorrflag=1;
TR1=0;
}

void timer()interrupt 1 using 3
{
TL0=0X0AF;
TH0=0X03C;
TR1=0;
count++;
if(count==2)
{counth=TH1;
countl=TL1;

timechange=1;
TL1=0;
TH1=0;
TR1=1;
timecount++;
count=0;
}

}

void main()
{
uint i=30;

//T0定时器与T1计数器开中断
 IT0=0;
 PT0=1;
 PX0=0;
 EA=1;
 ET0=1;
 EX0=1;
 ET1=1;
 TMOD=0X51;

lcdinit();
ledbacklight(1);
write("hello,world!");
for(;i>0;i--)
delay();

i=90;
cleardisplay();
cursestatus(1,1);
write("i am twolf");
cursestatus(1,2);
writenum(i,3);

//定时器0初始化并开启,定时为0.5S
TL0=0X0AF;
TH0=0X03C;
TR0=1;
//计数器1初始化并开启
TL1=0;
TH1=0;
TR1=1;

SCON = 0x50;
TCLK=1;
RCLK=1;               
T2MOD = 0X01;            
PCON = 0x80 ;                
RCAP2H = 0xff;					
RCAP2L = 0xdc; 
TH2=0XFF;
TL2=0XDC;             
TR2   = 1;                 
ES=1;

while(1)
{
	if(eorrflag)write("eorr!");
	if(timechange)
		{
		sentbyte(timecount);
		timechange=0;
		cursestatus(1,2);
		countl=countl+counth*256;
		writenum(countl,6);
		write("  T:");
		writenum((uint)timecount,3);
		}
	else continue;
}
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -