📄 111.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;//斜左
sbit IN5 = P1^2;//正面左
sbit IN6 = P1^6;//正面右
sbit LASTS = P1^4;
sbit LASTB = P1^5;
sbit LASTF = P3^0;
//定义全局变量
ulong xdata data0[15]; //存储AD进来的数再进行运算
ulong avge=0,avge0=0; //avge为每30次的AD平均值 avge0为一开始的标准值
uchar time1=0,time2=0,counter1=0,counter2=0,counter3=2; //定时器0,1的标志位
uchar a,bb,c,d,e,f,g,right,left; //各红外传感器的输入值
uchar forward=0,black=0,keykey=0,backward=0,xianshi=1; //各段程序的标志位
uchar T0_OF=0,min=0,sec=0; //T0_OF时T0溢出次数 ,t_n=0
uchar stage_sec=0,stage_sec1=0,stage_clk_flag=0; //stage_clk_flag为1是阶段计时标志位.不用stage_min
uchar transform=1; //1,2两程序互换
uchar chazhi=5;
uchar wending=1,look=1,lalala=3;
ulong huang0,huang1;
uint wucha; //键盘控制差值
// Peripheral specific initialization functions,
// Called from the Init_Device() function
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 = 0x0A; //使能定时器1中断//使能定时器0中断
IP = 0x02; //使定时器1,0优先级高
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];
}
avgad=avgad/15;
for(i=0;i<15;i++)
{
data0[i]=state;
avgad1+=data0[i];
}
avgad1=avgad1/15;
avge=(avgad+avgad1)/4;
if(look==1) /*确定是否晃动太厉害*/
{
look=0;
huang1=huang0;
huang0=avge;
wucha=abs(huang1-huang0);
if(lalala--==0)
{
CH452_Write(CH452_DIG0 | wucha%10);
CH452_Write(CH452_DIG7 | wucha/10);
lalala=3;
}
if(wucha>=6)
{
wending=0;
START=0;
LASTS=1;
delayms(700);
}
else wending=1;
}
return(avge);
}
void stage_clk_start()
{
CH452_Write(CH452_TWINKLE);
DELAY_1US;DELAY_1US;DELAY_1US;DELAY_1US;DELAY_1US;
stage_clk_flag=1;
stage_sec=0;
CH452_Write(CH452_DIG4);
CH452_Write(CH452_DIG5 | 16);
}
/****精确0.5 * n秒延时****/
void delay_s(uchar n)
{ unsigned char i,j;
for(i=0;i<200;i++)
for(j=0;j<25*n;j++)
{
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US;
DELAY_10US; //100us
}
}
void judgement (uchar modi,uchar modi1,uchar dem)
{
uchar i;
if((a&&bb==0&&c==0)||(a&&bb&&c==0))
{ left=1;
right=0;
speedchange(modi1,1);
speedchange(modi,0);
delayms(dem);
}
else if((a==0&&bb==0&&c)||(a==0&&bb&&c))
{
left=0;
right=1;
speedchange(modi1,0);
speedchange(modi,1);
delayms(dem);
}
else if(a==0&&bb&&c==0)
{
left=0;
right=0;
speedchange(modi,0);
speedchange(modi,1);
delayms(dem);
}
else if(a&&bb&&c) //停止&&(d||e)
{
START=0;
LASTS=1;
forward=0;
stage_clk_flag=0;//stage_clk_stop();显示平衡后前进的时间
CH452_Write(CH452_DIG0|11);
CH452_Write(CH452_TWINKLE | 0x31);
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);
stage_clk_start();
CH452_Write((CH452_DIG0)|16);
if(transform==1)
{
forward=0;
black=0;
keykey=0;
xianshi=0;
backward=1;
}
}
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(dem);
}
}
void judgementback (uchar modi,uchar modi1,uchar dem,uchar i)
{ if(i==1)
{if(stage_sec>29)
{
START=0;
LASTS=1;
stage_clk_flag=0;//stage_clk_stop();
CH452_Write(CH452_DIG0|10);
CH452_Write(CH452_TWINKLE | 0x31);
TR0=0;
forward=0;
black=0;
keykey=0;
backward=0;
xianshi=0;
}}
if(f==1&&g==0)
{
speedchange(modi1,1);
speedchange(modi,0);
}
else if(f==0&&g==1)
{
speedchange(modi,1);
speedchange(modi1,0);
}
else //if(f==0&&g==0)
{
speedchange(modi,1);
speedchange(modi,0);
}
delayms(dem);
}
void main(void)
{
uchar chazhi1;
Init_Device();
CH452_Init(); /* CH452初始化 */
LEDG=0;
SPOKER=0;
forward=0,
black=0,
keykey=0,
backward=0,
xianshi=1;
IN0=1;
IN1=1;
IN2=1;
//IN3=1;
//IN4=1;
IN5=1;
IN6=1;
START=0;
LASTS=1;
LASTB=0;
LASTF=0;
time1=1;
time2=1;
counter1=170;
counter2=50;
chazhi=2;
EA=1;
while(1)
{
LEDG=~LEDG;
avge=pingjun();
if(xianshi==1)
{BCD_H_L(avge-200,0); }
a=IN0;
bb=IN1;
c=IN2;
//d=IN3;
//e=IN4;
f=IN5;
g=IN6;
if(backward==1)
{
START=1;
LASTS=0;
BACK=0;
LASTB=1;
LASTF=1;
counter2=0;
judgementback(90,20,20,1);
}
if(forward==1)
{
START=1;
LASTS=0;
BACK=1; //前进
LASTB=0;
LASTF=0;
judgement(90,20,20);
}
if(black==1)
{
START=1;
LASTS=0;
TR1=1; //开定时器
time2=0;
judgement(90,20,20);
}
if(keykey==1)
{
speedchange(40,1);
speedchange(40,0);
chazhi1=abs((int)(avge-avge0));
if(wending==1)
{
if(chazhi1>chazhi) //chazhi1>=20
{
START=1;
LASTS=0;
counter2=50;
if(avge>avge0-1)
{
BACK=0;//后退
LASTB=1;
LASTF=1;
delayms(3);
judgementback(40,1,15,0);
}
if(avge<avge0)
{
BACK=1; //前进
LASTB=0;
LASTF=0;
delayms(3);
judgement(40,1,15);
}
}
else
{
START=0;
LASTS=1;
delayms(500);
TR1=1; //开定时器
time1=0;
time2=1;
}
}
else
{
START=0;
LASTS=1;
}
}
}
}
/*PCA中断子程序*/
void PCA_ISR (void) interrupt 9
{
CCF0 = 0; /*清匹配中断标志*/
}
/*键盘中断子程序*/
void led(void) interrupt 19
{
uchar key,t;
EA=0;
key=CH452_Read();
if(0x62==key)
{
delayms(2);
avge0=avge;
black=0;
BCD_H_L(avge0-200,1);
}
else if(0x63==key)
{
delayms(2);
black=1;
xianshi=0;
TR0=1;
for(t=0;t<8;t++)
CH452_Write((CH452_DIG0+ (t<<8))|16);
CH452_Write(CH452_DIG1);
stage_clk_start();
}
else if(0x7A==key)
{
delayms(2);
counter1=counter1+10;
CH452_Write(CH452_DIG3 | 1);
}
else if(0x7B==key)
{
delayms(2);
counter1=counter1-10;
CH452_Write(CH452_DIG3 | 0);
}
else if(0x50==key)
{
delayms(2);
transform=1;
CH452_Write(CH452_DIG7 | 1);
}
else if(0x58==key)
{
delayms(2);
transform=0;
CH452_Write(CH452_DIG7 | 2);
}
else if(0x78==key)
{
delayms(2);
chazhi=chazhi+1;
CH452_Write(CH452_DIG7 | chazhi);
}
else ;
EA=1;
}
/*定时器0中断子程序*/
void T0_ISR(void) interrupt 1 using 0
{
TR0=0;
TF0=0;
TH0=0x7D ;
TL0=0xCC ; //0xCC由0xCB+1得来
TR0=1;
if(T0_OF<10)
T0_OF++;
else
{
if(sec<59)
sec++;
else
{
sec=0;
min++;
CH452_Write(CH452_DIG3 | min); //先写min,因为人眼分辨不出
CH452_Write(0x1FB);
}
CH452_Write(CH452_DIG1 | (sec%10));
CH452_Write(CH452_DIG2 | (sec/10));
if(stage_clk_flag)
{
stage_sec++;
CH452_Write(CH452_DIG4 | (stage_sec%10));
if(stage_sec/10) CH452_Write(CH452_DIG5 | (stage_sec/10));
}
T0_OF=0;
}
if(--counter3==0)
{
counter3=2;
look=1;
}
}
/*定时器1中断子程序*/
void TIMER1_ISR (void) interrupt 3 using 1
{
uchar i;
TR1=0;
TF1=0;
TH1=0x7D;
TL1=0xFB;
TR1=1;
if(time1==1) //执行黑线判断程序17s
{
if(--counter1==0)
{
TR1=0; //关定时器
time1=0; //标志
black=0; //不执行黑线判断程序
START=0;
keykey=1;//执行角度黑线判断程序
}
}
if(time2==1) //判断3s后5s显示
{
if(--counter2==0)
{
TR1=0; //关定时器
time2=0;//标志
keykey=0;
counter2=0;
stage_clk_flag=0;//stage_clk_stop();//显示平衡的时间
CH452_Write(CH452_SELF_BCD|0x39);
CH452_Write(CH452_DIG0|0x1E);
CH452_Write(CH452_TWINKLE | 0x31);
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);//计数显示
stage_clk_start();
CH452_Write(CH452_DIG0|16);
if(transform==0)
{
forward=0;
backward=0;
black=0;
xianshi=0;
transform=0;
keykey=1;
}//循环角度判断
if(transform==1)
{
keykey=0;
black=0;
backward=0;
xianshi=0;
transform=1;
forward=1;
}//平衡后前进
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -