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

📄 pmcykey.c

📁 使用C51语言实现电机PWM调速和液晶显示
💻 C
字号:
#include <absacc.h>
#include <reg52.h>
#include <string.h>

/*定义字型字位口*/
#define WORDPORT 0x0100
#define DIGIPORT1 0x0200
#define DIGIPORT2 0x0400

#define uchar unsigned char
#define unit unsigned int
#define N 10

/*定义P1口个管脚*/
sbit LED1=P1^0;
sbit LED2=P1^1; 
sbit LED3=P1^2;
sbit DERE=P1^3;
sbit DOG=P1^4;
sbit KEYDOWN=P3^4;
sbit KEY1=P1^5;
sbit KEY2=P1^6;
sbit KEY3=P1^7;
sbit die=P2^7;
sbit keydec=P3^2;
/*显示缓存变量定义*/
code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x86};
code uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

uchar data speed=0;
unit selcaddr;
//bit selc;
        uchar keysh;
        uchar keyg;
        uchar gbit;
        uchar shbit;
        uchar bbit;
        uchar qbit;
        float digital1;
                     
        float share;
        unit DIGIPORT;
          uchar keyvalue;
		  uchar lepd;
		  		 
/*--------延时1ms函数----------*/
void delays(void)
{uchar i;
for(i=0;i<176;i++){ }
}


/*延时200ms函数*/
void delay200(void)
{  unit i;
  for(i=25000;i>0;i--)  
  {}
}

void keypress(void)
{   DOG=~DOG;
    if(KEY1==0)
        {
          keyvalue=0x15;
          speed=speed+1;
          if(speed>=30)
           { speed=30;
            keyvalue=0x00;}
          LED1=1;LED2=0;LED3=0;
        }
		DOG=~DOG;
     if(KEY2==0)
         {
           keyvalue=0x26;
           speed=speed-1;
           if(speed==0||speed==0xff)
              {speed=0;
               keyvalue=0x07;}
             LED2=1;LED1=0;LED3=0;
         }
		 DOG=~DOG;
     if(KEY3==0)
          {
            keyvalue=0x37;
            speed=0;
            LED3=1;LED1=0;LED2=0;
           }
		   DOG=~DOG;
}

void init(void)
	{   gbit=0;
         shbit=0;
         bbit=0;
         qbit=0;
         digital1=0;
         
         share=0;
		 lepd=1;
       DIGIPORT=0; 
	   LED1=0;
	    DOG=1;
		LED2=0;
		LED3=0;
		KEYDOWN=1;
		P1=0xe0;
		selcaddr=0x0000;

		keysh=0;
		keyg=0;
		DERE=0;   //默认为接收状态
		die=0;
		RCAP2H=0xff;
		RCAP2L=0xfa;
		T2CON=0x34;
		SCON=0x50;
		
		IT0=0;
		ES=1;
		EX0=1;
		EA=1;
    }

	void shacomp1(void)

	{      uchar i;
       
	               DOG=~DOG;
                    qbit=0;
                    bbit=share*10;
                    shbit=share*100-bbit*10;
                    gbit=share*1000-bbit*100-shbit*10;
                          
                          XBYTE[selcaddr]=DIGIPORT;
                          XBYTE[WORDPORT]=table1[0];         //小数点在千位
                          for(i=0;i<176;i++){ } 
                          DIGIPORT=DIGIPORT<<1;
                          XBYTE[selcaddr]=DIGIPORT;
                          XBYTE[WORDPORT]=table[bbit];
                          for(i=0;i<176;i++){ } 
                          DIGIPORT=DIGIPORT<<1;
                          XBYTE[selcaddr]=DIGIPORT;
                          XBYTE[WORDPORT]=table[shbit];
                          for(i=0;i<176;i++){ } 
                          DIGIPORT=DIGIPORT<<1;
                          XBYTE[selcaddr]=DIGIPORT;
                          XBYTE[WORDPORT]=table[gbit];
                          for(i=0;i<176;i++){ } 					   
                          XBYTE[selcaddr]=0x00;
                          
	}        

	void shacomp10(void)

	{  uchar i;
                     DOG=~DOG;
                    qbit=(int)share;
                    bbit=share*10-qbit*10;
                    shbit=share*100-qbit*100-bbit*10;
                    gbit=share*1000-qbit*1000-bbit*100-shbit*10;
                    
                            XBYTE[selcaddr]=DIGIPORT;
                            XBYTE[WORDPORT]=table1[qbit];    //小数点在千位
                            for(i=0;i<176;i++){ }  
                            
                            DIGIPORT=DIGIPORT<<1;
							XBYTE[selcaddr]=DIGIPORT;
                            XBYTE[WORDPORT]=table[bbit];
                            for(i=0;i<176;i++){ } 
                            DIGIPORT=DIGIPORT<<1;
                            XBYTE[selcaddr]=DIGIPORT;
                            XBYTE[WORDPORT]=table[shbit];
                            for(i=0;i<176;i++){ } 
                            DIGIPORT=DIGIPORT<<1;
                            XBYTE[selcaddr]=DIGIPORT;
                            XBYTE[WORDPORT]=table[gbit];
                           for(i=0;i<176;i++){ } 
                        XBYTE[selcaddr]=0x00;
			 }

		void shacomp100(void)
		{       uchar i;
                 DOG=~DOG;
                   qbit=share/10;
                   bbit=share-qbit*10;
                   shbit=share*10-qbit*100-bbit*10;
                   gbit=share*100-qbit*1000-bbit*100-shbit*10;
                   
                        XBYTE[selcaddr]=DIGIPORT;
                        XBYTE[WORDPORT]=table[qbit];
                        for(i=0;i<176;i++){ } 
                        DIGIPORT=DIGIPORT<<1;
                        XBYTE[selcaddr]=DIGIPORT;
                        XBYTE[WORDPORT]=table1[bbit];   //小数点在百位
                        for(i=0;i<176;i++){ } 
                        DIGIPORT=DIGIPORT<<1;
                        XBYTE[selcaddr]=DIGIPORT;
                        XBYTE[WORDPORT]=table[shbit];
                       for(i=0;i<176;i++){ } 
                        DIGIPORT=DIGIPORT<<1;
                        XBYTE[selcaddr]=DIGIPORT;
                        XBYTE[WORDPORT]=table[gbit];
                       for(i=0;i<176;i++){ } 
                    XBYTE[selcaddr]=0x00;
			   }

		  void shacomp1000(void)
		  { uchar i;
		  DOG=~DOG;
               qbit=share/100;
               bbit=(share-qbit*100)/10;
               shbit=share-qbit*100-bbit*10;
               gbit=share*10-qbit*1000-bbit*100-shbit*10;
               
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[qbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[bbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table1[shbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[gbit];
                    for(i=0;i<176;i++){ } 
                    
                XBYTE[selcaddr]=0x00;
				}

		   void shacomp(void)
		   {  uchar i;
		      DOG=~DOG;
               qbit=share/1000;
               bbit=(share-qbit*1000)/100;
               shbit=(share-qbit*1000-bbit*100)/10;
               gbit=share-qbit*1000-bbit*100-shbit*10;
               
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[qbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[bbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[shbit];
                    for(i=0;i<176;i++){ } 
                    DIGIPORT=DIGIPORT<<1;
                    XBYTE[selcaddr]=DIGIPORT;
                    XBYTE[WORDPORT]=table[gbit];
                    for(i=0;i<176;i++){ } 
                    
                XBYTE[selcaddr]=0x00;
				}
    

  void display(void)
  {    
         DOG=~DOG;
       
              switch(lepd)
                  {
                   
                   case 1://负载
                      {selcaddr=DIGIPORT1;
                       share=speed;
                       DIGIPORT=0x10;
					 
                       }break;
                   case 2://转速
                      {selcaddr=DIGIPORT2;
                       share=digital1;
                     DIGIPORT=0x01;
					   
                       }break;
                   

                    }
				  lepd=lepd+1;
				  if(lepd==3)
				  {lepd=1;}
		                  if(share<1)
		                  {
		                    shacomp1();
		                   }
		               else if (share<10)
		                  {
		                    shacomp10();
		                   }
		               else if(share<100)
		                 {
		                  shacomp100();
		                 }
			             else if(share<1000)
			             {
			              shacomp1000();
			              }
						  else
						  {
						    shacomp();
							}
			  DOG=~DOG;
            
		}


        /*主程序*/
void main(void)
{  
  delay200();         //------延时以使所有芯片同步-------/

  init();
   
	while(1)
	{
	DOG=~DOG;
	 
    display();    
       
	//不停的扫描显示,等待中断
	}

}
/*按键处理程序*/
void keydown(void) interrupt 0 using 1
 {   
  
	uchar i;
	uchar j;
    ES=0;
    EX0=0;
	j=150;
   // KEYDOWN=0;   //申请上位机中断
//	DOG=~DOG;
//	KEYDOWN=1;//发送完后撤消中断申请
    delays();       //延时去抖
    delays();
    delays(); 
	delays();
    if(keydec==1)
   {goto outkey;}
    
	keypress();
	 DERE=1;   //允许发送
    
    if (speed<30)
    {
     TI=0;
     SBUF=0xfc;
     while(TI==0);
     TI=0;
     SBUF=0xcf;
     while(TI==0);
     TI=0;
     SBUF=keyvalue;
     while(TI==0);
     TI=0;
     SBUF=speed;
	 while(TI==0);
     TI=0;
    }
     keysh=speed/10;
	 keyg=(speed-keysh*10);
	                    while(j)
	                    { 
						  XBYTE[DIGIPORT1]=0x40;
                          XBYTE[WORDPORT]=table[keysh];
                          for(i=0;i<176;i++){ } 
                          DOG=~DOG;
                          XBYTE[DIGIPORT1]=0x80;
                          XBYTE[WORDPORT]=table[keyg];
                          for(i=0;i<176;i++){ } 
						  XBYTE[DIGIPORT1]=0x00;
						  XBYTE[DIGIPORT2]=0x04;
                          XBYTE[WORDPORT]=table[keysh];
                          for(i=0;i<176;i++){ } 
                          DOG=~DOG;
                          XBYTE[DIGIPORT2]=0x08;
                          XBYTE[WORDPORT]=table[keyg];
                          for(i=0;i<176;i++){ }
						  XBYTE[DIGIPORT2]=0x00;
						  j--;
						  }     
outkey:  TI=0;
	     ES=1;
	     EX0=1;
		 DERE=0;//关串口发送功能,恢复为默认的接受状态
		// DOG=~DOG;
 }


/*----------------串口中断程序-----------------------*/
 void seria(void) interrupt 4 using 2
       {
	     uchar h;
         uchar j;
         uchar i;
		 uchar k;
         uchar digth;
         uchar digtl;
	     digth=0;
         digth=0;
	 j=150;
		 h=0;
		 DOG=~DOG;
		 
         EX0=0;
         ES=0;
		 EA=0;
         RI=0;
         i=SBUF;
         if(i==0x0e)       //电机调速标志
         {
               while(RI==0 && h<80)
		      {h=h+1;}
		      if(h==80)
		      {goto out10;}
               RI=0;
			   h=0;
              k=SBUF;
			  if(k==0xe0)
			{  while(RI==0);
                RI=0;
              speed=SBUF;
			 keysh=speed/10;
	          keyg=(speed-keysh*10);
	                    while(j)
	                    { 
						  XBYTE[DIGIPORT1]=0x40;
                          XBYTE[WORDPORT]=table[keysh];
                          for(i=0;i<176;i++){ } 
                          DOG=~DOG;
                          XBYTE[DIGIPORT1]=0x80;
                          XBYTE[WORDPORT]=table[keyg];
                          for(i=0;i<176;i++){ } 
						  XBYTE[DIGIPORT1]=0x00;
						  XBYTE[DIGIPORT2]=0x04;
                          XBYTE[WORDPORT]=table[keysh];
                          for(i=0;i<176;i++){ } 
                          DOG=~DOG;
                          XBYTE[DIGIPORT2]=0x08;
                          XBYTE[WORDPORT]=table[keyg];
                          for(i=0;i<176;i++){ }
						  XBYTE[DIGIPORT2]=0x00;

						  j--;
						  }
              
			  
               }

              }
		    DOG=~DOG;
     if(i==0xfa)//端口采集数据
	   {  
	      while(RI==0 && h<80)
	      {h=h+1;}
	      if(h==80)
	      {goto out10;}
           RI=0;
		   h=0;
		   k=SBUF;
		   if(k==0xaf)
          {  while(RI==0 && h<80)
		      {h=h+1;}
		      if(h==80)
		      {goto out10;}
               RI=0;
			   h=0; 
               digth=SBUF;

               while(RI==0 && h<80)
		      {h=h+1;}
		      if(h==80)
		      {goto out10;}
              RI=0;
               h=0;

               digtl=SBUF;
			   digital1=digth*256+digtl;
		        digital1=digital1/100;//2000;
		        	   
           }
		 }
   out10:      ES=1;
             EX0=1;
			 EA=1;
}
                                       






















 








⌨️ 快捷键说明

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