一.硬件方案
以 51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 数码管实时显示自行车的里程数及速度。利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。
主要由51单片机+最小系统+霍尔传感器+数码管+三极管+lm393+LED指示灯模块+按键;如图:
二.设计功能
(1)51单片机作为控制核心,驱动显示模块,驱动按键模块等,并利用霍尔传感器与磁铁获取脉冲信号。
(2)4位共阳数码管为速度,距离显示模块,速度单位为 km/h,距离单位是 km。
(3)设有一个按键来切换显示速度和距离。
三.设计原理图
原理图主要采用AD软件进行设计,如图:
四.软件设计
(1)程序流程图
(2)主程序源码
//====================================主函数=========================================================
void main()
{
time0_int0_init();//定时器0和外部中断0的初始化
while(!TR0) //上电一直未切割时就显示 0.0.0.0
{
init_display();
}
while(1)
{
if(!change)//按下切换按键显示里程
{
delay1m(5);
if(!change)
{
flag = ~flag;
}
while(!change);
}
}
}
//==================================定时器0中断函数================================
void time0_interrupt()interrupt 1
{
TL0 = (65536 - 5000) % 256;// 12M晶振,5ms定时
TH0 = (65536 - 5000) / 256;
display_function();
time_counter++;
time_counter8++;
if(time_counter8 >= 1600)//大于8s没切割,车子视为停下了,速度为:0,但里程还记着
{
time_counter8 = 0;
speed = 0;//速度为 0
point1 = 0;
buf1[3] = speed%10;buf1[2] = speed/10%10;
buf1[1] = speed/100%10;buf1[0] = speed/1000%10;
}
}
//==================================外部中断0中断函数=========================
void int0_interrupt()interrupt 0
{
external_counter++;
if(external_counter ==1 )TR0 = ~TR0;//第一次切割打开定时器0
if(external_counter == 65535)external_counter = 0;
time_counter8 = 0; //只要8秒内有切割,车子就任在运行
if(external_counter % 2 == 0)//切割2次 更新下速度
{ //*5是因为中断一次是5MS
if(flag1==0){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}
else if(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(time_counter * 5);}//速度:单位为 m/h ,*1000的目的是不出现浮点数
if((speed >= 100)&&(speed < 1000)) //100 ---- 1000 3位整数
{
point1 = 1;buf1[3] = speed%10;buf1[2] = speed/10%10;
buf1[1] = speed/100%10;buf1[0] = 0;}
else if((speed >= 1000)&&(speed < 10000)) //1000 ---- 10000 4位整数
{
point1 = 1;speed = (uint)speed;
buf1[3] = speed%10;buf1[2] = speed/10%10;
buf1[1] = speed/100%10;buf1[0] = speed/1000%10;}
else if((speed >= 10000)&&(speed < 100000)) //10000 ----- 100000 5位整数
{
point1 = 2;
buf1[3] = speed/10%10;buf1[2] = speed/100%10;
buf1[1] = speed/1000%10;buf1[0] = speed/10000%10;}
else if((speed >= 100000)&&(speed < 1000000)) //100000 ------ 1000000 6位整数
{
point1 = 3;
buf1[3] = speed/100%10;buf1[2] = speed/1000%10;
buf1[1] = speed/10000%10;buf1[0] = speed/100000%10;}
time_counter = 0;
}
if(external_counter % 8 == 0)//每切割8次 更新下里程
{
s = (ulong)external_counter * zhouchang; //里程:单位为 cm
if((s >= 1000)&&(s < 10000))
{
point2 = 1; // 0.012 001212
buf2[3] = s/100%10;buf2[2] = s/1000%10;
buf2[1] = 0;buf2[0] = 0;}// 4位整数
else if((s >= 10000)&&(s < 100000))
{
point2 = 1;
buf2[3] = s/100%10;buf2[2] = s/1000%10;
buf2[1] = s/10000%10;buf2[0] = 0;}// 5位整数 0.123 012345
else if((s >= 100000)&&(s < 1000000))
{
point2 = 1;
buf2[3] = s/100%10;buf2[2] = s/1000%10;
buf2[1] = s/10000%10;buf2[0] = s/100000%10;} // 6位整数 1.234 1234 56
else if((s >= 1000000)&&(s < 10000000))
{
point2 = 2;
buf2[3] = s/1000%10;buf2[2] = s/10000%10;
buf2[1] = s/100000%10;buf2[0] = s/1000000%10;}// 7位整数 1234 567
else if((s >= 10000000)&&(s < 100000000))
{
point2 = 3;
buf2[3] = s/10000%10;buf2[2] = s/100000%10;
buf2[1] = s/1000000%10;buf2[0] = s/10000000%10;} // 8位整数 1234 5678
}
}
上一篇:基于51单片机的智能灯光控制系统
下一篇:基于51单片机的温度+烟雾报警系统设计
推荐阅读
史海拾趣
E-San Electronic Co Ltd的创始人李明,在电子科技行业摸爬滚打多年后,决定创立自己的公司。创业初期,公司面临着资金短缺、技术瓶颈和市场竞争激烈的挑战。李明凭借对电子技术的深刻理解和敏锐的市场洞察力,带领团队成功研发出了一款具有创新性的电子产品,并成功打入市场。这款产品以其高性价比和稳定的性能赢得了消费者的青睐,为公司带来了第一笔可观的收入,也为后续的发展奠定了坚实的基础。
格瑞宝公司致力于功率器件的研发与销售,其产品线不断丰富和完善。从最初的MOSFET产品系列,到后来逐渐扩展到DIODE、BJT、IC集成电路等多个领域,格瑞宝始终坚持技术创新,不断推出符合市场需求的新产品。特别是在SGT MOST工艺方面,格瑞宝达到了国内领先水平,这一技术突破不仅提升了产品的性能和质量,也进一步巩固了公司在行业内的地位。
在稳固了国内市场后,ECC开始积极拓展国际市场。他们参加了多个国际电子展会,展示了公司的技术和产品。通过与国际客户的交流与合作,ECC逐渐打开了国际市场的大门。同时,ECC还与国际知名电子企业建立了长期合作关系,共同研发新产品、开拓市场。这些举措使得ECC在国际市场上的知名度不断提升。
自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。
随着产品的不断成熟,常州能动开始积极拓展市场。公司参加各类电子展会,与国际知名企业建立合作关系,不断提升品牌影响力。同时,公司还加大了对市场营销的投入,通过广告、公关等手段提升品牌知名度。这些努力使得常州能动逐渐在电子行业中崭露头角,成为了一家备受瞩目的企业。
串口通讯问题 我使用ADS7886做模数转换,但结果总死在第一个 while(!(IFG2 & UCA0RXIFG))这里了。。 麻烦哪位高手帮下忙,万分感谢!!! void init_spi() { P3DIR |=0X41; P3SEL |=0X21; UCA0CTL0 |=UCMSB+UCMST+UCSYNC;//3线8位spi UC ...… 查看全部问答∨ |
|