📄 main.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 + -