功能说明:
2.LCD1602液晶显示测量的距离和温度;
3.带有温度补偿功能(DS18B20传感器);
4.测量范围0.02m~4m,精度为0.01m;
5.带实时语音播报功能;
6.按键功能:按键2:加报警值按键3:减报警值按键1:设置按键(只有在按下设置的时候才可以加减报警值),在未按下按键1时,按下按键3播报测量距离。
实物制作图:
原理图:
单片机源程序如下:
//宏定义
#define uchar unsigned char
#define uint unsigned int
#define ULint unsigned long int
//温度零上与零下的标志位
char flag=0;
//超声波
char flags=0;
//超声波距离
char flag1s=0;
//计算定时间
uint time=0;
//计算距离
ULint L_=0;
//温度
uint t_=0;
//显示模式 0正常 1最大值调整 2最小值调整
uchar mode=0;
uint Max=490;
uint Min=10;
//按键标志
uchar k=0;
//数值有误
uchar FW=0;
//头函数
#include #include #include "BJ_Key.h" //报警按键 #include "display.h" //显示头函数 #include "ultrasonic_wave.h"//超声波头函数 #include "DS18B20.h" //温度传感器头函数 uchar ONE1[6]={0x7E,0x04,0x03,0x00,0X0D,0xEF};//现在距离为 uchar ONE2[6]={0x7E,0x04,0x03,0x00,0X0C,0xEF};//米 uchar ONE3[6]={0x7E,0x04,0x03,0x00,0X0B,0xEF};//点 uchar ONE4[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//百位 uchar ONE5[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//十位 uchar ONE6[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//个位 void delayms(uint ms) { uchar i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /******** UART初始化 波特率:9600 ******/ void UART_init(void) { SCON = 0x50; // 10位uart,允许串行接受 TMOD = 0x20; // 定时器1工作在方式2(自动重装) TH1 = 0xFD; TL1 = 0xFD; //设置波特率为9600 TR1 = 1; } /* * UART 发送一字节 入口参数uint8的数据类型 即要发送的数据 */ void UART_send_byte(uchar dat) { SBUF = dat; while (TI == 0); TI = 0; } /* * UART 发送字符串 第一个参数要发送字符串或数据的首地址 第二个参数是要发送的数据或字符串的长度 */ void UART_send_string(uchar *buf,uchar len) { uchar i; for(i=0;i } //主函数 void main() { UART_init(); Init_ultrasonic_wave(); //屏幕初始化 Init1602(); //温度初始化 tmpchange(); t_=tmp(); tmpchange(); t_=tmp(); tmpchange(); t_=tmp(); //循环显示 while(1) { Key(); if(yuyin_flag==1) { yuyin_flag=0; ONE4[4]=L_/100; ONE5[4]=L_/10%10; ONE6[4]=L_%10; if(ONE4[4]==0)ONE4[4]=0x0A; if(ONE5[4]==0)ONE5[4]=0x0A; if(ONE6[4]==0)ONE6[4]=0x0A; UART_send_string(ONE1,6); delayms(1); UART_send_string(ONE4,6); delayms(1); UART_send_string(ONE3,6); delayms(1); UART_send_string(ONE5,6); delayms(1); UART_send_string(ONE6,6); delayms(1); UART_send_string(ONE2,6); delayms(1); } //正常显示 if(mode==0) { StartModule();//启动超声波 while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 delayms(20); //20MS tmpchange(); //温度转换 t_=tmp(); //度温度 Conut(t_/10); //计算距离 if(L_>Max||L_ Feng_Start(); } else { if(FW!=1) Feng_Stop(); } Display_1602(t_/10,L_); } //调整显示 else if(mode!=0) { //最大最小值 Init_MaxMin(); while(mode!=0) { Key(); if(k==1&&mode==1) { Init_MaxMin(); write_com(0x8d);//设置位置 } else if(k==1&&mode==2) { Init_MaxMin(); write_com(0x8d+0x40);//设置位置 } k=0; }
上一篇:利用压栈sp自增复制数据
下一篇:基于单片机的烟雾报警器
推荐阅读最新更新时间:2024-11-05 20:19
设计资源 培训 开发板 精华推荐
- EVAL-ADV7610EBZ,Advantiv ADV7610 HDMI 接收器功能和特性的评估板
- LT1021DCN8-10 用于超精密电流源的电压基准的典型应用
- 使用 Analog Devices 的 LTC2411IMS 的参考设计
- 使用 Analog Devices 的 LT1506IR-SYNC 的参考设计
- 使用 Diodes Incorporated 的 PT8A 3519C 的参考设计
- 使用 ON Semiconductor 的 STK415-090-E 的参考设计
- 使用 PCA9673 FM + 准双向 GPIO 控制 2 步进电机的应用电路
- LT8631HFE 200kHz、1.8V、1A 降压转换器的典型应用电路
- LTC7860 的典型应用 - 高效开关浪涌抑制器
- RD-204,适用于 LCD 显示器的 60W、12V AC 至 DC 单路输出电源的参考设计