📄 spoker_4pm5.c
字号:
/////////////////////////////////////
// COPYRIGHT RESERVED BY DU //
/////////////////////////////////////
#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H" // 定义常用命令码及外部子程序
#include "pin.h"
#include "math.h"
#include "key_display.h"
//定义端口
sbit LEDG = P3^4;
sbit BACK = P0^4;
sbit START = P0^5;
sbit SPOKER = P0^6;
sbit IN0 = P1^1;//左
sbit IN1 = P1^3;//中
sbit IN2 = P1^0;//右
sbit IN3 = P1^5;//斜右
sbit IN4 = P1^2;//斜左
ulong xdata data0[15];
ulong avge=0,avge0=0;
uchar keykey=0,time1=0,time2=0,counter1=0,counter2=0,black=0;
uchar a,bb,c,d,e,right,left;
// Peripheral specific initialization functions,
// Called from the Init_Device() function 系统设置,020初始化 DA_OUT AD_IN
void Port_IO_Init()
{
// P0.0 - CEX0 (PCA), Open-Drain, Digital
// P0.1 - CEX1 (PCA), Open-Drain, Digital
XBR0 = 0x10; /*CEX0-->P0.0,CEX1-->P0.1*/
XBR2 = 0x40;
}
void Interrupts_Init()
{
IE = 0x08; //使能定时器1中断
IP = 0x08; //使定时器1优先级高
EIE1 = 0x08; //使能PCA0中断
EIE2 = 0x20; //使能外部键盘中断
EIP2 = 0x20; //使外部键盘优先级高
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
ADC_Init();
PCA_Init();
Timer_Init();
Oscillator_Init();
Voltage_Reference_Init();
Port_IO_Init();
Interrupts_Init();
}
void speedchange(uchar duty,uchar i)
{
if(i==0) PCA0CPH0 =(uchar)((100-duty)*2.56); //把duty值转换,赋值给控制占空比的寄存器
if(i==1) PCA0CPH1=(uchar)((100-duty)*2.56);
}
ulong pingjun (void)
{ uchar i;
ulong avgad1=0,avgad=0,state=0;
state=AD_IN();
for(i=0;i<15;i++)
{
data0[i]=state;
avgad+=data0[i];
//delayms(10);
}
avgad=avgad/15;
for(i=0;i<15;i++)
{
data0[i]=state;
avgad1+=data0[i];
//delayms(10);
}
avgad1=avgad1/15;
avge=(avgad+avgad1)/4;
//CH452_Write(CH452_DIG1|bb);
//CH452_Write(CH452_DIG0|c);
return(avge);
}
void judgement (uchar modi,uchar modi1)
{
if((a==1&&bb==0&&c==0)||(a==1&&bb==1&&c==0))
{ left=1;
right=0;
speedchange(modi1,1);
speedchange(modi,0);
delayms(20);
}
else if((a==0&&bb==0&&c==1)||(a==0&&bb==1&&c==1))
{
left=0;
right=1;
speedchange(modi1,0);
speedchange(modi,1);
delayms(20);
}
else if((a==0&&bb==1&&c==0))
{
left=0;
right=0;
speedchange(modi,0);
speedchange(modi,1);
delayms(20);
}
else //if (a==0&&bb==0&&c==0)
{
if(left==1)
{
speedchange(modi1,0);
speedchange(modi,1); }
else if(right==1)
{
speedchange(modi,0);
speedchange(modi1,1);}
else
{
speedchange(modi,0);
speedchange(modi,1);}
delayms(20);
}
}
/****精确秒延时****/
void delay_s(uchar n)
{
#pragma asm
//USING 0
n_:
MOV R2,#50 //系统时钟如果分别是2M,4M,8M,16M
//则R2值分别为 25,50,100,200
R2_:
MOV R1,#40
R1_:
MOV R0,#50
R0_:
NOP
NOP
NOP
NOP //1us
NOP
NOP
NOP
NOP //2us
NOP
NOP
NOP
NOP //3us
NOP
NOP
NOP
NOP //4us
NOP
NOP
//NOP
//NOP
DJNZ R0,R0_ //5us *200=1ms
DJNZ R1,R1_ //1ms*10=10ms
DJNZ R2,R2_ //10ms*100=1s
DJNZ n?648,n_
#pragma endasm
}
void confirm(void)
{
uchar i,t;
for(t=0;t<7;t++)
CH452_Write((CH452_DIG0+ (t<<8))|16);
for(i=5;i>0;i--)
{
CH452_Write(CH452_DIG7 | i);
SPOKER=1;
delay_s(1);
SPOKER=0;
delay_s(1);
}
CH452_Write(CH452_DIG7);
}
void main(void)
{
uchar chazhi=4;
uchar chazhi1;
Init_Device();
CH452_Init(); /* CH452初始化 */
LEDG=0;
SPOKER=0;
IN0=1;
IN1=1;
IN2=1;
IN3=1;
IN4=1;
START=0;
time1=1;
time2=1;
counter1=170;
counter2=30;
//BACK=0;
while(1)
{
LEDG=~LEDG;
EA=1;
avge=pingjun();
BCD_H_L(avge-200,0);
a=IN0;
bb=IN1;
c=IN2;
d=IN3;
e=IN4;
if(black==1)
{
START=1;
TR1=1;
time2=0;
judgement(80,20);
}
if(keykey==1)
{
chazhi1=abs((int)(avge-avge0));
if(chazhi1>=20)
{
START=1;
counter2=30;
if(avge>(avge0+chazhi-3))
{
BACK=0;
judgement(50,0);
}
if(avge<(avge0-chazhi))
{
BACK=1;
judgement(50,0);
}
}
else if((chazhi1<20)&&(chazhi1>10))
{
counter2=30;
if(avge>(avge0+chazhi-3))
{
START=1;
BACK=0;
judgement(50,0);
}
if(avge<(avge0-chazhi))
{
START=1;
BACK=1;
judgement(50,0);
}
}
else
{
START=0;
TR1=1;
time1=0;
time2=1;
}
}
//AMX0SL = 0x03;
//state=(AD_IN(1,1));
//result=(int)state;
//BCDdisplay(result);
//delayms(20);
}
}
/*PCA中断子程序*/
void PCA_ISR (void) interrupt 9
{
CCF0 = 0; /*清匹配中断标志*/
}
/*键盘中断子程序*/
void led(void) interrupt 19
{
uchar key;
EA=0;
key=CH452_Read();
if(0x62==key)
{
delayms(2);
avge0=avge;
black=0;
BCD_H_L(avge0-200,1);
}
if(0x63==key)
{
delayms(2);
black=1;
//START=1;
}
EA=1;
}
/*定时器中断子程序*/
void TIMER1_ISR (void) interrupt 3 using 1
{
TF1=0;
TH1=0x7D;
TL1=0xFB;
if(time1==1)
{
if(--counter1==0)
{
TR1=0;
time1=0;
keykey=1;
black=0;
}
}
if(time2==1)
{ if(--counter2==0)
{
TR1=0;
time2=0;
confirm();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -