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

📄 1.c

📁 c51下的一个键盘程序
💻 C
字号:
 
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit p2_4=P2^4;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p2_7=P2^7;
sbit p2_5=P2^5;
sbit p2_6=P2^6;
sbit p3_3=P3^3;
sbit p3_4=P3^4;
sbit p3_5=P3^5;
sbit scl=P3^6;
sbit sda=P3^7;
sbit le=P2^3; //锁存器控制位;


uint idata AcH;
uint idata ArH;
uint  idata jpn=0; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
uchar idata clocknum0;/*200~1000HZ输出变量*/
uchar idata clocknum1;
uchar idata  buffer[3];
bit idata flag; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1


void outmeasure(void) interrupt 3  //内中断2,输出200~1000HZ频率
{
	 uchar i=100;  //固定时间
	 TH1=clocknum0;/*125ms*/
     TL1=clocknum1;
     p1_2=1;
	 while(i>0)
	 {
		 i--;
	 }
     p1_2=0;
}

     
void delay() //延时n毫秒
{
  static uchar k;
  for(k=0;k<100;k++)
  {}
}
void display0(uchar *p) //显示//p
{ 
    uchar code  codeled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9
    p2_5 = 0;
    P0=codeled[*p];
    delay();
    p++;
  	p2_5=1;
  	p2_6= 0;
  	P0=codeled[*p];
  	delay();
  	p++;
  	p2_6=1;
  	p2_7=0;
  	P0=codeled[*p];
    delay();
    p2_7=1;
}
void comput2(float s)
{
	float y0;
	uint y1;
	y0=s*200+200; //0%~4%CH4对应200~1000
	y1=65536-250000/y0;
	clocknum0=(y1&0xff);/*200HZ输出定时初值*/
    clocknum1=y1>>8;
}
void delay0(void) //时间不知道是否合适
{
	_nop_();
	_nop_();
}

void DelayX1ms(uint s)
{   
    uint j,k;
	for(j=0;j<s;j++)
	for(k=0;k<60;k++)
	{};
}
void I2cStart(void) //iic bus 起始信号 
{ 
	sda=1;
	scl=1;
	delay0();
	sda=0;
	delay0();
	scl=0;
}
void I2cStop(void) //iic bus 停止信号
{ 
	sda=0;
	delay0();
	scl=1;
	delay0();
	sda=1;
}
bit I2cSendChar(uchar bytedata) //传送一个char数据到I2c上
{
	static uchar i;
	bit ack;
	for(i=0;i<8;i++)
	{
		if(bytedata&0x80)
		sda=1;
		else
		sda=0;
		bytedata<<=1;
		delay0();
		scl=1;
		delay0();
		scl=0;
		delay0();
	}
	sda=1;
	delay0();
	scl=1;
	delay0();
	ack=sda;
	scl=0;
	delay0();
	return ack;
}
uchar I2cReceiveChar(void) //从I2c上读一数据
{
    static	uchar i;
	static uchar bytedata=0;
	for(i=0;i<8;i++)
	{
		scl=1;
		delay0();
		bytedata<<=1;
		if(sda)
		bytedata|=0x01;
		scl=0;
		delay0();
	}
	return bytedata;
}
void SendAcknowledge(bit ack) //传送确认信号
{
	sda=ack;
	scl=1;
	delay0();
	scl=0;
}

void EEprom24c02Write(uchar address,uchar bytedata) //向 24c02写数据
{
	I2cStart();
	I2cSendChar(0xa0);
	I2cSendChar(address);
	I2cSendChar(bytedata);
	I2cStop();
	DelayX1ms(10);
	
}
uchar  EEprom24c02Read(uchar address) //从24c02读数据
{
	uchar  bytedata;
	I2cStart();
	I2cSendChar(0xa0);
	I2cSendChar(address);
	I2cStart();		
	I2cSendChar(0xa1);
	bytedata=I2cReceiveChar();
	SendAcknowledge(1);
	I2cStop();
	return bytedata;
}
//--------------------------------------------------------------------------//
void WriteK0(float s)
{
	uchar i,addr=0x13,m;
	uint y[4];
	y[0]=s;
	y[1]=s*10-y[0]*10;
	y[2]=s*100-y[0]*100-y[1]*10;
	y[3]=s*1000-y[0]*1000-y[1]*100-y[2]*10;
	for(i=0;i<4;i++)
	{
		 m=y[i];
		 EEprom24c02Write(addr,m);
		 addr++;
	 }
 }
	

//-----------------------------------------------------------------//

void oldbjz (void)  //显示存储的报警值
{ 	
	uchar add=0x10;//#10h,#11h存报警值 
	uchar i; //p
	uint j=200;
    uchar *q=buffer; //p
    for(i=0;i<3;i++)                                //读出报警值
	{
	    buffer[i]=EEprom24c02Read(add);//二进制数需转换成bcd,送显示
        add+=1;
     }
   
    while(j)
	{
		display0(q);
        j--;
     }  

}
//----------------------------------------------------------------------------//

void shuzi(uint count)
{
    
    bit j=1;
    uchar a;
    uchar  *p;
    uint num;
    uchar code codeled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9
    while(j) 
    {
    	if(p3_5==0)
        {
    	   j=0;
       	   if(num>9)
	       num=0;
       	   p=buffer+count;
           DelayX1ms(100);
           a=num;
	       le=1;
       	   num++;
           if(count==0)
           {
           	 p2_4 = 0;
             buffer[0]=a;
             P0=codeled[*p];
             DelayX1ms(10);
             p2_4 = 1;
           }
  	             
           if(count==1)          
           {
           	 p2_5= 0;
  	         buffer[1]=a;
  	         P0=codeled[*p];
  	       
  	         DelayX1ms(10);
  	         p2_5= 1;
  	       }
  	              
          if(count==2)      	 
          { 
          	p2_6=0;
  	        buffer[2]=a;
  	        P0=codeled[*p];
          
            DelayX1ms(10);
            p2_6=1;
          }
          
         }
       	
    }
}
//--------------------------------------------------------------------------//
uint yiwei(uint count)
{
    uint  b;
    uchar  *p;
    uchar code  codeled[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//共阳极0~9+"-"
    b=count%3;
    p=buffer+b;
    le=1;
    switch (b)
    {
    	case 0: p2_4 = 0;
                 P0=codeled[*p];
                 
                 DelayX1ms(20);
                 p2_4 = 1;
  	             break;
         case 1: p2_5= 0;
  	             P0=codeled[*p];
  	            
  	             DelayX1ms(20);
  	             p2_5= 1;
  	             break;
         case 2: p2_6=0;
  	             P0=codeled[*p];
              
                 DelayX1ms(20);
                 p2_6=1;  
                 break;
     }
          
    return b;
}
//----------------------------------------------------------//
void shuru(uchar aress)
{
    uchar add=aress;
    uchar i; //是否需要初赋值  
    uchar *q=buffer;
    static uint j=500;
    for(i=0;i<3;i++)
    {
        EEprom24c02Write(add,buffer[i]); //写入报警值
        add+=1;
        while(j)
        {
        	display0(q);
            j--;
        }       
    }
}   
//--------------------------------------------------------//
void baojinzhi() //3
{
    uint  m;
    uint c=0;
    oldbjz();  //显示报警值、
    if(p3_4==1)
    { 
    	DelayX1ms(1);
        if(p3_4==1)
        {
        	m=yiwei(c);
            c++;
	    }
     } 
     if(p3_5==1)
     {
     	DelayX1ms(1);
        if(p3_5==1)
        {
        	shuzi(m); 
        }
     } 

     if(p3_3==1)
     {
    	DelayX1ms(1);
        if(p3_3==1)
	    { 
	       shuru(0x10);
           flag=0;
	     } 	  
     }
}
//----------------------------------------------//
void tiaoling(void)            //1
{
    float c;
    uchar *q;
    uint  j=500;
    if((p3_4==1)||(p3_5==1))
    { 
    	DelayX1ms(1);
        if((p3_4==1)||(p3_5==1))
        {
	        c=(float)AcH/ArH; //把当前比值写入24c02
            WriteK0(c);
            le=1;
            buffer[0]=0;
            buffer[1]=0;
            buffer[2]=0;
            q=buffer;
            while(j)
            {
            	display0(q);
                j--;
             }
         }
      }
     
       if(p3_3==1)
       {
       	  DelayX1ms(1);
          if(p3_3==1)
	      { 
	      	flag=0;
	      } 	  
       }

}
//-----------------------------------------------------------------//
void tiaojing()  //2
{
    float k0; //u为比值,k0为更新值
    uchar *q;
    uint j=500;
    if((p3_4==1)||(p3_5==1))
    { 
        DelayX1ms(1);
        if((p3_4==1)||(p3_5==1))
        {
            k0=(float)AcH/ArH*1.0811; //为 0.925的倒数,uc/(ur*k0)=0.925=k',k'为2%瓦斯时的k值 
            WriteK0(k0);
            le=1;
            buffer[0]=2;
            buffer[1]=0;
            buffer[2]=0;  //开复用口
            q=buffer;
            le=1;
            while(j)
            {
            	display0(q);
                j--;
            }
         }
    }  
    if(p3_3==1)
    {
    	DelayX1ms(1);
        if(p3_3==1)
        { 
        	flag=0;
	    } 	  
    }

}
//--------------------------------------------------------------------//
void duandian(void)  //4
{       
     uchar *q;
     uint n=0;
     bit j1=0;
     uint j=500;
     if(p3_4==1)
     {
     	DelayX1ms(1);
        if(p3_4==1)
        {   
           j1=1;
        }
      }
     while(j1)
     { 
     	n++;
        j1=0;
	    if(n>5)
	       n=1;
        if(n==1)
        { 
                buffer[0]=0;
                buffer[1]=5;
                buffer[2]=0;	
         }
        else if(n==2)
	    {  
                buffer[0]=0;
                buffer[1]=7;
                buffer[2]=5;	
        }
        else if(n==3)
        { 
                buffer[0]=1;
                buffer[1]=0;
                buffer[2]=0;	
         }
        else if(n==4)
        { 
                 buffer[0]=1;
                 buffer[1]=2;
                 buffer[2]=5;	
         }
        else if(n==5)
        { 
                 buffer[0]=1;
                 buffer[1]=5;
                 buffer[2]=0;	
        }
        q=buffer;
        le=1;
        while(j)
        {
            display0(q);
            j--;
        }
      }       
     if(p3_3==1)
	 {
	 	DelayX1ms(1);
        if(p3_3==1)
	   { 
	      shuru(0x20);
          flag=0;
	   } 	  
	  }

        

}

//-------------------------------555555----------------------------------//
void zijian()
{     
    uchar *q;//指针指向显示存储区
    uint i;
    le=1;
    buffer[0]=2;
    buffer[1]=0;
    buffer[2]=0;  //开复用口
    q=buffer;
    for(i=0;i<200;i++)
    display0(q); //显示2.00
    comput2(2);
    flag=0;
        
     
}
//-----------------------------------------------------//
void jianpan()
{   
   
   uchar code  codeled[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//共阳极0~9+"-
   bit suremark=1;
   while(flag)
   {  
      while(suremark) 
      {     
         if(jpn>5)
         jpn=1;
         p2_4 = 0;
         P0=codeled[jpn];
         DelayX1ms(10);
         p2_4 = 1;
         if(p3_3==1)
         { 
            DelayX1ms(1);
            if(p3_3==1)
            {
                jpn++;
            }
          }
         if(p3_4==1)
         { 
            DelayX1ms(1);
            if(p3_4==1)
            suremark=0;
          }
      }
                            
     if(jpn==1)
     { 
    
    	while(flag)
       {
          tiaoling();
        }  
      }
     if(jpn==2)
     { 
	     while(flag)
        {
        	tiaojing();
         }
     }
     if(jpn==3)
     {
       while(flag)
       {
	       baojinzhi();
        }
     }
     if(jpn==4)
     {   
        while(flag)
        {
        	duandian();
    	}
     }
     if(jpn==5)
     {
        while(flag)
        {
        	zijian();
         }
     }
  }

}

void main()
{  
      
      IP=0x01;
	  EA=1;/*开总中断*/
      ET1=1;/*开T1中断*/
      TMOD=0x11;/*T0方式1,定时,只受TR0控制*/
      TH1=0xFB;/*200HZ*/
      TL1=0x1E;
      TR1=1;/*允许计数*/ 

   if(p3_3==1)
   { 
            DelayX1ms(1);
            if(p3_3==1)
            {
            	flag=1;
                jianpan();  
             }
    }



}

⌨️ 快捷键说明

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