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

📄 pinlvji4.c

📁 频率计 闸门时间0.1s 1s 10s 频率范围0~99khz 可以切换 里面有四个源程序
💻 C
字号:

//液晶1602子程序,文件名:1602.c
/**************************************************
;连线图:
;        DB0---DPROT.0  DB4---DPROT.4    RS-------------P3.5
;        DB1---DPROT.1  DB5---DPROT.5    RW-------------P3.6
;        DB2---DPROT.2  DB6---DPROT.6    E--------------P3.7
;        DB3---DPROT.3  DB7---DPROT.7    VLCD接10K可调电阻到GND*
;        需要11根单片机口线       
;80C51的晶振频率为12MHz
;液晶显示程序
;**************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit    RS    =    P3^7;
sbit    RW    =    P3^6;
sbit    EN =    P3^5;
sbit    KEY=    P1^0;
    
#define  DPORT    P2

void LcdPos(uchar,uchar);    //确定光标位置
void LcdWd(uchar);            //写字符
void LcdWc(uchar);            //送控制字(检测忙信号)
void LcdWcn(uchar );        //送控制字子程序(不检测忙信号)
void mDelay(uchar );        //延时,毫秒数由j决定
void WaitIdle();            //正常读写操作之前检测LCD控制器状态

//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符
void WriteChar(uchar c,uchar xPos,uchar yPos)
{    
    LcdPos(xPos,yPos);
    LcdWd(c);
}

void WriteString(uchar *s,uchar xPos,uchar yPos)
{    uchar i;
    if(*s==0)        //遇到字符串结束
        return;    
    for(i=0;;i++)
    {    
        if(*(s+i)==0)
            break;
        WriteChar(*(s+i),xPos,yPos);
        xPos++;
        if(xPos>=15)    //如果XPOS中的值未到15(可显示的最多位)
            break;

    }
}
void SetCur(uchar Para)    //设置光标
{    mDelay(2);
    switch(Para)
    {    case 0:
        {    LcdWc(0x08);    //关显示
            break;
        }
        case 1:
        {    LcdWc(0x0c);    //开显示但无光标
            break;
        }
        case 2:
        {    LcdWc(0x0e);    //开显示有光标但不闪烁
            break;
        }
        case 3:
        {    LcdWc(0x0f);    //开显示有光标且闪烁
            break;
        }
        default:
            break;
    }
}

void ClrLcd()    //清屏命令
{    LcdWc(0x01);
}            

//    正常读写操作之前检测LCD控制器状态
void WaitIdle()
{    uchar tmp;
    RS=0;
    RW=1;
    EN=1;
    _nop_();
    for(;;)
    {    tmp=DPORT;    
        tmp&=0x80;
        if(    tmp==0)
            break;
    }
    EN=0;
}

void LcdWd(uchar c)        //写字符子程序
{    WaitIdle();
    RS=1;    
    RW=0;
    DPORT=c;            //将待写数据送到数据端口
    EN=1;
    _nop_();
    _nop_();
    EN=0;
}
void LcdWc(uchar c)        //送控制字子程序(检测忙信号)
{    WaitIdle();    
    LcdWcn(c);
}

void LcdWcn(uchar c)    //送控制字子程序(不检测忙信号)
{    RS=0;
    RW=0;
    DPORT=c;
    EN=1;
    _nop_();
    EN=0;
}
void LcdPos(uchar xPos,uchar yPos)    //设置第(xPos,yPos)个字符的DDRAM地址
{    unsigned char tmp;
    xPos&=0x0f;        //x位置范围是0~15
    yPos&=0x01;        //y位置范围是0~1
    if(yPos==0)        //显示第一行
        tmp=xPos;
    else
        tmp=xPos+0x40;
    tmp|=0x80;
    LcdWc(tmp);
}

void RstLcd()        //复位LCD控制器
{    mDelay(15);        //如果使用12M或以下晶振,此数值不必改,如用24M晶振,须用30
    LcdWc(0x38);    //显示模式设置
    LcdWc(0x08);    //显示关闭
    LcdWc(0x01);    //显示清屏
    LcdWc(0x06);    //显示光标移动位置
    LcdWc(0x0c);    //显示开及光标设置
}    

void mDelay(uchar j)    //延时,毫秒数由j决定
{   uint i=0;
    for(;j>0;j--)
    {  for(i=0;i<124;i++)
        {;}
    }
}


//主函数:

                                                                             
//;==================================================================================

//;主程序开始
//;==================================================================================



unsigned char code table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789

//unsigned char code table2[]={0x41,0x42,0x43,0x44,0x45,0x46};//abcdef
uchar *h="     CYMOMETER"; 
uchar *s1=" FREQ:       Hz ";
uchar *s2=" over range ";


uchar  T0count;        //从T0的计数单元中读取计数的数值
uint timecount;       //
uchar mark=1;
bit flag;                     //标志位
unsigned long x;
uchar xPos,yPos;
uchar i;


void main(void)
{   
    

    RstLcd();        //初始化LCD
    ClrLcd();        //清屏
    SetCur(1);    //开光标显示、闪烁
    WriteString(h,0,0); 
    WriteString(s1,0,1);
    WriteString(s2,0,1);
    
    
    TMOD=0x15;                 //T0工作为16位计数器(方式1),T1工作方式为16位定时器
    TH0=0;                     //计数为65536                     
    TL0=0;                     //
    TH1=(65536-50000)/256;     //定时器采用定时50ms.  初值为50000
    TL1=(65536-50000)%256;
    TR1=1;                    //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时
    TR0=1;                    //TR0=1,控制开关闭合,计数脉冲进入T0计数器,启动计数
    ET0=1;                    //定时器0开中断
    ET1=1;                    //定时器1开中断
    EA=1;                     //CPU开中断

while(1)
{   
    if(KEY==0)
	 {
	  mDelay(10);
	   if(KEY==0)
	   {
        mark++;
		if(mark==4)
		mark=1;
	    while(~KEY);
	   }
     }

     if(flag==1)                     
    {
         flag=0;                        //清标志位
		if(mark==1)
		 {
		   x=(T0count*65536+256*TH0+TL0)*10;
           LcdPos(15,1);
           WriteString(s1,0,1);
           WriteChar(table1[(x%100000)%10000%1000%100%10],11,1);
           WriteChar(table1[(x%100000)%10000%1000%100/10],10,1);    
           WriteChar(table1[(x%100000)%10000%1000/100],9,1);    
           WriteChar(table1[x%100000%10000/1000],8,1);    
           WriteChar(table1[(x%100000)/10000],7,1);    
           WriteChar(table1[(x/100000)],6,1);
           WriteString(h,0,0);
           WriteChar(0x30,0,0);
		   WriteChar(0x2e,1,0);
		   WriteChar(0x31,2,0);
		   WriteChar(0x53,3,0);
		   if(x>99999)
		   {
		    WriteString(s2,0,1);
		   }
         }
      
         if(mark==2)
		 {
           x=T0count*65536+256*TH0+TL0;
           LcdPos(15,1);
           WriteString(s1,0,1);
           WriteChar(table1[(x%100000)%10000%1000%100%10],11,1);
           WriteChar(table1[(x%100000)%10000%1000%100/10],10,1);    
           WriteChar(table1[(x%100000)%10000%1000/100],9,1);    
           WriteChar(table1[x%100000%10000/1000],8,1);    
           WriteChar(table1[(x%100000)/10000],7,1);    
           WriteChar(table1[(x/100000)],6,1);
           WriteString(h,0,0); 
           WriteChar(0x31,0,0);
		   WriteChar(0x53,1,0);
		   if(x>99999)
		   {
		    WriteString(s2,0,1);
		   }
		 }

	      if(mark==3)
		 {
		   x=(T0count*65536+256*TH0+TL0)/10;
           LcdPos(15,1);
           WriteString(s1,0,1);
           WriteChar(table1[(x%100000)%10000%1000%100%10],11,1);
           WriteChar(table1[(x%100000)%10000%1000%100/10],10,1);    
           WriteChar(table1[(x%100000)%10000%1000/100],9,1);    
           WriteChar(table1[x%100000%10000/1000],8,1);    
           WriteChar(table1[(x%100000)/10000],7,1);    
           WriteChar(table1[(x/100000)],6,1);
           WriteString(h,0,0); 
           WriteChar(0x31,0,0);
		   WriteChar(0x30,1,0);
		   WriteChar(0x53,2,0);
		   if(x>99999)
		   {
		    WriteString(s2,0,1);
		   }
           }
		  
		 
          
		   
    
//LCD显示部分代码
//    ;==================================================================================
    timecount=0;
    T0count=0;
    TH0=0;
    TL0=0;
    TR0=1;         //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
    }
}
}
//;==================================================================================

void t0() interrupt 1 using 0      //T0中断服务
{
    T0count++;                      //对P3。4口的脉冲进行计数
}
//;==================================================================================

void t1(void) interrupt 3 using 0       //T1中断服务
{
    TH1=(65536-50000)/256;               //计数初值重装载
    TL1=(65536-50000)%256;
    timecount++;
	  
	if(mark==1)
	 {  
       if(timecount==2)
        {   
         TR0=0;
        timecount=0;
        flag=1;                              // 置标志
        }    
	 }
	if(mark==2)
	 {
	  if(timecount==20)
        {   
	    TR0=0;
        timecount=0;
        flag=1;                              // 置标志
        }    
	 } 
       if(mark==3)
	 {    

	  if(timecount==200)
        {   
	    TR0=0;
        timecount=0;
        flag=1;                              // 置标志
        }    
	 }
    }        
   
        
		  
	

	    

	
	 
		   
	
		  
 
          

           
		   
		   
		 
        
		 

⌨️ 快捷键说明

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