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

📄 lcd.c

📁 单片机结合简单外围计数电路设计的频率计
💻 C
字号:
#include <reg51.H> 
#include"LCD1602.h"
//--------------------------
//5位lcd显示频率计设计
//Designed by BoBo
//--------------------------
//--------------------------------------------------
//固定函数声明
void int_0();       //外部中断0

void int_1();       //外部中断1

void t0();     		//定时器中断1

void t1();     		//定时器中断2

void serial_1();    //串行中断1

void serial_2();    //串行中断2
//---------------------------------------------------
//用户函数声明
void initial();     //初始化

void IntToStr(unsigned long t, unsigned char *str);//数据转换模式 

void Delay1ms(unsigned int num);		//延时模块
//---------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//信号和数据声明
unsigned char timecount=0;	//闸门计数值

unsigned char T0count;		//计数器溢出计数值
 
sbit Gate=P3^1;				//闸门输出口

sbit Clr=P3^7;				//清零信号

unsigned long x;			//频率计数容器1

bit flag=0;					//闸门结束标志

unsigned char TempBuffer[10];//数据缓冲区

//---------------------------------------------------------------------------------------------------------
void main(void) 
{ 
  initial();

  Gate=1;					//闸门开

  Clr=1;					//先清零74LS393

  LCD_Initial();			//lcd初始化

  GotoXY(0,0);				//指向0行0列

  Print("   The Frequent ");

  GotoXY(0,1);

  Print("      Hz by BoBo");

  while(1)	

   { 
     Clr=0; 
	 if(flag)
	 {
	 	flag=0;						

  		IntToStr(x,TempBuffer);       //数值转换

		GotoXY(0,1);						//定位

		Print(TempBuffer);				//打印数据

        TR0=1;
	 }	

    }
    

} 
void initial()				//初始化
{

  TMOD=0x15; 				

  TH0=0; 					//计数器付初值

  TL0=0; 					//计数器付初值

  TH1=0x3b; 	//定时器付初值

  TL1=0xb0; 	//定时器付初值

  TR1=1; 					//定时器启动

  TR0=1; 					//计数器启动

  ET0=1; 					//计数器开中断

  ET1=1; 					//定时器开中断

  EX1=1;              		// INT1中断开

  IT1=0;              		// INT1低电平触发(为1则为下降沿触发)

  EA=1; 					//开中断

	return;
}

void IntToStr(unsigned long t, unsigned char *str) 
{
unsigned char a[10]; char i,length;                                 	
while(t/10) 			//将计数值转换为数码管段码值
       	{ 
            a[i]=t%10; 
            t=t/10; 
            i++; 
           } 
        a[i]=t; 
length=i+1;                                                     
	for(i=0; i<length; i++)         //转成ASCII码              	
		a[i]=a[i]+'0';                                    	
//for(i=0; a[i]=='0' && i<=6; i++);                     	
//for(j=8-n; j<i; j++)       //填充空格                 	
//		{ *str=' ';  str++; }                             	
	for(i=length-1; i>=0; i--)                                       	
		{ *str=a[i]; str++; }  //加入有效的数字           	
	*str='\0'; 
} 

void int_1() interrupt 2 using 1			//INT1中断  由P3.1引脚产生

{
		
	T0count=0;							 	//计数高位清零

	flag=1;


	TH0=0;									//计数器清零

	TL0=0;									

}

void t0(void) interrupt 1 using 0 			//计数器中断服务程序

{ 

	T0count++;

} 

void t1(void) interrupt 3 using 0 			//定时器溢出中断程序

{ 

  TH1=0x3b; 					//重置初值

  TL1=0xb0; 
  
  timecount++; 
  
  if(timecount==20) 

    { 	
	TR0=0;									//停止计数器

		x=(T0count*65536+TH0*256+TL0)*255+P1;//取计数值
	Clr=1;									//产生清零信号

		timecount=0;						 //定时计数清零	

		Gate=!Gate;							 //闸门取反

    } 

} 


⌨️ 快捷键说明

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