标题:
Proteus仿真HCSR04超声波+DS18B20+LCD1602+51单片机集成系统程序
[打印本页]
作者:
JN0717
时间:
2022-4-25 08:52
标题:
Proteus仿真HCSR04超声波+DS18B20+LCD1602+51单片机集成系统程序
HCSR04+DS18B20+LCD1602+51单片机集成系统,文件包含keil工程和proteus仿真结果
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
(73.51 KB, 下载次数: 49)
下载附件
2022-4-25 17:37 上传
单片机源程序如下:
//头函数
#include <reg52.h>
#include <intrins.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
#define ULint unsigned long int
//温度零上与零下的标志位
char flag=0;
//超声波
char flags=0;
//超声波距离
char flag1s=1;
//计算定时间
uint time=0;
//计算距离
ULint L_=0;
ULint Mini=20;
//温度
uint t_=0;
bit xsflag=1;
//按键标志
uchar k=0;
//数值有误
uchar FW=0;
#include "BJ_Key.h" //报警按键
#include "display.h" //显示头函数
#include "ultrasonic_wave.h"//超声波头函数
#include "DS18B20.h" //温度传感器头函数
//函数声明
void delayms(uint ms);
//主函数
void main()
{
Init_ultrasonic_wave();
//屏幕初始化
Init1602();
//温度初始化
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
//循环显示
while(1)
{
Key();
StartModule();//启动超声波
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
delayms(20); //20MS
tmpchange(); //温度转换
t_=tmp(); //度温度
Conut(t_/10); //计算距离
if(L_<Mini && xsflag==1)
{
Feng_Start();
}else{
Feng_Stop();
}
if(L_<5&& xsflag==1)
{
motor_en();
}
else{
motor_off();
}
Display_1602(t_/10,L_,Mini);
}
}
void delayms(uint ms)
{
uchar i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
//T0中断用来计数器溢出,超过测距范围
void CJ_T0() interrupt 1
{
flags=1; //中断溢出标志
}
复制代码
ULTRASONIC_WAVE.H
//超声波管脚定义
sbit RX=P1^3;
sbit TX=P1^2;
//超声波初始化
void Init_ultrasonic_wave()
{
TX=0; //关闭发射
TMOD=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
// TH1=0x3c;
// TL0=0xb0;
ET0=1; //允许T0中断
// ET1=0;
// TR1=0;
EA=1; //开启总中断
}
//启动超声波
void StartModule() //启动模块
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
//计算不同温度下的速度
void JS_(uchar WD)
{
//大于-30
if(WD>=30&&flag==1)
{
L_=(time*3.13)/200; //算出来是CM;
}
//大于-20<-30
else if(WD>=20&&WD<30&&flag==1)
{
L_=(time*3.19)/200; //算出来是CM;
}
//大于-10<-20
else if(WD>=10&&WD<20&&flag==1)
{
L_=(time*3.25)/200; //算出来是CM;
}
//大于0<-10
else if(WD>=0&&WD<10&&flag==1)
{
L_=(time*3.23)/200; //算出来是CM;
}
//大于0<10
else if(WD<=10&&WD>0&&flag==0)
{
L_=(time*3.38)/200; //算出来是CM;
}
//大于10<20
else if(WD<=20&&WD>10&&flag==0)
{
L_=(time*3.34)/200; //算出来是CM;
}
//大于20<30
else if(WD<=30&&WD>20&&flag==0)
{
L_=(time*3.49)/200; //算出来是CM;
}
//大于30
else if(WD>30&&flag==0)
{
L_=(time*3.86)/200; //算出来是CM;
}
}
//距离计算 SD为当时的超声速度
void Conut(uchar WD)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
JS_(WD);
//距离大于200或者超时
if(L_>500||flags==1)
{
flags=0;
//无效显示
flag1s=0;
L_=500;
FW=1;
// Feng_Start();
}
//距离小于100
else if(L_<=500)
{
flag1s=1;
FW=0;
// Feng_Stop();
}
}
复制代码
Keil代码与Proteus7.5和8.8仿真下载:
HCSR04 DS18B20 LCD1602 51单片机.zip
(310.5 KB, 下载次数: 125)
2022-4-25 08:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
469maker
时间:
2022-5-23 18:21
仿真有,但是程序好像不算
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1