完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
背景介绍
(这是本人第一次写博客,会有一些牢骚,我保证以后不会这么废话了)。本人做为一名大三学生,这个学期在学长的建议下选修了单片机课程。老师要求完成一篇大作业(三选一),我就选择了最简单的车速里程表的设计。至于我为什么要写这篇博客,是因为我在网上找到相关的资料时(类似于霍尔传感器的车速里程表设计),但是CSDN上的整个项目的源代码都要付费查看,于是我很气愤,遂有此文。 备选的三个题目 因为目测题目二最简单,所以我就选了题目二。 脉冲波部分(单片机模拟信号发生器) 由于老师实验室一下子找不出来信号发生器,所以我找同学借了一个单片机作为信号发生器,用跳线连接信号发生器的P37引脚和车速里程表的P35引脚(老师因此还表扬了我)。 源代码1 #include "reg51.h" #include "intrins.h" typedef unsigned int u16; typedef unsigned char u8; ***it pulse = P3^7; //用p37引脚发出脉冲 void Time0Init() //中断初始化函数 { TMOD |= 0x01; TH0 = 0xfc; TL0 = 0x18; //中断定时1秒 ET0 = 1; EA = 1; TR0 = 1; } void main() { Time0Init(); while(1); //无限循环,等待中断 } void Time0() interrupt 1 { pulse = ~pulse; } 接收端主程序 基本思路 引用一个定时器和一个计数器(我的单片机是通过p35引脚输入的,不同的单片机可能不同),定时一秒钟,计算这一秒钟内接收的脉冲个数,乘以一个系数即可得到速度(根据题目描述可计算得这个系数为1,单位为km/h),对速度进行累加即可得到里程。 源代码2 /*车速里程表项目输入:信号模拟器产生脉冲,通过引脚P35接入单片机功能:显示车速,通过按键k1控制显示单次里程与总里程的切换,通过k2长按将单次里程清零 /* 车速里程表项目 输入:信号模拟器产生脉冲,通过引脚P35接入单片机 功能:显示车速,通过按键k1控制显示单次里程与总里程的切换,通过k2长按将单次里程清零 */ #include "reg52.h" #include "intrins.h" typedef unsigned int u16; typedef unsigned char u8; typedef unsigned long int ul; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; ***it k1=P3^1; ***it k2=P3^0; ***it led=P2^0; //用一个LED灯作为指示信号 static u16 single_mileage=0; //单次里程 static u16 total_mileage=0; //总里程 static u16 speed=0; static u16 realspeed=0; //speed通过realspeed传出 static u16 j=0; static u16 temp1=0; static u16 temp2=0; static u16 temp3=0; //三个中间变量,在按键判断时会用到 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(u16 i) { while(i--); } void Time0Init() //定时器初始化函数,定时10ms { TMOD|=0x51; TH0=0xd8; TL0=0xf0; ET0=1; EA=1; TR0=1; } void Count1Init() //计数器初始化函数 { TMOD|=0x51; TH1=0x00; TL1=0x00; ET1=1; EA=1; TR1=1; } /*------------------------------------------------ 函数功能:获取xxxx的每一位并显示在数码管的高四位 ------------------------------------------------*/ void DisplaySpeed(u16 x) { u16 x_gewei=x/1%10; u16 x_shiwei=x/10%10; u16 x_baiwei=x/100%10; u16 x_qianwei=x/1000%10; u8 i; for(i=0;i<4;i++) { switch(i) { case(0): LSA=1;LSB=1;LSC=1;P0=smgduan[x_qianwei]; break; case(1): LSA=0;LSB=1;LSC=1;P0=smgduan[x_baiwei]; break; case(2): LSA=1;LSB=0;LSC=1;P0=smgduan[x_shiwei]; break; case(3): LSA=0;LSB=0;LSC=1;P0=smgduan[x_gewei]; break; } //P0=smgduan; delay(100); P0=0x00; } } /*------------------------------------------------ 函数功能:获取xxxx的每一位并显示在数码管的低四位 ------------------------------------------------*/ void DisplayMileage(u16 x) { u16 x_gewei=x/1%10; u16 x_shiwei=x/10%10; u16 x_baiwei=x/100%10; u16 x_qianwei=x/1000%10; u8 i; for(i=0;i<4;i++) { switch(i) { case(0): LSA=1;LSB=1;LSC=0;P0=smgduan[x_qianwei]; break; case(1): LSA=0;LSB=1;LSC=0;P0=smgduan[x_baiwei]; break; case(2): LSA=1;LSB=0;LSC=0;P0=smgduan[x_shiwei]; break; case(3): LSA=0;LSB=0;LSC=0;P0=smgduan[x_gewei]; break; } //P0=smgduan; delay(100); P0=0x00; } } /*----------------------------------------------------------- 主函数:将定时器和计数器初始化,并无限循环等待中断 -----------------------------------------------------------*/ void main() { Time0Init(); //计时器0初始化 Count1Init(); //计数器1初始化 while(1); //无限循环 } /*----------------------------------------------------------- 中断服务函数:每过1s将计数器的值传给speed,并通过realspeed传出 -----------------------------------------------------------*/ void Time0() interrupt 1 { TH0=0xd8; TL0=0xf0; j++; if(k2==0) { temp2++; } if(temp2==300) { temp2=0; single_mileage=0; } if(j==100) //1s { led=~led; j=0; speed=(TH1*256+TL1); //计数传给speed single_mileage+=speed; total_mileage+=speed; realspeed=speed; //speed=1; TH1=0x00; //每秒计数后,需将计数器初始化 TL1=0x00; speed=0; } DisplaySpeed(realspeed); //显示速度 if(k1==0) { _nop_(); if(k1==0) { temp1++; } } if(temp1<=40 && temp1>=15) { temp1=0; temp3++; } if(temp3%2==1) { DisplayMileage(total_mileage); } else { DisplayMileage(single_mileage); } } 设计过程中遇到的问题和解决的办法
这是我的第一篇博客,终于理解为什么程序员喜欢写博客了,写博客是真滴快乐。当然还是报着学习的态度,如有错误望网友轻喷,欢迎与我交流。QQ:37892436 |
|
|
|
只有小组成员才能发言,加入小组>>
2593 浏览 0 评论
789浏览 1评论
225浏览 1评论
549浏览 0评论
299浏览 0评论
502浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-15 21:30 , Processed in 1.221700 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号