51单片机中用keil编写具体程序实现:1602液晶显示器显示DS18B20与HD-SR04数据,距离小于10cm时唤醒总系统,温度大于37度小于40度时蜂鸣器发响,温度大于34度小于等于37度时带动步进电机
时间: 2023-07-31 13:08:24 浏览: 209
以下是基于51单片机的keil编写的程序实现:
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_data P0 //1602液晶数据线
sbit LCD_RS = P2^0; //1602液晶RS引脚
sbit LCD_RW = P2^1; //1602液晶RW引脚
sbit LCD_EN = P2^2; //1602液晶EN引脚
sbit DQ = P3^4; //DS18B20数据线
sbit TRIG = P3^5; //HC-SR04触发引脚
sbit ECHO = P3^6; //HC-SR04回响引脚
sbit BEEP = P3^7; //蜂鸣器引脚
sbit StepP = P1^0; //步进电机正转引脚
sbit StepN = P1^1; //步进电机反转引脚
sbit StepC = P1^2; //步进电机控制引脚
unsigned char dis[16]; //存储显示的字符
//延时函数
void Delay(unsigned int i)
{
while(i--);
}
//1602液晶写命令
void Write_Cmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_data = cmd;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
Delay(10);
}
//1602液晶写数据
void Write_Data(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_data = dat;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
Delay(10);
}
//1602液晶初始化
void LCD_Init()
{
Write_Cmd(0x38); //设置16*2,5*7点阵,8位数据接口
Write_Cmd(0x0c); //开显示,光标不显示
Write_Cmd(0x06); //文字向右走,光标不动
Write_Cmd(0x01); //清屏
}
//DS18B20读取温度函数
float Read_Temp(void)
{
unsigned char tempdata[2];
unsigned int temp;
float t;
unsigned char i;
DQ = 1; //开始通讯
Delay(5);
DQ = 0;
Delay(80);
DQ = 1;
Delay(10);
if(DQ)
{
return 0;
}
Delay(50);
for(i = 0; i < 2; i++)
{
tempdata[i] = 0;
}
for(i = 0; i < 8; i++)
{
DQ = 0; //开始通讯
tempdata[0] >>= 1;
tempdata[1] >>= 1;
DQ = 1;
if(DQ)
{
tempdata[0] |= 0x80;
}
Delay(5);
}
for(i = 0; i < 8; i++)
{
DQ = 0; //开始通讯
tempdata[0] >>= 1;
tempdata[1] >>= 1;
DQ = 1;
if(DQ)
{
tempdata[1] |= 0x80;
}
Delay(5);
}
for(i = 0; i < 16; i++)
{
DQ = 0; //开始通讯
temp >>= 1;
DQ = 1;
if(DQ)
{
temp |= 0x8000;
}
Delay(5);
}
t = (float)temp / 16.0;
return t;
}
//HC-SR04读取距离函数
unsigned int Read_Distance(void)
{
unsigned int time;
TRIG = 0;
Delay(5);
TRIG = 1;
Delay(10);
TRIG = 0;
while(!ECHO);
time = 0;
while(ECHO)
{
time++;
Delay(5);
}
return time / 58;
}
//步进电机正转函数
void Step_Forward()
{
StepC = 1;
StepP = 0;
StepN = 1;
Delay(100);
StepC = 0;
Delay(100);
}
//步进电机反转函数
void Step_Backward()
{
StepC = 1;
StepP = 1;
StepN = 0;
Delay(100);
StepC = 0;
Delay(100);
}
//主函数
void main()
{
float temp;
unsigned int dist;
LCD_Init(); //1602液晶初始化
while(1)
{
temp = Read_Temp(); //读取温度
dist = Read_Distance(); //读取距离
//显示温度和距离
sprintf(dis, "T:%.2fC D:%dcm", temp, dist);
for(i = 0; i < 16; i++)
{
Write_Data(dis[i]);
}
if(dist < 10) //距离小于10cm时唤醒总系统
{
//唤醒总系统
}
if(temp > 37.0 && temp < 40.0) //温度大于37度小于40度时蜂鸣器响
{
BEEP = 1;
}
else
{
BEEP = 0;
}
if(temp > 34.0 && temp <= 37.0) //温度大于34度小于等于37度时带动步进电机
{
Step_Forward();
}
else
{
Step_Backward();
}
}
}
```
阅读全文