#include <stdio.h>
#include "LCD1602.h"
#define L 0.15 //3.14*5cm
sbit RX = P2^0;
sbit TX = P2^1;
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uchar buffer[4];//用于sprintf
static unsigned char DisNum = 0;
uint time=0;
uint Dht_Flag=0;
float S=0;
bit flag =0;
uchar disbuff[4]={ 0,0,0,0,};
uchar num;
uint turns=0;
uint Vf=0;
//extern void DHT11_receive(); //接收40位的数据
//extern uchar rec_dat[9]; //用于显示的接收数据数组
void Time_Init()
{
TMOD=0x01|0x10; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1 = 0x4b;
TL1 = 0xfc; //0x4bfc 定时50ms
ET1=1;
EX1=1;
IT1=1; //允许T1中断,外部中断1,下降沿触发
EA=1; //开启总中断
TR1 = TR0= 1;//启动T1
}
/***********400ms延时******************/
void delay400Ms(void)
{
uchar TempCycA = 5;
uint TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
void Speed() //速度计算与显示函数
{
sprintf(buffer, "%d",turns);
LCD_str(0, 0,(unsigned char *)buffer); //显示转速
LCD_str(2, 0,"rad/s"); //显示转速单位
sprintf(buffer, "%.2f",(double)turns*L); //转速*周长
LCD_str(9, 0,(unsigned char *)buffer); //显示速度
LCD_str(13, 0,"m/s"); //显示速度单位
flag=0; //计时标志位清零
turns=0; //转速清零
}
//当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间
void HC_SR04() //超声波测距计算与显示函数
{
time=TH0*256+TL0; //得到高电平时间,单位为us
TH0=0;
TL0=0; //定时器初值清零
S=(time*1.70)/100; //距离=时间*波速/2(S=time*340/2m)
LCD_str(0, 1,"distance:");
sprintf(buffer, "%.2f",(double)S/100);
LCD_str(11, 1,(unsigned char *)buffer);//显示单位
LCD_str(15,1,"M"); //显示距离
}
/******************超声波启动函数*********************************/
void startModule() //启动模块
{
uchar i;
TX=1; //启动一次模块
for(i=0;i<20;i++) //延迟 以便于进行传送数据
{
_nop_();
}
TX=0;
}
/*****************主函数***********************************/
void main()
{
uchar i;
LCD_init(); //1602初始化
Time_Init(); //定时器与中断初始化
while(1)
{
startModule(); //超声波启动
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
HC_SR04(); //超声波测距计算与显示函数
if(flag==1) //500ms标志位
Speed(); //速度计算与显示
}
}
//void main()
//{
// uchar i;
// LCD_init(); //1602初始化
// Time_Init(); //定时器与中断初始化
// while(1)
// {
// delay(1500);
// TR0=0;
// Dht_Flag=0;
// DHT11_receive();
// LCD_write_cmd(0x40); //从lcd1602第一行第一个位置开始显示
// for(i=6;i<9;i++)
// LCD_write_dat(rec_dat[i]); //显示数据
// TR0=1;
// }
//}
/*************************中断**************************/
void timer1() interrupt 3 //50ms
{
TH1 = 0x4b;
TL1 = 0xfc;//0x4bfc 定时50ms
num++;
if(num==10) //500ms到
{
num=0;
flag=1;
}
}
//外部中断1中断服务程序
void int1() interrupt 2
{
turns++;
}
基于51单片机的霍尔传感器测速以及超声波测距系统
4星 · 超过85%的资源 需积分: 45 199 浏览量
2021-01-08
21:29:17
上传
评论 8
收藏 59KB ZIP 举报
nop_____
- 粉丝: 5
- 资源: 4
最新资源
- 基于stm32f103c单片机+MPU6050+0.96英寸OLED显示屏双柄遥控器硬件(原理图+PCB)工程文件.zip
- 整理的关于少儿编程的学习路径,以及如何在小升初,初升高和大学充分的利用起来编程经验的优势
- 足球比赛结果统计表2006-2011年大约28W场比赛
- 基于PHP+mysql的社区交流系统(源代码)
- yolov5,SSD 可能使用到的一些代码
- 一键批量生成多层次文件夹结构,使用Python脚本实现嵌套文件夹批量生成
- 基于c51单片机+DS1302+DHT11温湿度模块+LCD1602显示的万年历硬件原理图+BOM+软件程源码序+仿真图.zip
- NSGA2的MATLAB代码
- Messagepassingtest_GCN_DGL.py
- Sh,Docker 运维好帮手,一招通过 sh 脚本批量快速启动和重启多个Docker 容器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论1