標(biāo)題:
Proteus仿真HCSR04超聲波+DS18B20+LCD1602+51單片機(jī)集成系統(tǒng)程序
[打印本頁(yè)]
作者:
JN0717
時(shí)間:
2022-4-25 08:52
標(biāo)題:
Proteus仿真HCSR04超聲波+DS18B20+LCD1602+51單片機(jī)集成系統(tǒng)程序
HCSR04+DS18B20+LCD1602+51單片機(jī)集成系統(tǒng),文件包含keil工程和proteus仿真結(jié)果
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(73.51 KB, 下載次數(shù): 49)
下載附件
2022-4-25 17:37 上傳
單片機(jī)源程序如下:
//頭函數(shù)
#include <reg52.h>
#include <intrins.h>
//宏定義
#define uchar unsigned char
#define uint unsigned int
#define ULint unsigned long int
//溫度零上與零下的標(biāo)志位
char flag=0;
//超聲波
char flags=0;
//超聲波距離
char flag1s=1;
//計(jì)算定時(shí)間
uint time=0;
//計(jì)算距離
ULint L_=0;
ULint Mini=20;
//溫度
uint t_=0;
bit xsflag=1;
//按鍵標(biāo)志
uchar k=0;
//數(shù)值有誤
uchar FW=0;
#include "BJ_Key.h" //報(bào)警按鍵
#include "display.h" //顯示頭函數(shù)
#include "ultrasonic_wave.h"//超聲波頭函數(shù)
#include "DS18B20.h" //溫度傳感器頭函數(shù)
//函數(shù)聲明
void delayms(uint ms);
//主函數(shù)
void main()
{
Init_ultrasonic_wave();
//屏幕初始化
Init1602();
//溫度初始化
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
//循環(huán)顯示
while(1)
{
Key();
StartModule();//啟動(dòng)超聲波
while(!RX); //當(dāng)RX為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
delayms(20); //20MS
tmpchange(); //溫度轉(zhuǎn)換
t_=tmp(); //度溫度
Conut(t_/10); //計(jì)算距離
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中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
void CJ_T0() interrupt 1
{
flags=1; //中斷溢出標(biāo)志
}
復(fù)制代碼
ULTRASONIC_WAVE.H
//超聲波管腳定義
sbit RX=P1^3;
sbit TX=P1^2;
//超聲波初始化
void Init_ultrasonic_wave()
{
TX=0; //關(guān)閉發(fā)射
TMOD=0x01; //設(shè)T0為方式1,GATE=1;
TH0=0;
TL0=0;
// TH1=0x3c;
// TL0=0xb0;
ET0=1; //允許T0中斷
// ET1=0;
// TR1=0;
EA=1; //開啟總中斷
}
//啟動(dòng)超聲波
void StartModule() //啟動(dòng)模塊
{
TX=1; //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
//計(jì)算不同溫度下的速度
void JS_(uchar WD)
{
//大于-30
if(WD>=30&&flag==1)
{
L_=(time*3.13)/200; //算出來(lái)是CM;
}
//大于-20<-30
else if(WD>=20&&WD<30&&flag==1)
{
L_=(time*3.19)/200; //算出來(lái)是CM;
}
//大于-10<-20
else if(WD>=10&&WD<20&&flag==1)
{
L_=(time*3.25)/200; //算出來(lái)是CM;
}
//大于0<-10
else if(WD>=0&&WD<10&&flag==1)
{
L_=(time*3.23)/200; //算出來(lái)是CM;
}
//大于0<10
else if(WD<=10&&WD>0&&flag==0)
{
L_=(time*3.38)/200; //算出來(lái)是CM;
}
//大于10<20
else if(WD<=20&&WD>10&&flag==0)
{
L_=(time*3.34)/200; //算出來(lái)是CM;
}
//大于20<30
else if(WD<=30&&WD>20&&flag==0)
{
L_=(time*3.49)/200; //算出來(lái)是CM;
}
//大于30
else if(WD>30&&flag==0)
{
L_=(time*3.86)/200; //算出來(lái)是CM;
}
}
//距離計(jì)算 SD為當(dāng)時(shí)的超聲速度
void Conut(uchar WD)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
JS_(WD);
//距離大于200或者超時(shí)
if(L_>500||flags==1)
{
flags=0;
//無(wú)效顯示
flag1s=0;
L_=500;
FW=1;
// Feng_Start();
}
//距離小于100
else if(L_<=500)
{
flag1s=1;
FW=0;
// Feng_Stop();
}
}
復(fù)制代碼
Keil代碼與Proteus7.5和8.8仿真下載:
HCSR04 DS18B20 LCD1602 51單片機(jī).zip
(310.5 KB, 下載次數(shù): 125)
2022-4-25 08:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
469maker
時(shí)間:
2022-5-23 18:21
仿真有,但是程序好像不算
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1