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

📄 0402car2007.c

📁 2007年电子大赛小车过跷跷板的程序。主控芯片为C8051F040
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************作者-王雪健*****/
#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 + -