51单片机设计霍尔+振动+STC89C52.docx
- 文档编号:2990108
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:18
- 大小:121.77KB
51单片机设计霍尔+振动+STC89C52.docx
《51单片机设计霍尔+振动+STC89C52.docx》由会员分享,可在线阅读,更多相关《51单片机设计霍尔+振动+STC89C52.docx(18页珍藏版)》请在冰豆网上搜索。
51单片机设计霍尔+振动+STC89C52
//多功能自行车防盗报警器(STC89C52+霍尔传感器+振动传感器)
//功能:
自行车转速+自行车行驶里程+安全行驶速度设置及报警+震动防盗报警【1602LCD显示+蜂鸣器声音报警+按键操作】
//本程序为为个人DIY设计,硬件,下位机,及上位机(为附带部分,其实下位机硬件可独立实现及操作所有功能)
//完成效果:
利用小电机加自制小圆盘代替自行车车轮,小磁钢使用502胶水固定圆盘表面,//霍尔传感器与磁钢垂直固定(距离不要太远,以转动时接触不到为宜),可9V方块电池供电//也可DC接口供电。
//注意:
最后有详细说明哦
//J,本人将原理图,PCB,截图给大家,上下机程序,在此贴出,共同学习,如还有不明//白或需要相关资料可Email我!
//Email:
liangyongbo123@
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_DBP0//1602数据口
#defineMAX6
ucharflag,a;
ucharflag_com=0;//flag--串口发送数据标志
uchartemp[120]={0};
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
sbitkey4=P1^4;
sbitLED_green=P2^1;//绿指示灯
sbitLED_red=P2^2;//红指示灯
sbitLCD_RS=P2^5;
sbitLCD_RW=P2^6;
sbitLCD_E=P2^7;
sbitsafe=P2^3;
sbitalert=P2^0;
voidint0_init();
voidspeed();
voidspeed_1602();
voiddistance();
voidcom_data();
ucharkey_scan();
voidLCD_init(void);
voidLCD_write_command(ucharcommand);
voidLCD_write_data(uchardat);
voidLCD_disp_char(ucharx,uchary,uchardat);
voidLCD_disp_string(ucharx,uchary,uchar*str);
voidcheck();
voiddelay(uintz);
voidAlert_sound(void);
voidSafe_Mode();//安全防盗模式设置
voidSET_R();//车轮半径模式设置
voidSET_High_speed();//最高速度模式设置
voidBegin_Bike();//测速,计里程程序
ucharkey=10;//按键初始状态
uintradius=0;
uinthighspeed=0;
uintcounter=0;
uintnum_int0=0;
uintv_motor=0;
uinttime_s=0;
uintsum_motor=0;
voidmain()
{
P0=0xFF;
P1=0xFF;
P2=0xFF;
alert=0;
LCD_init();
while
(1)
{
LCD_disp_string(0,0,"[LiuBike]");
LCD_disp_string(0,1,"Welcom");
delay(1500);
LCD_disp_string(0,1,"PLEASESET:
R");//R=
while(key!
=3)//等待自行车车轮半径设置,强制设置
{
key=key_scan();
}
SET_R();
LCD_disp_string(0,1,"PLEASESET:
High");//High=
while(key!
=4)//等待最高速度设置,强制设置
{
key=key_scan();
}
SET_High_speed();
flag=1;
while
(1)
{
if(flag==1)//测速,计里程,程序模块
{
LED_green=0;//进入此模块,绿灯闪一下
speed_1602();
delay(1000);
Begin_Bike();//如果在测速过程中,有按键按下,则flag==2
}
if(flag==2)//当在测速过程中,有按键操作,就执行按键相应动作,按键操作结束,flag=1,返回测速
{
LCD_init();
LCD_disp_string(0,0,"[LiuBike]");
LCD_disp_string(0,1,"Welcom");
delay(1500);
SET_R();//按键操作设置
SET_High_speed();
Safe_Mode();
flag=1;
}
}
}
}
//外部中断0中断程序
voidexint0()interrupt0
{
num_int0++;
}
//定时器0中断程序
voidtimer0()interrupt1//定时50ms
{
TH0=0x4c;
TL0=0x00;
counter++;//重复20次,表示共定时1s
}
//串口中断程序
voidser()interrupt4
{
RI=0;
a=SBUF;
if(a==0xaa)//上位机发送aa指令后,开启串口通信模式,将自行车运行信息发送到上位机
{
flag_com=1;//接收到上位机的开始采集指令,给出采集标志flag=1
}
if(a==0xbb)
{
flag_com=0;
}
}
//以下为系统调用子程序
voidint0_init()
{
EA=1;//开总中断
EX0=1;//开外部中断0
ET0=1;//开定时器T0中断
IT0=1;//外部中断负跳变触发
SCON=0x50;//串口工作在方式1
TMOD=0x21;//GATE=0,定时/计数器启动与INT0无关,C/*T=0,定时器模式工作方式1
TH0=0x4c;//12M时钟,50000-----3caf对应50ms,11.0592M时钟,46080----4c00---对应50ms
TL0=0x00;
TR0=1;//启动定时T0
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;
ES=1;
}
voidcom_data()//通过串口向上位机传送数据
{
uintk;
temp[0]=time_s;//传送数据数组,共发送5个数据
temp[1]=radius;
temp[2]=highspeed;
temp[3]=v_motor;
temp[4]=sum_motor;
temp[5]=sum_motor>>8;
for(k=0;k { ES=0;//关闭串口中断,开始传送数据 SBUF=temp[k]; while(! TI);////发送中断标志位,当有数据发送时,TI保持为0,发送完成后TI自动变为1 TI=0;//TI=1(此时信道空闲)才可以发送数据 ES=1;//数据传完再次打开串口中断 } } voidspeed() { if(counter==20)//重复20次,表示共定时1s { v_motor=num_int0;//对脉冲计数 time_s++; distance(); speed_1602(); if(flag_com==1)//开启串口通信模式,在调试助手中发送''aa'' { com_data();//开始传送数据,将MAX个数据从ad_data[]数组中取出,发往上位机 } num_int0=0; counter=0; LED_green=0; } else { speed_1602(); } } voidspeed_1602() { LCD_disp_char(0,0,'R'); LCD_disp_char(1,0,'='); LCD_disp_char(2,0,''); LCD_disp_char(3,0,0x30+radius/100); LCD_disp_char(4,0,0x30+radius%100/10); LCD_disp_char(5,0,0x30+radius%100%10); LCD_disp_char(6,0,'c'); LCD_disp_char(7,0,'m'); LCD_disp_char(8,0,''); LCD_disp_char(9,0,'V'); LCD_disp_char(10,0,'h'); LCD_disp_char(11,0,'='); LCD_disp_char(12,0,''); LCD_disp_char(13,0,0x30+highspeed/100); LCD_disp_char(14,0,0x30+highspeed%100/10); LCD_disp_char(15,0,0x30+highspeed%100%10); LCD_disp_char(0,1,'L'); LCD_disp_char(1,1,'='); LCD_disp_char(2,1,''); LCD_disp_char(3,1,0x30+sum_motor/10000); LCD_disp_char(4,1,0x30+sum_motor%10000/1000); LCD_disp_char(5,1,'.'); LCD_disp_char(6,1,0x30+sum_motor%10000%1000/100); LCD_disp_char(7,1,'k'); LCD_disp_char(8,1,'m'); LCD_disp_char(9,1,''); LCD_disp_char(10,1,'V'); LCD_disp_char(11,1,'='); LCD_disp_char(12,1,''); LCD_disp_char(13,1,0x30+v_motor/100); LCD_disp_char(14,1,0x30+v_motor%100/10); LCD_disp_char(15,1,0x30+v_motor%100%10); } voiddistance() { sum_motor+=v_motor*1*2*3.1415926*radius/100;//radius=5 } voidLCD_init(void) { LCD_write_command(0x01);//清屏 delay(100); LCD_write_command(0x38);//8位数据传送
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 设计 霍尔 振动 STC89C52
![提示](https://static.bdocx.com/images/bang_tan.gif)