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

📄 main.c

📁 在跷跷板的一端放一个重物
💻 C
字号:
/***************************************
*电动车跷跷板
*修改时间:2007-9-6 13:56
*
***************************************/

#include<stdio.h>
#include<reg52.h>
#include"tdp.h"
#include"1602.h"
#include "math.h"
#include "ADC0832.H"
#define  DELAY(t)  Alarm=t; while(Alarm!=0)

/***************变量声明**************/
char Speed=0;         //小车速度,-127<=Speed<=127
bit  DispFlag=1;
bit  TimerRun=0;
uint Timer=0;
uchar Alarm=0;
uint ForwardTime=0;
uint BackTime=0;
//uchar  ADC_Value=0;
char  Err=0;
char  dErr=0;
char BuzzerCnt=0;
bit  CY_Flag=0;
/*************************************************
*定时0中断
*功能:将Speed转为PWM输出,有自动寻黑带功能
**************************************************/
void t0_int(void) interrupt 1
{
   static bit PWM=0;
   PWM=!PWM;
   TH0= PWM ? ~cabs(Speed) : cabs(Speed);
   TH0|=0x80;    //7-bit PWM
   if(Speed==0) PWM=0;
   if(Speed>0)
   {
      L293D_IN1=1;
      L293D_IN2=0;
      L293D_IN3=1;
      L293D_IN4=0;
      L293D_EN1=PWM & !LED_LF;
      L293D_EN2=PWM & !LED_RF;
   }
   else
   {
      L293D_IN1=0;
      L293D_IN2=1;
      L293D_IN3=0;
      L293D_IN4=1;
      L293D_EN1=PWM & !LED_LB;
      L293D_EN2=PWM & !LED_RB;
   }
}
/*************************
*定时1中断
*功能:计时
*************************/
void t1_int(void) interrupt 3
{
    static   char t=0,bt=0;
    TL1=(65536-50000)+6;
    TH1=(65536-50000)>>8;
    if(TimerRun)
    {
        if(++t==20)
        {
           t=0;
           Timer++;
           DispFlag=1;
        }
    }

    if(Alarm!=0) Alarm--;

    if(BuzzerCnt==0){ bt=0;BuzzerPort=1;}
    else
    {
        if(++bt==20){bt=0;BuzzerCnt--;}
        BuzzerPort = bt<10;
    }

    CaiYang();
}
/***************************
*初始化函数
***************************/
void Initial(void)
{
    TMOD=0x11;
    TH0=0;
    TR0=1;
    TR1=1;
    ET0=1;
    ET1=1;
    PT0=1;
    EA=1;
}
/****************************
*主函数
****************************/
main()
{
    InitLCD();
    Initial();
    Puts("  Ready");
    if(!KeyBasic)
    {
        while(1)
        {char buf[16];
         sprintf(buf,"ADC=%-8d",(int)Err);
         Gotoxy(0,0);
         Puts(buf);
        }
    }
    while(1)
    {
         if(!KeyBasic) BasicFunc();
         if(!KeyExtend) ExtendFunc();
    }
}
/***************************
*基本功能执行函数
***************************/
void BasicFunc(void)
{
    char time[2]={0,0};
    CLRLCD;
    Timer=0;
    DELAY(20);    //delay 1s
    TimerRun=1;   //启动计时器
    Speed=127;    //启动小车
    while(1)
    {
       while(!LED_LF | !LED_RF)  //未到达B端
       {
           if(!DispFlag) continue;
           time[0]=Timer;
           Disp(0,time);
       }
       Speed=0;
       Bell(5,1);
       Timer=0;
       Speed=-127;       //倒车
       while(!LED_LB | !LED_RB)  //未到达A端
       {
           if(!DispFlag) continue;
           time[1]=Timer;
           Disp(0,time);
       }
       Speed=0;
       return ;
    }
}
/***************************
*扩展功能执行函数
***************************/
void ExtendFunc(void)
{
    bit  pingheng=0;
    CLRLCD;
    Timer=0;
    Speed=0;
    DELAY(20);
    TimerRun=1;
    while(1)
    {
       if(CY_Flag)
       {
           CY_Flag=0;
           FuzzyCtrl();
       }
       if(DispFlag) Disp(1,(char*)&Timer);
       if( cabs(Err)>25 ) Alarm=60;
       if(!pingheng && Alarm==0)
       {
           Speed=0;
           TimerRun=0;
           pingheng=1;
           Bell(5,1);
           break;
       }
    }
    return ;
}
//
void  Disp(char ID,char *p)
{
    char  data  buf[16];
    DispFlag=0;
    if(ID==0)
    { //p[0]=前进时间,p[1]=后退时间
        sprintf(buf,"Forward:%-8ds",(int)p[0]);
        Gotoxy(0,0);
        Puts(buf);
        sprintf(buf,"Back:%-8ds",(int)p[1]);
        Gotoxy(0,1);
        Puts(buf);
    }
    //
    if(ID==1)
    {
        int time;
        time=*(int*)p;
        sprintf(buf,"Time:%ds    ",time);
        Gotoxy(0,0);
        Puts(buf);
        sprintf(buf,"%d  %d   ",(int)Err,(int)dErr);
    }
}
//
void  Bell(char n,char mode)
{
    BuzzerCnt=n;
    if(mode==0)return;
    while(BuzzerCnt);
}
//采样函数
void CaiYang(void)
{
   int  ui;
   char i;
   for(ui=0,i=16;i>0;i--)
       ui+=ADC0832(0);
   ui=ui/16-128;
   dErr=-ui-Err;
   Err=-ui;
   CY_Flag=1;
}

void FuzzyCtrl(void)
{
   char  code  tab[7][7]=     //tab[ek][dek]
   {// -3,  -2,  -1,    0,   1,   2,   3
       127, 127,  127, 127, -127, -127, -127, //-3
       127, 127,  127, 10,  -127, -127, -127, //-2
       127, 20,   5,   5,   -5, -20,  -127,  //-1
       127, 20,   5,   0,   -5,  -20,  -127,  //0
       127, 20,   5,   -5,   -5, -20,  -127,  //1
       127, 127,  50,   10,  -127,-127, -127,  //2
       10,  127,  50,  -127, -127, -127,-127    //3
   };
   char i,j;
   i=Err/10;
   if(i>3)i=3;
   if(i<-3)i=-3;
   j=dErr;
   if(j>3)j=3;
   if(j<-3)j=-3;
   Speed=tab[i+3][j+3];
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -