标题:
STC15W4K单片机温控显示项目设计实战:数字温度计
[打印本页]
作者:
jidohgr
时间:
2017-7-22 18:41
标题:
STC15W4K单片机温控显示项目设计实战:数字温度计
这张帖子是基于STC15W4K系列的温控显示设计;
采用lcd1602显示和ds18b20温控装置的实用设计;
如果对您有帮助,很感谢您的黑币;
0.png
(583.63 KB, 下载次数: 89)
下载附件
2017-7-22 23:04 上传
数字温度计实验步骤:
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黑下载附件…………
复制代码
0.png
(37.94 KB, 下载次数: 82)
下载附件
2017-7-22 23:06 上传
所有资料51hei提供下载:
项目实战2 - 数字温度计(DS18B20正负温显示).rar
(1.08 MB, 下载次数: 70)
2017-7-22 18:41 上传
点击文件名下载附件
实用项目
下载积分: 黑币 -5
作者:
mcs51
时间:
2017-7-23 10:12
支持不错!!
作者:
持勤补拙
时间:
2017-8-4 18:30
值得学习
作者:
keywod
时间:
2023-3-27 09:28
学习了,这次是STC,国产芯片!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1