基于51单片机的手环设计仿真

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STC89C52单片机,DHT11温湿度采集温湿度,滑动变阻器连接ADC0832数模转换器模拟水位传感器检测水位,通过LCD1602显示信息,然后在程序里设置好是否有水的判断阈值,比如100,当水位没超过100,则判断没水,此时蜂鸣器报警,当水位超过100时候,蜂鸣器不报警,此时四×四按键矩阵设置湿度的下限,然后判断湿度是否低于下限,若低于下限,则继电器驱动电机转动启动加湿器,蜂鸣器报警。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#define uchar unsigned char
#define uint unsigned  int

sbit led1 = P2^4;
sbit beep = P3^0;			  //蜂鸣器引脚
sbit DS   = P3^1;                 //DS18B20温度传感器
sbit CS=P2^5;                 //adc0832引脚
sbit CLK=P2^6;
sbit DIO=P2^7;
sbit CS1=P3^2;                 //adc0832引脚
sbit CLK1=P3^3;
sbit DIO1=P3^4;
sbit CS2=P3^5;                 //adc0832引脚
sbit CLK2=P3^6;
sbit DIO2=P3^7;


unsigned char KeyNum;
static uchar u,U,R,u1,U1,R1,u2,U2,R2;      //定义心率 血氧 加速度
static uint temp;
static float ftemp = 0.0f;//温度转变
uint temp;
static unsigned char num; //计时变量
unsigned int password,count; //初始化阈值,次数,一共四位
static int wdyz,xlyz,xyyz,jsyz;
static int mode=0;
static int number=0;
static int count1=0;
static int jsflag=0;//计数标志位
static int mode1 = 0;

void tmpchange();
uint tmp();
void beep_warning();
void cshq();
void cslsz();
void csxs();

void Time0_Init()          //定时器初始化
{
TMOD = 0x01;           //定时器0工作在方式1    
IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5ms
TR0=1;                 //定时器开始
EA=1;
}



void Time0_Int() interrupt 1 //中断程序
{
   TH0  = 0xfe;             //重新赋值
   TL0  = 0x33;
    num++;
	if(num==200)
	{
	    tmpchange();        //让18b20开始转换温度
	    temp = tmp();       //读取温度
	    ftemp = temp/10.0f; //转换温度
		  num=0;
	}
	if(jsflag == 1)
	{
	count1++;
	if(count1==1000)
	{
		number++;
		LCD_ShowNum(1,14,number,3);
		count1=0;
	}
  }
	
	
	
}

uchar get_AD_Res()            //ADC0832启动读取函数 心率
{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	CLK=1;_nop_();
	
	CLK=0;DIO=0;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;_nop_();
		CLK=0;_nop_();
		data1=(data1<<1)|(uchar)DIO; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;_nop_();
		CLK=0;_nop_();
	}
	CS=1;
	
	return(data1 == data2)?data1:0;
}

uchar get_AD_Res1()            //ADC0832启动读取函数 血氧
{
	uchar i, data1=0, data2=0;
	CS1=0;
	
	CLK1=0;DIO1=1;_nop_();
	CLK1=1;_nop_();
	
	CLK1=0;DIO1=1;_nop_(); 
	CLK1=1;_nop_();
	
	CLK1=0;DIO1=0;_nop_();
	CLK1=1;_nop_();
	
	CLK1=0;DIO1=1;_nop_(); 
	
	for(i=0; i<8; i++)
	{
		CLK1=1;_nop_();
		CLK1=0;_nop_();
		data1=(data1<<1)|(uchar)DIO1; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO1<<i;
		CLK1=1;_nop_();
		CLK1=0;_nop_();
	}
	CS1=1;
	
	return(data1 == data2)?data1:0;
}

uchar get_AD_Res2()            //ADC0832启动读取函数 加速度
{
	uchar i, data1=0, data2=0;
	CS2=0;
	
	CLK2=0;DIO2=1;_nop_();
	CLK2=1;_nop_();
	
	CLK2=0;DIO2=1;_nop_(); 
	CLK2=1;_nop_();
	
	CLK2=0;DIO2=0;_nop_();
	CLK2=1;_nop_();
	
	CLK2=0;DIO2=1;_nop_(); 
	
	for(i=0; i<8; i++)
	{
		CLK2=1;_nop_();
		CLK2=0;_nop_();
		data1=(data1<<1)|(uchar)DIO2; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO2<<i;
		CLK2=1;_nop_();
		CLK2=0;_nop_();
	}
	CS2=1;
	
	return(data1 == data2)?data1:0;
}

void dsreset(void)            //发出命令
{
  uint i;
  DS=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;
  //while(DS);
}
bit tmpreadbit(void)          //读取数据
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}
uchar tmpread(void)           //读取数据
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}
void tmpwritebyte(uchar dat)  //传输数据给DS18B20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}
void tmpchange(void)          //DS18B20开始工作
{
  dsreset();
  Delay(1);
  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度
{
  float tt;
  uchar a,b;
  dsreset();
  Delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();//低八位
  b=tmpread();//高八位
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp;
}

void beep_warning() //温度传感器蜂鸣器警报并且电机转动
{
 if(ftemp>wdyz)
 {
	 beep = 1;
	 led1 = 1;
 }
 
 if(R>xlyz)
 {
	 beep = 1;
	 led1 =1;
 }
 
 if(R1>xyyz)
 {
	 beep = 1;
	 led1 = 1;
 }
 
 if(R2>jsyz)
 {
	 beep = 1;
	 led1 = 1;
 }
 
 if(ftemp<wdyz && R< xlyz && R1<xyyz && R2<jsyz)
 {
	 beep = 0;
	 led1 = 0;
 }
}


void main()					  //主函数
{	
  led1 = 0;
	beep = 0;			    //蜂鸣器关掉
	LCD_Init();         //显示屏初始化
	LCD_ShowString(1,1,"----shouhuan----");
	Delay(1000);
	LCD_Init();         //显示屏初始化
  Time0_Init();
	ET0=1;
	while(1)
	{
		  cshq(); //参数获取
      cslsz();//按键设置
		  if(mode == 5)
			{
			 beep_warning(); 
			}
		  if(mode1 == 0)
			{
				csxs();//参数显示
			}
	}
}

void csxs() //参数显示
{
	LCD_ShowString(1,1,"wd:");
	LCD_ShowNum(1,4,ftemp,3);
	LCD_ShowString(1,7,"xl:");
	LCD_ShowNum(1,10,R,3);
	LCD_ShowString(2,1,"xy:");
	LCD_ShowNum(2,4,R1,3);
	LCD_ShowString(2,8,"jsd:");
	LCD_ShowNum(2,12,R2,3);
}

void cshq() //参数获取
{
	 u=get_AD_Res();
		  U=(250*u)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		  R=200*U/250;     //获取心率
	
	 u1=get_AD_Res1();
		  U1=(250*u1)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		  R1=200*U1/250;     //获取血氧
	
	 u2=get_AD_Res2();
		  U2=(250*u2)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		  R2=200*U2/250;     //获取加速度
}

void cslsz()//按键判断
{
	KeyNum = MatrixKey();//键盘输入的值进行传递
	if(KeyNum){	
	if(KeyNum <= 10) //把按键的范围定义在0~9
	{			
	  if(count < 3)
		{
			password*=10; //出水量左移一位
			password += KeyNum % 10; //获取一位出水量
			count++;    //计次++,对应出水量位数
		}
			LCD_ShowNum(1,4,password,3); //LCD更新显示
	}	
	//确认键
	  if(KeyNum == 11) //把11表示确认,对阈值进行确认
		{
		 LCD_ShowNum(1,4,password,3); //LCD更新显示
			switch(mode)
			{
				case 1:wdyz = password;LCD_ShowNum(2,1,wdyz,3);break;
				case 2:xlyz = password;LCD_ShowNum(2,5,xlyz,3);break;
				case 3:xyyz = password;LCD_ShowNum(2,9,xyyz,3);break;
				case 4:jsyz = password;LCD_ShowNum(2,13,jsyz,3);break;
			}
		}		
		//取消键
		if(KeyNum == 12)
			{
				password = 0;
				count = 0;
				LCD_ShowNum(1,4,password,3); //LCD更新显示
			}
			
			if(KeyNum == 13)  //q切换
			{
				mode++;
				password = 0;
				count = 0;
				LCD_ShowNum(1,4,password,3); //LCD更新显示
				switch(mode)
			{
				case 1:LCD_ShowString(1,1,"wd:");break;
				case 2:LCD_ShowString(1,1,"xl:");break;
				case 3:LCD_ShowString(1,1,"xy:");break;
				case 4:LCD_ShowString(1,1,"js:");break;
			}
				password = 0;
				count = 0;
				if(mode>5)
				{
					mode = 0;
				}
			}
			
			if(KeyNum == 14)
			{
				jsflag++;
				if(jsflag>1)
				{
					jsflag = 0;
				}
			}
			if(KeyNum==15)
			{
				LCD_Init();         //显示屏初始化
				mode1++;
				if(mode1>1)
				{
					mode1=0;
				}
			}
		} 
	

  
}

四、实现现象

具体动态效果看B站演示视频:

基于单片机的手环设计

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载

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

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

相关文章

JavaEE: 创造无限连接——网络编程中的套接字

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一&#xff1a; 拓扑排序 软件构建 题目链接&#xff1a;卡码网&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文…

机器人的动力学——牛顿欧拉,拉格朗日,凯恩

机器人的动力学推导方法有很多&#xff0c;常用得有牛顿&#xff0c;拉格朗日&#xff0c;凯恩等方法&#xff0c;接下来&#xff0c;简单说说他们之间的使用。注&#xff1a;这里不考虑怎么来的&#xff0c;只说怎么应用。 参考1&#xff1a;4-14动力学分析方法-牛顿—欧拉方…

聚焦API安全未来,F5打造无缝集成的解决方案

研究发现&#xff0c;目前超过90%的基于Web的网络攻击都以API端点为目标。随着对API使用需求的增加&#xff0c;这些攻击还会持续增长。现代企业需要一种动态防御策略&#xff0c;在风险升级成代价高昂、令人警惕且往往无法预防的API安全漏洞之前&#xff0c;发现并降低风险。 …

数据库提权【笔记总结】

文章目录 UDF提权以有webshell只有数据库权限条件复现msf工具sql语句提权 MOF提权前言条件复现msf工具php脚本提权 sqlserver提权前言条件xp_cmdshell提权复现 沙盒提权介绍复现 Oracle提权靶场搭建执行任意命令复现 通过注入存储过程提权&#xff08;低权限提升至DBA&#xff…

C++从入门到起飞之——多态 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.1.1 实现多态还有两个必须重要条件&…

群晖NAS使用Docker本地部署网页版Ubuntu系统并实现无公网IP远程访问

文章目录 前言1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 前言 本文旨在详细介绍如何在群晖NAS部署docker-webtop&#xff0c;并结合c…

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…

高配小主机加装SSD固态硬盘,我选择性能与设计兼备的希捷酷鱼 530

高配小主机加装SSD固态硬盘&#xff0c;我选择性能与设计兼备的希捷酷鱼 530 哈喽小伙伴们好&#xff0c;我是Stark-C~ 我最近入手了零刻的一款新发布的 GTi12 Ultra高性能迷你主机&#xff0c;其出色的配置与强大的功能让我有了将它用作主力机的打算。不过因为它的高配版本搭…

【记录一下VMware上开虚拟端口映射到公网】

材料 win11 和装在vmware上的ubuntu 步骤一在Ubuntu上配置静态地址&#xff0c;配置如下 vim /etc/netplan/01-network-manager-all.yaml(此文件看系统上对应的是哪个文件&#xff0c;建议先备份)network:version: 2renderer: NetworkManagerethernets:ens33:dhcp4: falseadd…

四十一、完成内容添加功能(使用go测试方法)

目录 一、添加model 二、完成相关dao 三、使用测试类进行测试 1、把光标防止要测试的方法上&#xff0c;右击并选择 2、自动会生成一个以dao文件加_test命名的文件 3、在其中完善方法并完成测试 四、完成content_create_handle 一、添加model 按数据库字段以及字段格式完…

Android 如何实现搜索功能:本地搜索?数据模型如何设计?数据如何展示和保存?

目录 效果图为什么需要搜索功能如何设计搜索本地的功能&#xff0c;如何维护呢&#xff1f;总结 一、效果图 二、为什么需要搜索功能 找一个选项&#xff0c;需要花非常多的时间&#xff0c;并且每次都需要指导客户在哪里&#xff0c;现在只要让他们搜索一下就可以。这也是模…

基于SpringBoot+Vue的剧本杀管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

AIGC7: 高通骁龙AIPC开发者沙龙过程记录A

图中是一座高耸的宫殿。 就像AI的出现&#xff0c;慢慢初现端倪&#xff0c;头角峥嵘。 背景 一直以来都比较关注AI的发展&#xff0c;有幸再一次参加异常AI的盛会。 从我的角度看。 高通是一家生产芯片的公司&#xff0c;国内的小米&#xff0c;荣耀&#xff0c;Oppo , Vi…

华为为什么要做三折叠屏手机?

前些天我做了一条视频&#xff0c;关于讲华W的新的三折叠屏手机。我说我有点失望&#xff0c;结果引起了华W的同事的一些关注。于是&#xff0c;华W几位高管都跑过来&#xff0c;跟我解释为什么会出现这样的一个状态。 我才知道&#xff0c;这款手机他们其实是亏着钱在卖的。因…

【测试】——Selenium API (万字详解)

&#x1f4d6; 前言&#xff1a;本文详细介绍了如何利用Selenium进行Web自动化测试&#xff0c;包括定位元素&#xff08;如cssSelector和xpath&#xff09;、常用操作函数&#xff08;如点击、输入等&#xff09;、窗口管理、键盘鼠标事件和浏览器导航&#xff0c;以及处理弹窗…

图说GPT网络结构(参数量与计算量估计)

现在AI领域的主流模型几乎都是Transformer网络架构衍生而来。大热的LLM中的生成类模型很多都是来自于Transformer的变体&#xff0c;即decoder only架构。而GPT就是该类中的经典模型。尽管现在变体甚多&#xff0c;但大多没有根本性地改变其套路。 为了阐述方便&#xff0c;首…

音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

数据安全治理

数据安全治理 1.数据安全治理2.终端数据安全加密类权限控制类终端DLP类桌面虚拟化安全桌面 3.网络数据安全4.存储数据安全5.应用数据安全6.其他话题数据脱敏水印与溯源 7.UEBA8.CASB 1.数据安全治理 数据安全治理最为重要的是进行数据安全策略和流程制订。在企业或行业内经常发…

[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?

1. 论文简介 论文《Can VLMs Play Action Role-Playing Games? Take Black Myth Wukong as a Study Case》是阿里巴巴集团的Peng Chen、Pi Bu、Jun Song和Yuan Gao&#xff0c;在2024.09.19提交到arXiv上的研究论文。 论文: https://arxiv.org/abs/2409.12889代码和数据: h…