1、一、设计任务及要求以AT89C51单片机为核心,采用霍尔传感器,实现对自行车行驶里程、速度的测量,并能选择显示自行车行驶里程值和当前速度。可以实现对自行车车轮大小的设置等。自行车超过一定限速时可以进行声光报警提示。关键词:AT89C51单片机;光电传感器;液晶显示器;存储器二、电路原理T0用于对轮子圈数的计数输入,轮子每转一个间隔(即假设的每个间隔0.1米),霍尔传感器输出一个低电平脉冲。T0就计数一次,如果计够1000次(即0.1Km)就送液晶显示屏;T1设置为独立的计数器,当T1定时1秒到来时进入中段程序,中断程序中关闭计数器T0,读出它记脉冲的个数n,用n乘以0.1即此时车的速度(以为是
2、每一秒读一次),将此时的速度送至液晶并显示出当前的速度值,电路如图1所示。P0口用于液晶的描输出。P2.0口和P2.1口用于控制液晶的写命令和写数据操作,P2.2和P2.3口分别用于显示当前车行驶速度是否超过设定值(当绿灯亮时表示车速正常,当绿灯灭,红灯一闪一闪时表示车速超过设定值),P3.4(即T0)口用于接收由基尔霍夫传感器经信号处理电路处理后的脉冲个数。根据它每秒所计脉冲个数计算车当前速度和车行驶的里程。三、硬件系统设计以AT89C51单片机为核心,A44E霍尔传感器测转数,实现对自行车里程、速度的测量统计,并将自行车的里程数及速度用液晶显示屏实时显示。利用霍尔元件将自行车每转一圈的脉冲
3、数传入单片机系统,然后单片机系统将信号经过处理进行编程。1、芯片的选择AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C51单片机可为您提供许多较复杂系统控制使用场合。AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,1个全双工串行通信口,2个读写口线,AT89C
4、51可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。AT89C51有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。功能特性AT89C51提供以下标准功能:8字节FLASH闪速存储器,256字竹内部RAM , 32个I/O口线,2个16 位定时计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89c51可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。空闲方式停止CPU 的工作,但允许RAM,定
5、时计数器。串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。2、结构框图结构框图指示灯部分功能:显示车速是否正常或超过设定值。里程、速度测量电路部分功能:速度及里程传感器采用霍尔传元件,实现对自行车里程及速度的计算。显示部分功能:速度、里程用液晶显示屏动态扫描显示,由P0口送出段码和位选信号。四、软件系统设计1、初始化程序:在本系统初始化程序中,主要完成以下工作:初始化液晶(即写1604的驱动程序);将T0设置为计数器;将T1设置为定时器。开T0,T1。2、主程序:主程序根据1秒钟T0所计的脉冲个数计算出车当前的速度和里程。3
6、、里程计数程序(T0计数程序):T0计数器用于对输入的圈脉冲进行计数,为十六进制计数器。60H为低位,62H为高位。每秒钟读取它所计脉冲的个数,当它所计脉冲个数累计到1000次时,让液晶显示一次里程。4、T1定时服务程序:T1定时为1秒进一次中断程序,中断程序中执行关计数器T0,读T0每秒中所计脉冲的个数,根据个数算出速度,并累加里程 5、显示子程序:当显示里程时, 先要对里程累计的数据进行判断,当计够1000次时总里程加1(km)。当要显示速率时,每秒显示一次,即每秒读一次T0所计的脉冲个数,根据此个数乘以车轮每2个小孔的最小间距0.1米,即得车当前的速度五、控制系统源程序:#include
7、#define uchar unsigned char#define uint unsigned intuchar code cs=SPEED: 00.0 m/s;uchar code lc=TOTAL: 00000.0Kmuchar code ts=Pleasant Journeysbit RS=P20;sbit E=P21;sbit D=P10;sbit LD=P22;sbit HD=P23;uchar num,count,timecount,T0count,miao,fen,shi;uint total,num1,num2,Gtotal,Ztotal,Dtotal=0,speed;voi
8、d delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;yy-);void write_com(uchar _com) RS=0; P0=_com; delay(1); E=1; delay(2); E=0;void write_data(uchar _data) RS=1; P0=_data;void init_LCD()/16*4液晶 write_com(0x38);/设置显示模式 write_com(0x0c);/开显示,不显示光标,不闪烁 write_com(0x06);/光标自动加1,整屏不移动 write_com(0x01);/清屏 w
9、rite_com(0x80);/设置数据指针 for(num=0;num=1000)/1000格即100米 Ztotal+; if(Ztotal=999) Ztotal=0; Gtotal+; if(Gtotal=999) Gtotal=0; display_Gtotal(0x07,0x08,0x09,Gtotal); display_Dtotal(0x0a,0x0b,0x0d,Ztotal); void init_timer() TMOD=0x15;/(00010101)设置T1为16位定时器,T0为16位计数器 TH0=0; TL0=0; TH1=(65536-50000)/256; TL
10、1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1;void main() init_LCD(); init_timer(); while(1)void count0() interrupt 1 T0count+;void timer1() interrupt 3 timecount+; num2=T0count*65536+TH0*256+TL0; if(timecount=20) TR0=0; num1=T0count*65536+TH0*256+TL0; speed=num1; /假设车轮周长为1米,均匀开11个孔,则每个孔0.1米 if(speed130) HD=0; delay(30); HD=1; else LD=0; Dtotal=Dtotal+speed; write_speed(speed); if(Dtotal=1000) judge_total(Dtotal); Dtotal=0; timecount=0; TH0=0; TL0=0; TR0=1; TR1=1; 五、仿真结果参考文献1单片机使用原理2数字电路3摸拟电路