基于STC15单片机温度光照蓝牙传输-proteus仿真-源程序

一、系统方案
本设计采用STC15单片机作为主控器,液晶1602显示,DS18B20采集温度,光敏电阻采集光照、按键设置温度上下限,测量温度小于下限,启动加热,测量温度大于上限,启动降温。
在这里插入图片描述
二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
uint count=0;
uint16 TempPhoto;
uint8 strPhoto[6];
uint wendu=0;
P3M0 = 0x00;
P3M1 = 0x00;
lcd_init(); //LCD1602初始化
delay_ms(10); //初始化后延时
DisplayListChar(0, 0, table1); //在LCD1602屏第一行显示table1内容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行显示table2内容

InitADC();

InitUart(); //初始化串口
2、液晶显示程序
/**************************************
功能描述:LCD1602写命令函数
入口参数int8 com
返回值:无
***************************************/
void lcd_wcom(uint8 com)
{
lcd1602_rs=0; //选择指令寄存器
lcd1602_rw=0; //选择写
P0=com; //把命令字送入P0
delay_ms(1); //延时一小会儿,让1602准备接收数据
lcd1602_en=1; //使能线电平变化,命令送入1602的8位数据口
lcd1602_en=0;
}

/**************************************
功能描述:LCD1602写数据函数
入口参数:uint8 dat
返回值:无
***************************************/
void lcd_wdat(uint8 dat)
{
lcd1602_rs=1; //选择数据寄存器
lcd1602_rw=0; //选择写
P0=dat; //把要显示的数据送入P0
delay_ms(1); //延时一小会儿,让1602准备接收数据
lcd1602_en=1; //使能线电平变化,数据送入1602的8位数据口
lcd1602_en=0;
}

/**************************************
功能描述:LCD1602初始化函数
入口参数:无
返回值:无
**************************************/
void lcd_init(void)
{
lcd_wcom(0x38); //8位数据,双列,5
7字形
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}

3、按键程序
void keyscan() //按键扫描
{
if(K10) //功能键
{
delayms(5);
if(K1
0)
{
keyflag_1++; //键一按下,标志位加1
if(keyflag_1>3) keyflag_1=0;
lcd_init();
if( keyflag_10)
{
DisplayListChar(0, 0, table1); //在LCD1602屏第一行显示table1内容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行显示table2内容
}
if( keyflag_1
1)
{
DisplayListChar(0, 0, " SET TEMP HIGH");

			} 
			if(	keyflag_1==2)
			{
				DisplayListChar(0, 0, " SET TEMP LOW");                
       
			} 
		 while(!K1);
		}	
}

if(keyflag_1!=0)
{			
	if(K2==0)	//限值加键
	{		
		delayms(5);     //按键消除抖动判断
		if(K2==0)
		{
			
			if(keyflag_1==1)   //进入设置模式 
			{
			 max++;
             if(max==100) max=0;             
            		 
			}
			if(keyflag_1==2)   //进入设置模式 
			{
			 min++;
             if(min==100) min=0;             
            		 
			}
			while(!K2);	 	//松手检测
		}
	} 
	if(K3==0)		  //限值减键
	{
		delayms(5);     //按键消除抖动判断
		if(K3==0)
		{
		
				if(keyflag_1==1)	//进入设置模式 
			{
			 max--;
             if(max==0) max=99;             
           			 
			}
				if(keyflag_1==2)	//进入设置模式 
			{
			 min--;
             if(min==0) min=99;             
           			 
			}
			
			while(!K3);	//松手检测
		}
	} 										
}	

}
/***
4、核心算法程序
int main(void)
{
uint count=0;
uint16 TempPhoto;
uint8 strPhoto[6];
uint wendu=0;
P3M0 = 0x00;
P3M1 = 0x00;
lcd_init(); //LCD1602初始化
delay_ms(10); //初始化后延时
DisplayListChar(0, 0, table1); //在LCD1602屏第一行显示table1内容
DisplayListChar(0, 1, table2); //在LCD1602屏第二行显示table2内容

InitADC();

InitUart(); //初始化串口
Init_DS18B20();

while (1)
{	     
	keyscan();
	if(keyflag_1==0)
	{
		count++;
	if(count>10)//读取温度值
	{

wendu=ReadTemperature();
count=0;
}
Disp_Temperature(wendu) ;
memset(strPhoto, 0, sizeof(strPhoto)); //strTemp数组清零
TempPhoto =GetADCResultint(1); //实时读取P1.1通道的AD转换结果
TempPhoto=TempPhoto5.020/1023;

	   strPhoto[0] = TempPhoto/1000+48;             //千位
  strPhoto[1] = (TempPhoto%1000)/100+48;        //百位
	  strPhoto[2] = (TempPhoto%1000)%100/10+48;        //十位
	
		 strPhoto[3] = (TempPhoto%10)+48;        //个位


		//在LCD1602上显示
		DisplayOneChar(6, 0, strPhoto[0]);         //在LCD1602屏第二行显示千位值  
		DisplayOneChar(7,0, strPhoto[1]);         //在LCD1602屏第二行显示百位值  
		DisplayOneChar(8, 0, strPhoto[2]);         //在LCD1602屏第二行显示十位值  
		DisplayOneChar(9, 0, strPhoto[3]);         //在LCD1602屏第二行显示个位值  
	DisplayOneChar(10,0,'l');  
	DisplayOneChar(11,0,'u');  
	DisplayOneChar(12,0,'x');  
	
	}
		if(keyflag_1==1)
		{
	 	DisplayOneChar(6, 1, max/100+0x30);         //在LCD1602屏第二行显示百位值  
		DisplayOneChar(7,1, max%100/10+0x30);         //在LCD1602屏第二行显示十位值  
		DisplayOneChar(8, 1, max%10+0x30);         //在LCD1602屏第二行显示个位值  
	
		}
		if(keyflag_1==2)
		{
		DisplayOneChar(6, 1, min/100+0x30);         //在LCD1602屏第二行显示百位值  
		DisplayOneChar(7,1, min%100/10+0x30);         //在LCD1602屏第二行显示十位值  
		DisplayOneChar(8, 1, min%10+0x30);         //在LCD1602屏第二行显示个位值  
		}
	
	
	
	
	SendString("guangz:");
	SendData( strPhoto[0]);//显示湿度值
	SendData( strPhoto[1]);
	SendData( strPhoto[2]);
	SendData( strPhoto[3]);
	SendData( 'l');
	SendData( 'u');
	SendData( 'x');
	SendData( 0x0d);
	SendData( 0x0a);
	
}

}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/122830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚观早报 |GPT-4周活用户数达1亿;长城汽车10月销量增加

【聚观365】11月8日消息 GPT-4周活用户数达1亿 长城汽车10月销量增加 xAI宣布推出PromptIDE工具 aigo爱国者连发5款儿童手表 SpaceX预计今年营收90亿美元 GPT-4周活用户数达1亿 在OpenAI首届开发者大会上,该公司首席执行官萨姆奥特曼(Sam Altman&a…

Linux内核分析(九)--CPU上下文

目录 一、引言 二、CPU上下文 ------>2.1、CPU上下文切换 三、线程上下文切换 ------>3.1、协程 四、中断上下文切换 ------>4.1、vmstat ------>4.2、pidstat ------>4.3、sysbench 一、引言 Linux是一个多任务的操作系统,可以支持远大于CPU数量的…

java项目之高校推免报名(ssm框架)

项目简介 高校推免报名实现了以下功能: 管理员功能:管理员登陆后,主要模块包括首页、个人中心、考生管理、报名指南管理、报名入口管理、专业信息管理、考生报名管理、考生成绩管理、面试通知管理、参加面试管理、面试成绩管理、综合成绩管…

Springboot养老院信息管理系统的开发-计算机毕设 附源码27500

Springboot养老院信息管理系统的开发 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,…

2023首届中国水果互联网上海论坛成功举办!

11月7日,“2023首届中国水果互联网上海论坛“在上海浦东嘉里大酒店成功举办,本次论坛是推动水果行业产业互联网发展的重要活动,也是中国水果互联网论坛的系列活动之一。 “2023首届中国水果互联网上海论坛”是由亚果会和亚果学社联合发起&…

【工具】OCR方法|不用下载额外的软件,提取扫描中英文PDF的目录文本的最优解!(一)

需求: 1)从PDF里快速提取目录; 2)不想下载任何软件。 我提取出来的目录文本会用于嵌入到PDF中,向PDF批量添加目录的软件以及软件的使用方法可以看我上一篇文章:PDF批量插入目录。 以下是我自己能想到的方…

leetcode做题笔记226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

Halcon的 Filter (过滤)目录之abs_Image算子

计算一个图像的绝对值主要应用在计算机视觉和图像处理领域,特别是在需要检测两幅图像之间的差异或捕捉变化的情况下。 例如,在图像处理中,绝对值可以用于计算图像的差异,这有助于识别或比较图像的变化。在计算机视觉中&#xff0…

iEnglish马铁鹰:智能教育塑造未来学习新范式

随着云计算、大数据、物联网、人工智能和区块链等新一代智能技术在教育中的广泛应用,教育正日益迈向智能时代。智能化和智慧化将深刻改变未来教育形式和学习方式,为教育带来更多可能性和机遇。根据教育部统计数据,截至2022年底,中…

AI 绘画 | Stable Diffusion 高清修复、细节优化

前言 在 Stable Diffusion 想要生成高清分辨率的图片。在文生图的功能里,需要设置更大的宽度和高度。在图生图的功能里,需要设置更大的重绘尺寸或者重绘尺寸。但是设置完更大的图像分辨率,需要更大显存,1024*1024的至少要电脑的空…

金蝶云星空二开单据明细按钮绑定了权限项但是没控制到权限的问题排查

文章目录 金蝶云星空二开单据明细按钮绑定了权限项但是没控制到权限的问题排查明细按钮:行关闭和行反关闭,分别绑定了SCM_ROWCLOSE和SCM_ROWUNCLOSE解决方案 金蝶云星空二开单据明细按钮绑定了权限项但是没控制到权限的问题排查 明细按钮:行…

windows 下 QT Android 环境搭建(QGC 4.2.x + Qt 5.15.2)

文章目录 1. QT Creator 环境搭建2. JDK1)官网途径:2) 360 安装:配置 3. SDK1) 通过 Android Studio2)QT 配置中安装 姊妹篇: win10下新版QGC地面站环境搭建全面攻略(v4.x.x QGroundControl地面站搭建&…

挑战100天 AI In LeetCode Day04(热题+面试经典150题)

挑战100天 AI In LeetCode Day04(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-62.1 题目2.2 题解 三、面试经典 150 题-63.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&am…

Spring 缓存注解这样用,太香了!

作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。 Spring 缓存常规配置 Spring Cache 框架…

[Hive] INSERT OVERWRITE DIRECTORY要注意的问题

在使用Hive的INSERT OVERWRITE语句时,需要注意以下问题: 数据覆盖:INSERT OVERWRITE语句会覆盖目标目录中的数据。因此,在执行该语句之前,请确保目标目录为空或者你希望覆盖的数据已经不再需要。数据格式:…

pytorch(小土堆)深度学习

第五节课讲项目的创建和对比 第六节:Dataset,Dataloader Dataset提供一种方式区获取数据及其label(如何获取每一个数据及其label,告诉我们总共有多少的数据) Dataloader为后面的网络提供不同的数据形式 第七节:Dataset类代码实战 显示图片 f…

Linux提权方法总结

1、内核漏洞提权 利用内核漏洞提取一般三个环节:首先对目标系统进行信息收集,获取系统内核信息及版本信息 第二步,根据内核版本获取对应的漏洞以及exp 第三步,使用exp对目标进行攻击,完成提权 注:此处可…

VR虚拟现实:VR技术如何进行原型制作

VR虚拟现实原型制作 利用VR虚拟现实软件进行原型制作可以用于增强原型测试期间的沉浸感,减少产品设计迭代次数,并将与产品原型制作相关的成本降低40-65%。 VR虚拟现实原型制作市场规模 用于原型制作的虚拟现实 (VR) 市场在 2017 年估计为 2.104 亿美元…

数据可视化PCA与t-SNE

PCA(主成分分析)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。 降维:把数据或特征的维数降低,其基本作用包括: 提高样本密度,以及使基于欧…

ClickHouse介绍和使用

ClickHouse介绍和使用 1. 简介2. ClickHouse特点3. 数据类型3.1. 整型3.2. 浮点型3.3. Decimal型3.4. 布尔型3.5. 字符串3.6. 枚举类型3.7. 时间类型 4. 表引擎4.1. TinyLog4.2. Memory4.3. MergeTree4.3.1. partition by分区(可选)4.3.2. primary key 主…