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

📄 kjc.c

📁 直流电机速度控制 可通过按键来选择转速在LED上显示 使用的是C8051F 单片机
💻 C
字号:
#include <C8051F410.h>//P0.2是第19脚
#include <math.h>
typedef unsigned char uchar;                       
typedef unsigned int uint;
typedef unsigned long ulong;
sbit P0_0=P0^0; 
sbit P0_1=P0^1;  
sbit P0_2=P0^2;  
sbit P0_4=P0^4; 
sbit P0_5=P0^5; 
sbit P0_6=P0^6; 
sbit P0_7=P0^7; 
unsigned char xdata a,b,c,d,e; 
uint xdata slew;//转速

void PCA_port(); 
void PCAmodule2_run();
void PCAmodule1_run();
void delay(unsigned int k);
void oscill();
void check_sw();
bit yor_n();
uchar scan_key();
void key_value_process(uchar keyvalue);
void Timer1_init();
void Timer1_ISR();
void display(int m );
void display_all();
void PCA0_Init (void);

unsigned char xdata biaozhi;
unsigned char xdata led_tab[]={0Xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};

#define SYSCLK       24500000          // Internal oscillator frequency in Hz
#define T0_CLOCKS 245                  // Use 245 clocks per T0 Overflo
sfr16 PCA0CP0 = 0xFB;                  // PCA0 Compare Register Definition
sbit TEST_OUT = P0^1;                  // Output for testing purposes
unsigned int xdata  freq,i;
float xdata zhankong;
unsigned int xdata y;

void main()
{IP= 0x08;
a=b=c=d=0;
e=0;
P0MDOUT = 0xFF;
P1MDOUT = 0xFF;
P2MDOUT = 0xFF;           
TMOD=0X12;
TCON=0X00;
biaozhi=0;
zhankong=0.5;
PCA0MD = 0x00;       
oscill();
display_all();
IP= 0x08;
PCA_port();
Timer1_init(); 
EA = 1;
i=0;
while(1)
{ display_all();
check_sw();
switch(biaozhi)
{case 1: display_all();y=1;
       PCA0CPM2 =0X00;//P0_2=0;
       PCAmodule1_run();break;//正转
 case 2: display_all();y=2;
       PCA0CPM1=0X00; //P0_1=0;
       PCAmodule2_run();break;//反转
 case 5:  display_all();PCA0CPM2 =0X00;PCA0CPM1=0X00;
          break;//停止转动
 case 3: display_all();display_all();	slew=a*1000+b*100+c*10+d;
		if(slew>=884) zhankong=(1273.0-slew)/720;
		else zhankong=(1652.0-slew)/1536;
		break;
 case 6: display_all();PCA0CPM2 =0X00;//P0_2=0;
       PCAmodule1_run();//正转break;
	   PCA0_Init ();
      while(i!=1600);
	    i=0; 
		display_all();
	/*	if(biaozhi=6)
		{a=freq/1000;
		b=freq/100%10;
		c=freq/10%10;
		d=freq%10;
       display_all();}*/
	    break;	             
 case 4:display_all();
     	slew=a*1000+b*100+c*10+d;
		if(slew>=884) zhankong=(1273.0-slew)/720;
		else zhankong=(1652.0-slew)/1536;break;//选择位
  }display_all();
 } 
}
//*******************************410初始化程序
void oscill(){  CLKSEL = 0x00;//选择内部振荡方式
               //CLKSEL = 0x01;//选择外部振荡方式 
    OSCICN    = 0x87;
PCA0MD    &= ~0x40;//关开门狗
    PCA0MD    = 0x00;
}

 //********************PCA的初始化程序
 void PCA_port()
{   
    
  // XBR1    = 0x62; //交叉开关设置,模块0和模块1允许 
// P0MDOUT   = 0x07;// CEX0 (P0.0) 和CEX1 (P0.1)设置为弱上拉
   P0MDOUT   = 0x07;
    XBR1      = 0x43;
   }
//****************************************************
//延时子程序
void delay(unsigned int k)
{
while(k--);
}
//*************************************************	
void check_sw(){uchar key_value;
 	if( yor_n()){delay(10); 
              key_value=scan_key();
                while(yor_n());
               key_value_process(key_value);	}	}
//*********************其中1.4,1.3,1.2是列分别对应13,12,11脚
//********************/其中1.7,1.6,1.5是行分别对应16,15,14脚
//有无按键按下,判断行线是否有变化
bit yor_n()
{uchar scanvalue,keyvalue;
scanvalue=0x1f;//让所有的列都为0
P1=scanvalue;
keyvalue=P1;
if(keyvalue==0x1f) return 0;
else return 1;}
//****************************************************************
//列(高3位)扫描,并返回键值,判断是否有按键按下,有返回1,没返回0
uchar scan_key()
{uchar scanvalue,keyvalue;
scanvalue=0xdf;
while(scanvalue!=0xff){
P1=scanvalue;
keyvalue=P1;

if((keyvalue&0x1f)!=0x1f)  break;
scanvalue=(keyvalue<<1)|0x1f;}//列位又移一位,并将行位置高
return keyvalue;}
//**************************
//对应按键时处理
void key_value_process(uchar keyvalue){
                uchar xdata scan;
                 scan=keyvalue; 
  switch(scan)
{//case 0xcf:biaozhi=1;break;//
 case 0xd7:biaozhi=1;break;
 case 0xdb:biaozhi=2;break;
 //case 0xaf:biaozhi=3;break;//
 case 0xb7:biaozhi=3;switch(e){case 3: e=0;break;
                     case 2: e=3;break;
                     case 1: e=2;break;
                     case 0: e=1;break;}break;
 case 0xbb:biaozhi=4;if(e==0){if(a==9) a=0;else a++;}
       if(e==1){if(b==9) b=0;else b++; }
       if(e==2){if(c==9) c=0;else c++; }
       if(e==3){if(d==9) d=0;else d++; }break;
 //case 0x6f:biaozhi=7;break;//
 case 0x77:biaozhi=5;break;
 case 0x7b:biaozhi=6;break;  } }
//*******************************************
void Timer1_init(void){	 EA=0;//TR0=0;
                         //IE = 0x82;//开总的中断和定时器0中断
                         TMOD      = 0x12;;//选择定时器0(16位);
                         TH1=1;TL1=1;TR1=1;
				         //IE = 0x82;
						 EA=1;ET1=1;}
void Timer1_ISR() interrupt 3{TF1=0;TH1=1; TL1=1;}
//***************************************
void display(int m )

{
   P2=led_tab[m];

  }
//*************************

void display_all(){
//以下为LED动态显示
        P0_4=0;
        display(a);
        delay(500);
        P0_4=1;

         
        P0_5=0;
        display(b);
        delay(500);
		P0_5=1;

        
         P0_6=0;
         display(c);
         delay(500);
		 P0_6=1;
         
         P0_7=0;
         display(d);
         delay(500);
		 P0_7=1;
//以上为LED动态显示
}
//***************
//void biaohua(unchar n){
//if(n==9) n=0;else n++; }
//-----------------------------------------------------------------------------
void PCA0_ISR (void) interrupt 11
{
   static unsigned int current_capture_value, previous_capture_value;
   static unsigned int capture_period,l,m,n,q;


   if (CCF0)                           // If Module 0 caused the interrupt
   {
      CCF0 = 0;                        // Clear module 0 interrupt flag.

      // Store most recent capture value
      current_capture_value = PCA0CP0;

      // Calculate capture period from last two values.
      capture_period = current_capture_value - previous_capture_value;
	   freq=100000/ capture_period;
//TR0=0;
l=freq/1000;
		m=freq/100%10;
		n=freq/10%10;
		q=freq%10;
       P0_4=0;
        display(l);
        delay(500);
        P0_4=1;

         
        P0_5=0;
        display(m);
        delay(500);
		P0_5=1;

        
         P0_6=0;
         display(n);
         delay(500);
		 P0_6=1;
         
         P0_7=0;
         display(q);
         delay(500);
		 P0_7=1;

      // Update previous capture value with most recent info.
      previous_capture_value = current_capture_value;
	 // for(i=0;i<500;i++);TR0=0;

   }
   i++;

  
  // else                                // Interrupt was caused by other bits.
  // {
      //PCA0CN &= ~0x86;                 // Clear other interrupt flags for PCA
   //}
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//********************************************
void PCAmodule1_run()
{  PCA0CPM2 =0X00;
//P0_2=0; 
//选择8位脉宽调制方式 
                        PCA0CPM1  = 0x42;
             PCA0CPH1 = 256 - (256 *zhankong);//占空比为50%
 CR = 1;//开始PCA计时

   }
// TestTimerInit
//-----------------------------------------------------------------------------
//********************************************
void PCAmodule2_run()
{ //选择8位脉宽调制方式 
 PCA0CPM1 =0X00;
                        PCA0CPM2  = 0x42;
             PCA0CPH2 = 256 - (256 *zhankong);//占空比为50%
 CR = 1;//开始PCA计时

   }
// TestTimerInit
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void PCA0_Init (void)
{

   // Configure Timer 0 for 8-bit auto-reload mode, using SYSCLK as time base
   TMOD &= 0xF0;                       // Clear all T0 control bits
   TMOD = 0x12;                       // 8-bit auto-reload timer
   CKCON |= 0x04;                      // T0 uses SYSCLK
   TH0 = -T0_CLOCKS;                   // Set up reload value
   TL0 = -T0_CLOCKS;                   // Set up initial value

   // Configure PCA time base; overflow interrupt disabled
   PCA0CN = 0x00;                      // Stop counter; clear all flags
   PCA0MD = 0x04;                      // Use Timer 0 as time base


   PCA0CPM0 = 0x21;                    // Module 0 = Rising Edge Capture Mode
                                       // enable CCF flag.


   EIE1 |= 0x10;                       // Enable PCA interrupts

   // Start PCA counter
   CR = 1;
   TR0 = 1;                            // Start Timer 0
}






⌨️ 快捷键说明

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