有时,由于波动,人们很难从模拟温度计读取温度。因此,在这里,我们将使用8051微控制器构建一个简单的数字温度计 ,其中使用LM35传感器来测量温度。我们还使用LM35通过Arduino,NodeMCU,PIC,Raspberry Pi和其他微控制器来构建数字温度计。
该项目还将用作ADC0804与8051和16 * 2 LCD与8051微控制器的正确接口。
所需组件:
- 8051开发板
- ADC0804板
- 16 * 2 LCD显示屏
- LM35传感器
- 电位器
- 跳线
电路原理图:
为电路图 使用LM35数字温度计电路 给出如下:
使用8051使用LM35测量温度:
8051微控制器是一个8位微控制器,具有128字节的片上RAM,4K字节的片上ROM,两个定时器,一个串行端口和四个8位端口。8052微控制器是微控制器的扩展。下表显示了8051家庭成员的比较。
特征 |
8051 |
8052 |
ROM(以字节为单位) |
4K |
8K |
RAM(字节) |
128 |
256 |
计时器 |
2 |
3 |
I / O引脚 |
32 |
32 |
串行端口 |
1个 |
1个 |
中断源 |
6 |
8 |
16x2 LCD:
16 * 2 LCD是嵌入式应用中广泛使用的显示器。这是有关16 * 2 LCD显示器的引脚和工作原理的简要说明。LCD内有两个非常重要的寄存器。它们是数据寄存器和命令寄存器。命令寄存器用于发送命令,例如清晰显示,在家中的光标等;数据寄存器用于发送要在16 * 2 LCD上显示的数据。下表显示了16 * 2 LCD的引脚说明。
销 |
符号 |
输入输出 |
描述 |
1个 |
VS |
-- |
地面 |
2 |
Vdd |
-- |
+ 5V电源 |
3 |
Vee |
-- |
电源控制对比度 |
4 |
RS |
一世 |
RS = 0,用于命令寄存器, RS = 1用于数据寄存器 |
5 |
读写器 |
一世 |
R / W = 0用于写入,R / W = 1用于读取 |
6 |
Ë |
输入输出 |
启用 |
7 |
D0 |
输入输出 |
8位数据总线(LSB) |
8 |
D1 |
输入输出 |
8位数据总线 |
9 |
D2 |
输入输出 |
8位数据总线 |
10 |
D3 |
输入输出 |
8位数据总线 |
11 |
D4 |
输入输出 |
8位数据总线 |
12 |
D5 |
输入输出 |
8位数据总线 |
13 |
D6 |
输入输出 |
8位数据总线 |
14 |
D7 |
输入输出 |
8位数据总线(MSB) |
15 |
一种 |
-- |
+ 5V背光 |
16 |
ķ |
-- |
地面 |
下表显示了常用的LCD命令代码。
代码(十六进制) |
描述 |
01 |
清除显示画面 |
06 |
增量光标(右移) |
0A |
显示关闭,光标打开 |
0C |
显示开启,光标关闭 |
0楼 |
显示开启,光标闪烁 |
80 |
强制光标到1条的开始日线 |
C0 |
强制光标移至第二行的开头 |
38 |
2行5 * 7矩阵 |
ADC0804 IC:
该ADC0804 IC是在家庭中的美国国家半导体的ADC0800系列的8位并行ADC。它的工作电压为+5伏,分辨率为8位。对于不同的Vref / 2值,步长和Vin范围会有所不同。下表显示了Vref / 2与Vin范围之间的关系。
Vref / 2(垂直) |
Vin(V) |
步长(mV) |
打开 |
0至5 |
19.53 |
2.0 |
0至4 |
15.62 |
1.5 |
0至3 |
11.71 |
1.28 |
0至2.56 |
10 |
在我们的情况下,Vref / 2连接到1.28伏,因此步长为10mV。对于ADC0804,步长计算为(2 * Vref / 2)/ 256。
以下公式用于计算输出电压:
Dout = Vin /步长
Dout是数字数据的十进制输出,Vin =模拟输入电压,步长(分辨率)是最小的变化。在此处了解有关ADC0804的更多信息,还请检查ADC0808与8051的接口。
LM35温度传感器:
LM35是温度传感器,其输出电压与摄氏温度成线性比例。LM35已经进行了校准,因此不需要外部校准。摄氏温度每度输出10mV。
LM35传感器产生与温度相对应的电压。该电压由ADC0804转换为数字电压(0至256),并馈入8051微控制器。8051微控制器将此数字值转换为摄氏温度。然后将此温度转换为适合显示的ascii形式。该ascii值被馈送到16 * 2的lcd,LCD在其屏幕上显示温度。在指定的时间间隔后重复此过程。
以下是使用8051的LM35数字温度计的设置图像 :
您可以在此处找到所有基于LM35的数字温度计。
代码说明:
该项目结尾给出了使用LM35的数字温度计的完整C程序。该代码分为多个有意义的小块,并在下面进行说明。
对于与8051微控制器接口的16 * 2 LCD,我们必须定义16 * 2 LCD连接到8051微控制器的引脚。16 * 2 LCD的RS引脚连接到P2.7,16 * 2 LCD的RW引脚连接到P2.6,而16 * 2 LCD的E引脚连接到P2.5。数据引脚连接到8051微控制器的端口0。
比特rs = P2 ^ 7; //寄存器选择(RS)引脚为16 * 2 lcd sbit rw = P2 ^ 6; //读/写(RW)引脚为16 * 2 LCD sbit en = P2 ^ 5; //启用16 * 2 LCD的(E)引脚
同样,对于与8051微控制器接口的ADC0804,我们必须定义ADC0804与8051微控制器连接的引脚。ADC0804的RD引脚连接到P3.0,ADC0804的WR引脚连接到P3.1,ADC0804的INTR引脚连接到P3.2。数据引脚连接到8051微控制器的端口1。
比特rd_adc = P3 ^ 0; //读取ADC0804的(RD)引脚bit wr_adc = P3 ^ 1; //将ADC0804的写入(WR)引脚设置为intr_adc = P3 ^ 2; // ADC0804的中断(INTR)引脚
接下来,我们必须定义一些在程序中使用的功能。 延迟 函数用于创建指定的时间延迟,c mdwrt 函数用于将命令发送到16 * 2液晶显示器, datawrt 函数用于将数据发送到16 * 2液晶显示器, convert_display 函数用于将ADC数据转换为温度并将其显示在16 * 2液晶显示器上。
void delay(unsigned int); //创建延迟的函数void cmdwrt(unsigned char); //向16 * 2 LCD发送命令的功能display void datawrt(unsigned char); //将数据发送到16 * 2 LCD显示屏的函数void convert_display(unsigned char); //将ADC值转换为温度并在16 * 2 LCD显示屏上显示的功能
在代码的下面,我们将命令发送到16 * 2 lcd。命令,如清晰的显示,增量光标,迫使光标到1条的开始ST线通过一个指定的一些时间延迟之后被发送到16 * 2液晶显示器中的一个。
for(i = 0; i <5; i ++)//将命令发送到16 * 2 LCD一次显示一个命令{cmdwrt(cmd); //通过函数调用将命令发送到16 * 2 LCD显示延迟(1); }
在这部分代码中,我们将数据发送到16 * 2 lcd。在指定的时间延迟后,将要在16 * 2 LCD显示屏上显示的数据一一发送。
for(i = 0; i <12; i ++)//将数据发送到16 * 2 LCD一次显示一个字符{datawrt(data1); //通过函数调用将数据发送到16 * 2 LCD显示延迟(1); }在这部分代码中,我们将LM35传感器产生的模拟电压转换为数字数据,然后将其转换为温度并显示在16 * 2 LCD显示器上。为了使ADC0804开始转换,我们必须在ADC0804的WR引脚上发送一个从低到高的脉冲,然后我们必须等待转换结束。转换结束时,INTR变低。一旦INTR变为低电平,RD就会变为低电平,以将数字数据复制到8051微控制器的端口0。在指定的时间延迟后,下一个周期开始。永远重复此过程。
while(1)//永远重复{wr_adc = 0; //在WR引脚延迟(1)上将LOW发送到HIGH脉冲; wr_adc = 1; while(intr_adc == 1); //等待转换结束rd_adc = 0; //使RD = 0以从ADC0804读取数据value = P1; //复制ADC数据convert_display(value); //通过函数调用将ADC数据转换为温度并在16 * 2 LCD显示延迟(1000)上显示 //每个周期之间的间隔rd_adc = 1; //在下一个周期使RD = 1}
在代码的下面,我们将命令发送到16 * 2 LCD显示器。该命令将复制到8051微控制器的端口0。将RS设为低电平以进行命令写入。将RW设为低电平以进行写操作。在使能(E)引脚上施加从高到低的脉冲以开始命令写操作。
void cmdwrt(unsigned char x){P0 = x; //将命令发送到连接了16 * 2 lcd的端口0 rs = 0; //使命令rw = 0的RS = 0; //对于写入操作en = 1,使RW = 0;//在Enable(E)引脚上发送高电平到低电平脉冲,以开始命令写入操作延迟(1); en = 0; }
在这部分代码中,我们将数据发送到16 * 2 LCD显示器。数据被复制到8051微控制器的端口0。将RS设为高电平以进行命令写入。将RW设为低电平以进行写操作。在使能(E)引脚上施加从高到低的脉冲以开始数据写入操作。
无效的datawrt(无符号字符y){P0 = y; //将数据发送到连接了16 * 2 LCD的端口0 rs = 1; //使命令rw = 0的RS = 1; //对于写入操作en = 1,使RW = 0;//在Enable(E)引脚上发送高电平至低电平脉冲,以启动数据写入操作延迟(1);en = 0; }
在这部分代码中,我们将数字数据转换为温度并将其显示在16 * 2 LCD显示器上。
void convert_display(unsigned char value){无符号字符x1,x2,x3; cmdwrt(0xc6); //命令将光标设置在16 * 2 lcd x1 = {value / 10);上第二行的第六位置 //将值除以10,然后将商存储在变量x1中x1 = x1 +(0x30); //通过添加0x30 x2 = value%10将变量x1转换为ascii;//将值除以10,然后将余数存储在变量x2 x2 = x2 +(0x30)中;//通过添加0x30 x3 = 0xDF将变量x2转换为ascii;//度数(°)的ascii值symbol datawrt(x1); //显示温度在16 * 2 LCD显示屏上datawrt(x2); datawrt(x3); datawrt('C'); }
另外,使用带有不同微控制器的LM35检查其他温度计:
- 使用Arduino和LM35的数字温度计
- 使用LM35和AVR单片机进行温度测量
- 使用Raspberry Pi进行室温测量