这张帖子是基于STC15W4K系列的温控显示设计;
采用lcd1602显示和ds18b20温控装置的实用设计;
如果对您有帮助,很感谢您的黑币;
数字温度计实验步骤:
1、按照正确接线方式将DS18B20芯片插到J13三芯单排母端子上,J13端口定义在开发板背面VDD/P36/GND/GND;
2、按照正确方向把LCD1602液晶屏插到开发板J7端子上;
3、MINI USB连接线给开发板通电下载程序,下载软件中内部IRC时钟选择11.0592MHZ;
4、下载程序后,LCD1602屏会显示18B20检测到的实时温度值。
备注:如果使用的DS18B20传感器是带延长线的,那可以将传感器供电接到J19的VCC/GND上,信号线与J25端子的P36连接。
单片机源程序如下:
- /****************************************Copyright (c)****************************************************
- **
- **
- **
- **--------------File Info---------------------------------------------------------------------------------
- ** File name:
- ** Last modified Date:
- ** Last Version:
- ** Descriptions:
- **--------------------------------------------------------------------------------------------------------
- ** Created by: FiYu
- ** Created date: 2016-9-8
- ** Version: 1.0
- ** Descriptions: 数字温度计实验
- **--------------------------------------------------------------------------------------------------------
- ** Modified by: FiYu
- ** Modified date:
- ** Version:
- ** Descriptions:
- ** Rechecked by:
- **********************************************************************************************************/
- /****-----请阅读ReadMe.txt进行实验-----***********/
- #include "ds18b20.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define LOW 0
- #define HIGH 1
- #define LowTemper 5
- #define HighTemper 30
- /**********************
- 引脚别名定义
- ***********************/
- sbit rs=P2^4; //1602的数据/指令选择控制线
- sbit rw=P2^3; //1602的读写控制线
- sbit en=P2^1; //1602的使能控制线
-
- sbit LED_R=P1^7; //红色LED用IO口P17
- sbit LED_B=P1^6; //蓝色LED用IO口P16
- uchar code table1[]="Current Temper: "; //要显示的内容1放入数组table
- uchar code table2[]="Normal "; //要显示的内容2放入数组table
- uchar code table3[]="Too low "; //要显示的内容3放入数组table
- uchar code table4[]="Too high"; //要显示的内容4放入数组table
- uchar code table5[]="-"; //要显示的内容5放入数组table
- uchar code table6[]=" "; //要显示的内容6放入数组table
- /**************************************
- 功能描述:LCD1602写命令函数
- 入口参数:uchar com
- 返回值:无
- ***************************************/
- void lcd_wcom(uchar com)
- {
- rs=0; //选择指令寄存器
- rw=0; //选择写
- P0=com; //把命令字送入P0
- delay_ms(1); //延时一小会儿,让1602准备接收数据
- en=1; //使能线电平变化,命令送入1602的8位数据口
- en=0;
- }
- /**************************************
- 功能描述:LCD1602写数据函数
- 入口参数:uchar dat
- 返回值:无
- ***************************************/
- void lcd_wdat(uchar dat)
- {
- rs=1; //选择数据寄存器
- rw=0; //选择写
- P0=dat; //把要显示的数据送入P0
- delay_ms(1); //延时一小会儿,让1602准备接收数据
- en=1; //使能线电平变化,数据送入1602的8位数据口
- en=0;
- }
- /**************************************
- 功能描述:LCD1602初始化函数
- 入口参数:无
- 返回值:无
- ***************************************/
- void lcd_init()
- {
- lcd_wcom(0x38); //8位数据,双列,5*7字形
- lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
- lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
- lcd_wcom(0x01); //清屏
- }
- /***************************************************************************
- * 描 述 : 主函数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- int main()
- {
- unsigned char i=0,j=0,m=0,n=0,k=0;
- unsigned char strTemp[6],uTemp,Sign;
- float fTemp;
-
- /////////////////////////////////////////////////
- //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
- // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
- //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- /////////////////////////////////////////////////
- P0M1 = 0; P0M0 = 0; //设置P0.0~P0.7为准双向口
- P1M1 = 0; P1M0 = 0; //设置P1.0~P1.7为准双向口
- P2M1 = 0; P2M0 = 0; //设置P2.0~P2.7为准双向口
- P3M1 = 0; P3M0 = 0; //设置P3.0~P3.7为准双向口
- P4M1 = 0; P4M0 = 0; //设置P4.0~P4.7为准双向口
- P5M1 = 0; P5M0 = 0; //设置P5.0~P5.7为准双向口
-
- lcd_init(); //液晶初始化
- lcd_wcom(0x80); //显示地址设为80H(即00H,)上排第一位
- for(i=0;i<16;i++) //将table1[]中的数据依次写入1602显示
- {
- lcd_wdat(table1[i]);
- delay_ms(20);
- }
-
- while(1)
- {
- memset(strTemp, 0, sizeof(strTemp)); //strTemp数组清零
-
- fTemp = floatReadDs18B20(); //温度读取函数,带1位小数位
- sprintf(strTemp, "%.01f", fTemp); //浮点数转成字符串
-
- uTemp=(uchar)fTemp;
- if(uTemp<10)
- {
- lcd_wcom(0x80+0x45); //重新设定显示地址
- lcd_wdat(table6[0]); //将table6[]中的数据依次写入1602显示
- delay_ms(20);
- Sign=3;
- }
- else
- {
- Sign=4;
- }
-
- if(ReadTempFlag)
- {
- lcd_wcom(0x80+0x41); //重新设定显示地址
- lcd_wdat(table5[0]);
- delay_ms(20);
- lcd_wcom(0x80+0x42);
- for(j=0;j<Sign;j++) //将strTemp[]中的数据依次写入1602显示
- {
- lcd_wdat(strTemp[j]);
- delay_ms(20);
- }
- }
- else
- {
- lcd_wcom(0x80+0x41); //重新设定显示地址
- lcd_wdat(table6[0]);
- delay_ms(20);
- lcd_wcom(0x80+0x42); //重新设定显示地址
- for(j=0;j<Sign;j++) //将strTemp[]中的数据依次写入1602显示
- {
- lcd_wdat(strTemp[j]);
- delay_ms(20);
- }
- }
-
- lcd_wcom(0x80+0x48); //重新设定显示地址
- if(ReadTempFlag||(uTemp<LowTemper)) //温度过低时,蓝灯较快闪烁(间隔60mS)
- {
- for(m=0;m<8;m++) //将table3[]中的数据依次写入1602显示
- {
- lcd_wdat(table3[m]);
- delay_ms(20);
- }
- LED_B=LOW;
- delay_ms(60);
- LED_B=HIGH;
- delay_ms(60);
- }
- else if(uTemp>HighTemper) //温度过高时,红灯较快闪烁(间隔60mS)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
项目实战2 - 数字温度计(DS18B20正负温显示).rar
(1.08 MB, 下载次数: 70)
|