电动车霍尔转把检测程序_第1页
电动车霍尔转把检测程序_第2页
电动车霍尔转把检测程序_第3页
电动车霍尔转把检测程序_第4页
电动车霍尔转把检测程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电动车霍尔转把检测程序

〃转把电压控制,10端II电压最大是5V,STM是8位AD采样最大可达2的8次等于255〃根据5V

对应于255相应算出

//4.IV对应于210:

//I.5V对应于77;//0.9V对应于46:

//0.2V对应于11;*include<STC12C52.H>

#include<mtrins.h>typedefunsignedmtWORD;

unsignedcharTime」ms=0;"InisTiuielOnis=0;"10msTime_50ms=Oy/50msTinie_500ms2

unsignedchai0;//500nisTime_500ms=0;/Z500inswaitmg5vork_flag=0;〃等待工作标志

unsignedchaialaim_flag=0;〃报警标志state=O;〃工作状态标志state_400ms=0;//400ms

unsignediiitliandeibaiAD=0;〃转把采样数据key=0;〃按键key_count=0;//按下次数

unsignedchaif】ag=0;〃转把插入标志,等待转把转动

unsignedchar

vcidunsignedchaiImjCLK(void);〃初始化函数

vcidunsignedchailnit_isi_ll(void);//定时器初始化函数

vcidunsignedmtimt_isi_tO(void);〃定时器初始化函数

vcidunsignediiitisr_tl(void);

vcidunsignedcharImcADC(void);//adc初始化函数

vcidunsignedchaiwaitiiigwork(void);

vcidunsignedchaihaiideibar_rotate(void)y/转把转动函数

vcidadsample(void)y/ad采样函数

//voidliiitTiinc1PWM(voic);//pwm初始化函数

vciddelayluis(inta);//lins延时函数

vcidDelay(WORDn);

vcidImt_PWM0(v0id);

vcidImtPWM0(void)APWM0初始化函数

CC0N=0,

CM0D=0x04;/7T0溢出做为PWM时钟

CL=0x00,

CH=OxOO;

CCAPOL=OxBA,

CCAPOH=OxBA;

CCAPM0=0x42;

〃CR=1;到报警时去起动P3,、5IIPWMO输出voidInitCLK(void)〃端II及ALXR初始化函

//000:fCPU=fMASTER

HCLK_CKDIVR&=-0x10;

//io11初始化

AUXR=Ox80?7定时器O-1T>定时器2-12T

P1M1=0x03;〃0b00000011;〃P1"0为开漏.P『l为准双向,其余为推挽输出;

PC_DDR-OxOO;//PC端11输入

P!MO=OxFD://Ob11111101;0XFD

PlASF=0x01;//PlII为摹拟功能

仰1端口置初值

Pl=0x03;//0b000000U;/.<P1AOADTl'l为按键,P—2为红灯丫1人3为第二绿灯,P10为第

1绿灯,PF5为接通三极管,p卜6为报警;PC_DDR|=Oblllllill;

//PD端[I3,4,5,6位为输入,PD其他端1I为输出

//PD_[)DRI-Ob10000111;

P3Ml=Ox7F;

P3M00x80;

P3=0x00;

〃PCCR1=OXFF;〃推挽输出

//PD.CR1=0bl00101U〃3,5,6位悬浮输入,4为上拉输入

〃端口清零

Z/PC0DR_0DR4=0,〃红灯

//PCODR.0DR5=0;〃第二绿灯

//PC0DR_0DR6=0,"第一绿灯

〃5201-13.25MHz.8MHz,定时Inis;voidIinl_isr_ll(vmd)〃定时器1初始化函数

Timelms=0;

TR1=O;

TM0D=0X10;

TH1=OXFB;

TL1=OXB1;

EA=1;

ET1=1;

TR1=1:〃起动定时器

//TIM<CRl=OxOO:

〃TTM4_IER=0x01;//UpdateIntemiptenabled

//TIM4_EGR=OxOO;

//TIM4_PSCR=Gy/G4分频〃TIM4_ARR=125,

7TIM4ARR=250;

//T1M4_CR1|=0X0iy/cen=1:打开定时器

vcidiniCisi-tO(void)〃定时器0初始化函数做为PWMO的时钟

TROO;

™0D=0x020x10;

THOOxCB;//THO=OxFB;

TH0=0xCB;/.<TH0=0xFB;

/7TR0=l;

)

voidhut_ADC(void)//ADC初始化

(

/\DCDATA=0;

ADC_CONTR=ADC_POWERADC_SPEEDLADC_CHSO;

Delay(2);

}

//voidliiitADC(void)

〃(

//ADCCSR=0x00;»选择通道

///ADCCRl=0x00;.,fADC=INIASTER2

//ADC_CR2=0x08;"数据右对齐Z/ADC_CR1|=0x0iy/打开ADC电源

〃)

//voidImtTimH_PWM(vmd〉7蜂鸣器初始化函数,2k的PWNI方波

//{

//cen=0;Auto-reioadpreloadenable;Counterusedasup-counter

HTIMl_CRl=0x80;

//TIM1CR2=0x00;//Capuire/compaiclegisteiaicnotpieloadcd

//TIM1_RCR=0x00;々Repetitioncountervalue0;

//Tnn_PSCRH=0X00;〃2分频。必须先写高位,再写低位

//TM1_PSCRL=OXO1;

//

〃装载值为2000

//TIM1_ARRH=0X07;

//TIMl_ARRL=0Xd0;//pwm频率2k

//TIM1_CCMR1=0X00;//0C1M:onCC1S:输出

//TIM1CCMR2=0x00;/70CIM:OilCC1S:输出

//TTM1CCMR3=0x68://0ClM:OilCC1S:输出

IlTIMl_CCER2=0x00;

//TM1_CCER1=0x00;

//TTMl_CCR3H=0X03;〃必须先写高位.再写地位

//TIMl_CCR3L=0Xe8//占空比为50%

//TIMl_DTR=0x00;〃死区时间

//TIMLBKR1=0x80〃打开输出使能

//TIM1CR1|=0x0W/cen=l;打开定时器

//

//)

vcidadsample(void)//AD采样

(

staticunsignedinta=0;

,/staticunsignedintb=0j/staticmisignedmtb=0:

AE€_CONTR=ADC_POWER|ADC_SPEEDI.|ADC_CHS01ADC一START;,7ADC_CONTR=OXA

8

_nop_();

_nop_();

_nop_();

_nop_();

while(!(ADC_C0NTR&ADJFLAG));

〃ADC_C0NTR&=、AD0_START;〃关AD转换

ADC_CONTR&6ADC_FLAG;〃j青AD转换结束标志

ADC_C0NTR=ADC_C0NTRADC_ST/\RT;//ADC_C0NTR=0XA8_nop_();

_nop_();

_nop_();

_nop_():

while(!(ADC_C0NIR&ADC_FLAG));

"ADC_C0NTR&=>ADC_START,〃关AD转换

ADC_C0NTR&二、ADJFLAG;〃清AD转换结束标志

〃AD采样,判断电压是否升高

〃选择通道AIN4

!iSET_Channel(ADC_CSR4);

//ADC.CR1|=OxO1小启动g采样

//while(ADIS_0K);/Z采样结束

//ADENDFLAGO;//AD采样标志位清零

//ADC_CR1|=0x0iy/启动AD采样

//while(ADISOK);//采样结束

//ADENDFLAGQ;〃AD采样标志位清零

〃对采样到的数据进行流波

iRa>ADC_DATA)

(

〃当原数据比当前数据大5以上,当做颤动处理,否则计数谊(a-

ADCDATA)<2)

(

haiidcibaiAD=ADCDATA;

)

a=ADCDATA,

elseif(a<=ADCDATA)

〃当前数据比原数据大5以上,当做颤动处理,否则计数1R(ADC_D

ATA-a)<=2)

(

haiiderb2iAD=ADCDATA;

)

a=ADC_DATA;

〃定时器I中断服务程序

vcidisrtl(void)inrermptT1INTNO

{

TH1=OXFB*TH1=OXFB;〃重置初值TLi=0XB1;//TL1=OXAF;〃重置初值

Time_lms=l;〃置1ms到标志

//@fai©mtemiptvoidTIME4ISF(void)

//(

//TlM4_SR&="(0x01);

//Tiine_liiis=1;

)

voidDelay(WORDn)〃延时函数

(

WORDx;

while(n-)

(

x=5000;

wlule(x-);

}

〃主函数

unsignedchaib=0

unsignedchara=0

unsignedchaic=0

unsignedchaid=0

unsignedchare=0

unsignedchaif=0;

unsignedcharg=0;

unsignedchai1=0;

〃初始化

//DisablelSR;

Imt_CLK();〃端II初始化

hut_isr_tlO:〃定时器1初始化,名称不一定要与中断服务程序相同Init_ADC0:〃ADC

初始化

//

TR1=1;〃启动定时器

Imt_PWM0();//1_PWMO;

//EnablelSR;

X\DT_C0NTR=0x20y/C动看门狗并清零看门狗定时器

while(1)

P15=l;〃三极管导通

waitingworkf1ag=1;

if(Tune_1ms)//lms时间片

(

WDT_CONTR=Ox10;〃清零看门狗定时器

Tiine_lms=0;

Time50nis++;

Tiine_10nis"+;

Tiiiie_500nii;2++;

if(Tinie500ms2++>=500)//程序运行指示

(

Time5C0ms2=05

Pl7717;

)

if*401>state_400ms&&state_400ins>0)

(

state_400ms++;

iHTinielOnis>=10)

TiinelOnis=0;

adsampleQ//AD采样

*******

Lf(waituig\voik_flag=!&&state=0)〃转把插入状态,插入

flag=0;

//0.2丫<转把电压vi.OV第一绿灯亮,0.2V

//0.2V对应于41,0.9V对应186

if(lumderbaiAD>11&&handerbarAD<=46)

〃第一绿灯亮

a++:

b=0;

if(a>=30)

a=0;

g==0)

pi4=iy/点亮一绿灯

stare=1;

elseif(1ianderbarAD>46)

(〃大于0.9v红灯亮

//ied_flag=l;

b++;

a=0;

if(b>=50)

b=0;

P12=l;〃点亮红灯alarm_flag=1;〃置报警

状态标志

)

elseif(liandeibarAD<=l〃/.,小于0.2V灯不亮

a=0;

b=0,

state_400ms=0;

Pl2=0;

Pl3=0;

P14=0;

alarmriag=O;

CR=0;//TTM1_CCER2=OXOO;

Pl6=0;

elseif(\vaitiiig\vorkflag=!&&state=1)〃转把转动状

if(liandeibaiAD〈=ll)〃如果转动时蓦地拔掉,跳入插入状

state=O

t

elseif(state_400ms<400&&state_400ins>0)

if(hauderbarAD>=210)

//当state_400ms小于0.5s,

handerbai-AD大于4.IV

//846对应于4.IV

牡+;

c=0:

d=0;

iRf>=10j

仁0;

state400ms=0;

P13=l;

〃PC0DR_0DR5=l;〃第二绿灯亮

Pl2=0;"

PC0DR_0DR4=0;//关红灯

CR=O;//Pl6=0

〃TlMl_CCER2=OxOO,〃关报警

P16=0:

elseif(haiiderbarAD<210)

{仁0:}

〃当state400nis大于0.5s,转把还没达到4.IV

elseif(state_400ins>=400)

if(handerbaiAD<210)

{

C++;

if(c>=10)

(

c=0;pi2=iy/

PC3DR_0DR4=1;〃红灯亮

CR=〃TIMi_CCER2=0x01;〃蜂鸣器报警

TRO=1;

P16=l;

)

else

if(handerbaiAD>210)

{c=0;}

//1.5V对应77(310);

elseif(handerbarAD>=77〉7当转把AD电压大于1.5V,开

始0.5秒jishi

(

d++;

iftflag-0&&d==10)〃转把插入与

d=10

(

d=0,

flag=1;

state400ms=1;

elseif(handerbaiAD<7/?//当小于L5V,将d清零{

d=0:

〃按键处理

key=P11;//key=PDIDRIDR4;

氓key==0;

key_count++;

iRkey_2oiuit>=3)

j

key_count=0;

if(key=0)

f

state=0;

state400nis=0;

Pl1=0;//PC0DR_0DR4=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论