📄 kjc.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 + -