由于仿真中没有霍尔传感器,实际呢霍尔就是感应磁信号,输出高低电平的脉冲信号,这样用脉冲就可以了,不同的频率代表电机转速的快慢
制作出来的实物图如下:
自行车码表元件清单
1) 9*15万用板
2) AT89C51单片机
3) 40脚IC座
4) 1602液晶
5) 16p母座
6) 16p排针
7) 10k电阻
8) 1K电阻
9) 轻触按键
10) 5MM LED灯(红色)
11) 103电位器
12) 3v直流电机
13) 直流电机底座
14) 磁铁*2
15) 501电位器
16) 3144霍尔传感器
17) 10uf电解电容
18) 30pf瓷片电容*2
19) 12M晶振
20) 自锁开关*2
21) DC电源插口
22) 导线若干
23) USB电源线或电池盒
单片机源程序如下:
#include #define uchar unsigned char #define uint unsigned int sbit COUNT_IN=P3^2; //定义1602相关管脚 sbit rs=P2^7; sbit en=P2^6; uint count; unsigned long Velocity,Mileage; bit flag; uchar code tab1[]={" Speed: km/h"}; uchar code tab2[]={"Mileage: . km"}; void delay(uint x) { uint i,j; for(i=0;i } void init() { IT0=1; //INT0负跳变触发 TMOD=0x01;//定时器工作于方式1 TH0=0x3c; //50ms TL0=0xb0; EA=1; //CPU开中断总允许 ET0=1;//开定时中断 EX0=1;//开外部INTO中断 TR0=1;//启动定时 } /********液晶写入指令函数与写入数据函数,以后可调用**************/ void write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令 } void write_1602dat(uchar dat)//***液晶写入数据函数**** { rs=1;//数据/指令选择置为数据 P0=dat;//送入数据 delay(1); en=1; //en置高电平,为制造下降沿做准备 delay(1); en=0; //en由高变低,产生下降沿,液晶执行命令 } void lcd_init()//***液晶初始化函数**** { uchar a; write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<16;a++) { write_1602dat(tab1[a]);//向液晶屏写固定符号部分 } write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<16;a++) { write_1602dat(tab2[a]);//写显示固定符号 } } void display() { // 1km/h=100m/0.1h 360s // 10km/h=100m/0.01h 36s // 100km/h=100m/0.001h 3.6s write_1602com(0x80+9); if(Velocity/100==0) write_1602dat(' '); else write_1602dat(0x30+Velocity/100); if((Velocity/100+Velocity%100/10)==0) write_1602dat(' '); else write_1602dat(0x30+Velocity%100/10); write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码 write_1602com(0x80+0x40+8); write_1602dat(0x30+Mileage/1000000);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+Mileage%1000000/100000);//数字+30得到该数字的LCD1602显示码 write_1602com(0x80+0x40+11); write_1602dat(0x30+Mileage%100000/10000);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+Mileage%10000/1000);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+Mileage%1000/100);//数字+30得到该数字的LCD1602显示码 } void main() { init(); lcd_init(); while(1) { display(); } } void EXINT0() interrupt 0 { count++; } void time0() interrupt 1 { uchar m; TH0=0x3c; TL0=0xb0; //50ms m++; if(m>=10) { m=0; Mileage=Mileage+Velocity*500/36; //里程m=速度km/h*1000*5/3.6 Velocity=count/5;//将100ms内的脉冲数 count=0; } }
上一篇:51单片机驱动触摸屏综合实验源程序
下一篇:增量式pid控制 单片机源程序
推荐阅读最新更新时间:2024-11-12 13:59
设计资源 培训 开发板 精华推荐
- Keysight教你如何提高测试精度,答对问题还有礼品相送,速速参与!
- 扒一扒KEYSIGHT频谱分析仪
- 开学季!EEworld下载中心 Cortex主题资源上传
- 【有奖问答】MOSFET,选型我在行!
- 有奖直播:艾迈斯欧司朗智慧农业与植物照明
- 有奖直播:现代电动工具的设计挑战与英飞凌解决之道
- 2018开“芯”学:Mentor两场知识有奖问答邀你新年充电
- 围读 《嵌入式软件的时间分析》——汽车行业领域的嵌入式软件理论、分析及实践
- Follow me第2期来袭,与得捷一起解锁开源硬件 Adafruit ESP32-S3 TFT Feather!
- 有奖直播:【瑞萨电子推出针对血糖仪应用的内置模拟前端的RL78/L1A系列微控制器】