摘要:本文介绍如何使用DS18B20和LCD1602实现一个数字温度计
LCD1602与单片机的连接通常有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。在这里我们采用直接控制的方式,将LCD1602的8根数据线和3根控制线E,RS和R/W与单片机直接相连。VO引脚是液晶对比度调试端,连接一个10kΩ的电位器即可实现对比度的调整,实际项目中也可以采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过该电阻的大小应通过事先的调试来决定。
DS18B20只有三个引脚,电源、数据线和接地。将数据线直接连接到单片机的引脚就可以了。整个仿真系统的原理图如下所示:
下面就来逐步的看一下仿真程序的实现方法。在程序的最开始还是引入头文件、宏定义和配置常量参数部分。具体内容如下所示:
#include <reg51.h> #include <intrins.h> #include <string.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int // LCD1602控制引脚定义 sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; // 18B20引脚定义 sbit DQ = P2^3; |
这些引脚的定义需要按照实际的接线方法来进行,如果与上面的原理图不同,那么请进行修改。
接下来就是在C51中最经常使用到的延时函数的声明和实现了。在这里定义了2个延时函数,如下所示:
//*****************************// // 延时函数 //****************************// void delayUs2x(uchar t) { while(--t); } void delayMs(uchar t) { while(t--) { //大致延时1mS delayUs2x(245); delayUs2x(245); } } |
接下来就是对LCD1602进行控制的各个函数了。对LCD1602进行控制的关键点在于把握对三个控制信号RS、R/W和E的组合使用。在这里实现了以下几个函数:
busyCheck():检查LCD1602是否处于忙状态,用于确定是否可以接收新的指令。
lcdExec():通知LCD1602执行刚刚下发的命令。
lcdWCmd():写入命令函数。
lcdPos():设置光标位