📄 0402car2007.c
字号:
/*******************作者-王雪健*****/
#include <C8051F040.h>
#include "intrins.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
#define MOTO_BREAK DIR1A=DIR1B
#define MOTO_FORD DIR1A=0;DIR1B=1
#define MOTO_BACK DIR1A=1;DIR1B=0
sbit DIR1A =P2^6;//车方向控制管脚
sbit DIR1B =P2^7;
sbit MP = P4^1;
uchar flag_select;
uint degree;
//12位ADC0定义
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
uchar temppage;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;//将ADC0H-ADC0L通过sfr16实现
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uint Value;
sbit PORTA_BIT6 = P3^4;//前后传感器
sbit PORTA_BIT7 = P3^5;
uint Ballence_degree;
sbit reset =P6^3;//步进电机
sbit clock =P2^1;
sbit ccw =P5^7;
sbit control=P5^5;
//---------------------------------------------------------------------------------
uchar lcm_data1[16]={"================"};
uchar lcm_data2[16]={"Time:000-1234-ph"};
//{"State:uph======="};
uchar led6[8];/*六位显示缓冲区*/
sbit LcdCs=P2^5;
uchar virt_port;
bit SPI_BUSY;
uchar wan;
uchar qian;
uchar bai;
uchar shi;
uchar ge;
//---------------------------------------------------------------------------------
void select_mp();
void show_time(uchar time);
void show_ph(void);
void show_bph(void);
uchar intoch(uchar in);
void pca0ini();
void PWM0_set(uchar val);
void pcaini();
void t2_ini();
void t2_baud(uint t2reload);
void adc0_mux(uchar type,uchar source);
void adc0_ini();
void config();
void Forward_slow(uchar speed);
void Backward_slow(uchar speed);
void Forward_lx(uchar speed);
void Backward_lx(uchar speed);
void stop_stop();
void bjdj_Init(void);
void DuoJi_Forward(uint counter);
void DuoJi_Backward(uint counter);
void delay1ms(uint time);
void delay1us(uint time);
void writelcd(uchar spi_data);
void writecode(uchar ins);
void writedata(uchar d);
void lcdchar(uchar line);
void lcdinit();
//===================================================================================
//===================================================================================
//===================================================================================
//===================================================================================
//===================================================================================
//===================================================================================
void main(void) //主函数
{
uint flagg=0;
uchar flag_degree;
Ballence_degree = 2318;//2420; //490 495水平位置时的电压值 470-510
config();
pcaini();
pca0ini();
adc0_ini();//ADC0初始化//ADC0初始化
lcdinit();
bjdj_Init();
EA=1;
// select_mp();
/*DuoJi_Forward(100);
delay1ms(2000);
DuoJi_Backward(100);
delay1ms(2000);*/
Forward_lx(245);
delay1ms(1200);
stop_stop();
while(1)
{
switch(flagg)
{
case 0:
{
while(1)
{
if(Value<(Ballence_degree-100))//&& flag==1)
{
Backward_slow(242);
delay1ms(1300);
}
else if(Value>(Ballence_degree+100))
{
Forward_slow(242);
delay1ms(1300);
}
if((Value>=(Ballence_degree-100))&& (Value<=(Ballence_degree+100)))
{
delay1ms(5500);
if((Value>=(Ballence_degree-200))&& (Value<=(Ballence_degree+200))) flagg=1;
else flagg=0;
break;
}
}
}
break;
case 1:
{
while(1)
{
if(flag_degree==1)
{
if(Value<=(Ballence_degree-100)||Value>=(Ballence_degree+100))
{
flagg=0;
flag_degree=0;
}
else flagg=2;
break;
}
else
{
if(Value<Ballence_degree-100)//&& flag==1)
{
DuoJi_Forward(3);
delay1ms(500);
}
else if(Value>(Ballence_degree+100))
{
DuoJi_Backward(3);
delay1ms(500);
}
if((Value>=(Ballence_degree-150))&& (Value<=(Ballence_degree+150)))
{
if(degree>1500)
{
DuoJi_Forward(3);
delay1ms(500);
}
else
{
DuoJi_Backward(3);
delay1ms(500);
}
delay1ms(5500);
if((Value>=(Ballence_degree-150))&& (Value<=(Ballence_degree+150)))
{
flagg=2;
break;
}
else
{
delay1ms(5500);
flagg=1;
//舵机摆正!!!!!
break;
}
}
}
}
}
break;
case 2:
{
delay1ms(5000);
if(flag_select==0)
{
for(;;)
{
Forward_lx(242);
if(PORTA_BIT6==0)
{
stop_stop();
delay1ms(5500);//计时5s
Backward_lx(242);
for(;;)
{
if(PORTA_BIT7==0)//需要减速!!!!!!!!!!
{
stop_stop();
for(;;);
}
}
}
}
}
else if(flag_select==1) flagg=0;
}
break;
}
}
}
//===================================================================================
//===================================================================================
//===================================================================================
//===================================================================================
//===================================================================================
void select_mp()//码盘选择
{
if(MP==0)
{
flag_select=0;//基本操作
}
else if(MP==1)
{
flag_select=1;//发挥部分
}
}
//===================================================================================
void show_time(uchar time)
{
bai = time/100;
shi = (time%100)/10;
ge = time%10;
lcm_data2[5]=intoch(bai);
lcm_data2[6]=intoch(shi);
lcm_data2[7]=intoch(ge);
qian= Value/1000;
bai = (Value%1000)/100;
shi = (Value%100)/10;
ge = Value%10;
lcm_data2[9] =intoch(qian);
lcm_data2[10]=intoch(bai);
lcm_data2[11]=intoch(shi);
lcm_data2[12]=intoch(ge);
lcdchar(1);
}
//===================================================================================
void show_ph(void)
{
lcm_data2[14]='P';
lcm_data2[15]='H';
lcdchar(1);
}
//===================================================================================
void show_bph(void)
{
lcm_data2[14]='N';
lcm_data2[15]='O';
lcdchar(1);
}
//===================================================================================
uchar intoch(uchar in)
{
uchar out;
switch(in)
{
case 0:
out = '0';
break;
case 1:
out = '1';
break;
case 2:
out = '2';
break;
case 3:
out = '3';
break;
case 4:
out = '4';
break;
case 5:
out = '5';
break;
case 6:
out = '6';
break;
case 7:
out = '7';
break;
case 8:
out = '8';
break;
case 9:
out = '9';
break;
default:
out = '0';
}
return (out);
}
//======================+=============================================================
void pca0ini()
{//CEX0为8bit PWM输出模式
SFRPAGE = 0x00;
PCA0CPM0=0X42;
}
//----------------------------------
void pcaini()
{
SFRPAGE=0x00;
PCA0MD=0x08;//PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40;//启动PCA计数器
}
//----------------------------------
void PWM0_set(uchar val)
{//高电平占空比为val/256
SFRPAGE = 0x00;
PCA0CPH0=~val+1;
}
//===================================================================================
void t2_ini()
{
SFRPAGE = 0x00;
TMR2CF = 0x08; // T2时钟为系统时钟,计数方向为增值计数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -