智能循迹小车电磁组C语言源代码(stc12c5a芯片)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define FOSC 18432000L
#define BAUD 9600
#define ADC_POWER 0x80 //ADC power control bit 电源控制位
#define ADC_FALG 0x10 //ADC complete flag 标志位
#define ADC_START 0x08 //ADC start control bit 启动控制位
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
typedef unsigned char BYTE;
typedef unsigned int WORD;
float bj1,bj2;
int cg1,cg2,go;
go=0x05; //电机驱动设为0101
BYTE ch=0;
void InitADC();
void Delay(WORD n);
void kongzhi();
void PWM();
void GetADCResult(BYTE ch);
void main()
{
P0=0X00; //P0口的LED灯全亮
InitADC(); //初始化AD
IE=0xa0;
PWM(); //调用PWM函数
while(1){
GetADCResult(ch); //读取AD值并赋值给变量
kongzhi(); //调用控制函数
}
}
void GetADCResult(BYTE ch) //读取AD的函数
{
ADC_CONTR &=!ADC_FALG;
for(ch=0;ch<2;ch++){
switch(ch)
{
case 0: ADC_CONTR=0xe9; //定义P1.1为AD转换 1110 1001
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FALG));
ADC_CONTR&=~ADC_FALG; //清除falg位
cg1=ADC_RES; //把传到P1.1口的AD值(二进制)赋值给cg1
break;
case 1: ADC_CONTR=0xea; //定义P1.2口为AD转换 1110 1010
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FALG));
ADC_CONTR&=~ADC_FALG;
cg2=ADC_RES; //把传到P1.2口的AD值(二进制)赋值给cg2
break;
default: break;
}
}
if(++ch>=2) ch=0;
}
void InitADC() //初始化AD函数
{
P1ASF=0XE7; // 1110 0111 //定义为AD转换的IO口
P1M0=0xE7 ; // P1.7-P1.0:1110 0111
P1M1=0xE7 ; // P1.7-P1.0:1110 0111
ADC_RES=0;
ADC_CONTR=0xe9;
Delay(2);
}
void Delay(WORD n) //延时函数
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
void kongzhi()
{
bj1=((cg2*5/256)-(cg1*5/256)); //两个传感器所检测到的电压的差值
bj2=((cg1*5/256)-(cg2*5/256));
if((bj1<1)&&(bj2<1)) //全速
{
CCAP0H=0x08; //左轮
CCAP1H=0x00; //右轮
P3=go;
}
else if(bj1>4/3) //强左拐
{
CCAP0H=0x40; //左轮
CCAP1H=0x00; //右轮
P3=go;
}
else if(bj1>1&&bj1<4/3) //微左拐
{
CCAP0H=0x22; //左轮
CCAP1H=0x00; //右轮
P3=go;
}
else if(bj2>1&&bj2<4/3) //微右拐
{
CCAP0H=0x00; //左轮
CCAP1H=0x18; //右轮
P3=go;
}
else if(bj2>4/3) //强右拐
{
CCAP0H=0x00; //左轮
CCAP1H=0x35; //右轮
P3=go;
}
}
void PWM()
{
CCON=0;
CL=0;
CH=0;
CMOD=0X02;
CCAP0H=CCAP0L=0X80;
CCAPM0=0X42; //允许比较器功能、PWM脉宽输出
CCAP1H=CCAP1L=0X80;
PCA_PWM0=0x00; //组成9位P1.3
PCA_PWM1=0x00; //组成9位P1.4
CCAPM1=0X42;
CR=1; //启动PCA计数器阵列
}