51单片机视频教程中,是用数码管来显示温度的,这里用LCD1602来显示数据,效果图如下
下面是代码,采用模块化编程,分成LCD1602和DS18B20两个模块,在LCD1602的程序中调用DS18B20的读取温度数据,主函数中调用LCD1602的显示数据,从而显示温度
1.主函数代码
- #include "reg52.h"
- #include "lcd1602.h"
- #ifndef u8
- #define u8 unsigned char
- #endif
- #ifndef u16
- #define u16 unsigned int
- #endif
- void main()
- {
- LcdDisp();
- while(1);
- }
复制代码 2.LCD1602代码
- #include "lcd1602.h"
- #include "ds18b20.h"
- extern u8 Tempdata[9]; //声明ds18b20中保存温度数据的数组,扩展使用范围
- void Lcd1602_Delay1ms(u8 c) //误差 0us
- {
- u8 a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
- }
- void Lcd1602WriteCom(u8 com) //写命令函数
- {
- LCD_E=0;
- LCD_RS=0; //写命令,RS=0
- LCD_RW=0;
- LCD_DATAPIN=com;
- Lcd1602_Delay1ms(1);
- LCD_E=1;
- Lcd1602_Delay1ms(5);
- LCD_E=0;
- }
- void Lcd1602WriteDat(u8 dat) //写数据函数
- {
- LCD_E=0;
- LCD_RS=1; //写数据,RS=1
- LCD_RW=0;
- LCD_DATAPIN=dat;
- Lcd1602_Delay1ms(1);
- LCD_E=1;
- Lcd1602_Delay1ms(5);
- LCD_E=0;
- }
- void LcdInit() //初始化函数
- {
- Lcd1602WriteCom(0x38); //功能设置指令,总线8位,显示2行,5x7点阵每个字符
- Lcd1602WriteCom(0x0c); //显示开关控制指令,显示功能开,无光标
- Lcd1602WriteCom(0x06); //模式设置指令,写入新数据后光标右移,显示屏不移动
- Lcd1602WriteCom(0x01); //清屏指令
- Lcd1602WriteCom(0x47+0x80); //写入第二行倒数第八个位置
- }
- void LcdDisp() //显示函数
- {
- u8 i;
- LcdInit(); //LCD初始化
- tempdatapros(Tempdata); //读取温度数据,存入数组中
- for(i=0;i<9;i++)
- {
- Lcd1602WriteDat(Tempdata[i]);
- }
- }
复制代码- #ifndef _LCD1602_H_
- #define _LCD1602_H_
- #include "reg52.h"
- #ifndef u8
- #define u8 unsigned char
- #endif
- #ifndef u16
- #define u16 unsigned int
- #endif
- #define LCD_DATAPIN P0 //定义数据口
- sbit LCD_RS=P2^6;
- sbit LCD_RW=P2^5;
- sbit LCD_E=P2^7;
- void LcdDisp();
复制代码
3.DS18B20代码
- #ifndef __ds18b20_H_
- #define __ds18b20_H_
- #include "reg52.h"
- #ifndef u8
- #define u8 unsigned char
- #endif
- #ifndef u16
- #define u16 unsigned int
- #endif
- sbit DSPORT=P3^7; //定义数据管脚
- void tempdatapros(u8 Tempdata[]);
- #endif
复制代码
这个程序的缺点是不能实时更新温度数值,可以加中断函数或者其它函数来设定隔多长时间更新一次
欢迎大家在此基础上创
全部资料51hei下载地址:
LCD1602 DS18B20.zip
(36.4 KB, 下载次数: 78)
|