设计与开发

51单片机实时 【072】基于51单片机水平仪实物演示视频

小编 2024-10-21 设计与开发 23 0

【072】基于51单片机水平仪实物演示视频

大家好,下面给大家演示一下G51单面机的水平仪设计。

·首先看一下电路板,左上角是定位器,用来调节液晶显示屏的清晰度。下面是接液晶显示屏的介绍,就是LCD1102液晶显示屏。这个是指示灯,这边是存储芯片,应该存储角度的上下限制。

·这51单面机的下载银架,这个是ADS0345,这个是三轴加速度传感器,角度就通过传感器进行测量出来的。下面前面三个按键是功能按键,第四个打的是单面机的复位按键。左下角这边是电接口,下面一个电源开关。

·首先接上液晶显示屏,接上电源,采用的是五伏USB新供电。接上电源之后将下面的开关向左拨,打开电源开关。现在开始,先打开电之后显示的是当前角度,放到水瓶的时候是因为放在桌子上面,角度就接近是零度,测量的精度差不多是正负一度左右,现在是显示负零点零点三度。

·比如现在往这边抬是显示负的,这个是负值,这边显示是L就表示左边太高,超过左边的线值。往右边这边是显示,就表示右边超过右边的线值。指示灯用在闪烁提醒,提醒这边比较高。

·水平仪比如先看一下按下面的功能按键,第一个按键就设置,可以设置角度,比如现在要将这个东西固定到角度是多少,固定到三到五度之间,都是正的来说三到五度之间。现在是表示右边比较太高了,所以要左边往上抬,不是左边太高应该显示L是左边太高,右边要往上抬一点,抬到三到五度之间,这边显示的就消失了,指示灯也停止。

·继续往上抬的,又超过五度了,表示右边太高了,左边应该要往上抬一点,这就水平要调节水平角度。重新设置一下,这个是可以设置正设置范围的,A起是左边,L是右边上下限制,这边的是设置范围是负九十度到正九十度,设置到这个位置。

·第三个按键现在这种状态下就在测量,这个时候是测量时候左右抬到角度就会变化。第三个按键是等于是清零键,比如现在这个时候角度是用手垫一下,角度差不多就是十度左右,要把它清零,就从这个位置开始把它标记成零,之后转的角度给它计算出来。

·比如要按下清零,按下清零键之后角度变零,这边有个箭头就表示当前是清零,清完零之后的现在再继续已经抬到,这时候显示的角度就后面所抬的角度了。

·往右边抬的数值是变小,就是变负的,往左边弹是增加,左边是增加。

·放到桌面,刚才说桌面本来是要显示零左右的,但是因为刚才手电一样按着清零键,那时候至少请重新归零,这个镜头就没掉了。

·第三个按键功能的作用就是比如要设置一个东西的角度,就从这个角度的东西的下面假设要算一个什么东西?不好说,假设要算一个东西,比如起始位置在这边,中指位置在这边,这时候如果这样子算的,现在要算到十一,抬到这个位置,比如现在是抬到二十,要二十减十一,要自己去计算等于九,采用这个功能的就不用按一下清零。

·清零之后的往上抬,抬到这个位置的就行,就等于九或者等于多少,就是后面所抬的角度,这个功能是这样子。

·还有个功能就是校准的功能,校准功能是按第二个按键就进入校准,校准是什么校准?首先短,可以先向左、向右都可以,都没关系。向左的比如左边往上抬,这时候第一行的先解释一下,这是最小值,这最大值,这个是实时测量的值,这个值是实时测量,这个是记录最小跟最大,测量出来最小是多少?

·就这边一直往上抬,抬到基本上达到垂直的时候,这个值就是已经达到最小,不会再继续变小的时候就可以了,抬的时候可以慢一点,这样子轻轻的往上晃一下,要左右摆一下,这样子会比较准确一点。

·这个是测量出最小值是四点五,这边的就像向右边也是一样垂直,基本上达到垂直之后左右摆一下,这最大值是一百七十六点九,采集完之后短按掉个确认就可以了,这时候是校准完了。

主要就给大家演示到这里,现在。

51单片机实现温湿度传感器实时监控并LCD显示的解决方案

简介:

51单片机STC89C52RC是本方案的选用芯片,以其8位处理和极低的价格来看,是很适合进行本次实验。LCD显示屏本次选用的型号是1602A。

在实现51单片机实现温湿度传感器实时监控并LCD显示的基础功能后,还可以通过单片机的串口通信和WIFI模块或者Zigbee模块进行物联网连接,使设备连接互联网,再通过TCP连接进行物联网的一整套方案,包括手机APP实时监控数据,也可以是手机APP远程开启风扇来调节温度或者湿度,但这些不在本次方案中细说,本人已经实现上述功能,只是技术不完善,所以不在此公布。

Protues8仿真图:

51单片机完整程序(代码很长,但是完整,可以直接复制使用):

//****************************************************************//

//

//

//

//

//

//****************************************************************//

#include <reg52.h>

#include <intrins.h>

#include <lcd.c>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

//

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */

typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */

typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */

typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */

typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */

typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

//

#define uchar unsigned char

#define uint unsigned int

#define Data_0_time 4

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit P2_0 = P2^0 ;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8 U8FLAG,k;

U8 U8count,U8temp;

U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

U8 U8comdata;

U8 outdata[5]; //定义发送的字节数

U8 indata[5];

U8 count, count_r=0;

U8 str[5]={"RS232"};

U16 U16temp1,U16temp2;

U8 a[]={"Temperature: "};

U8 b[]={"Humidity: "};

U8 wd_sw,wd_gw,sd_sw,sd_gw;

void Delay(U16 j)

{

U8 i;

for(;j>0;j--)

{

for(i=0;i<27;i++);

}

}

void Delay_10us(void)

{

U8 i;

i--;

i--;

i--;

i--;

i--;

i--;

}

void COM(void)

{

U8 i;

for(i=0;i<8;i++)

{

U8FLAG=2;

while((!P2_0)&&U8FLAG++);

Delay_10us();

Delay_10us();

Delay_10us();

U8temp=0;

if(P2_0)U8temp=1;

U8FLAG=2;

while((P2_0)&&U8FLAG++);

//超时则跳出for循环

if(U8FLAG==1)break;

//判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1

U8comdata<<=1;

U8comdata|=U8temp; //0

}//rof

}

//--------------------------------

//-----湿度读取子程序 ------------

//--------------------------------

//----以下变量均为全局变量--------

//----温度高8位== U8T_data_H------

//----温度低8位== U8T_data_L------

//----湿度高8位== U8RH_data_H-----

//----湿度低8位== U8RH_data_L-----

//----校验 8位 == U8checkdata-----

//----调用相关子程序如下----------

//---- Delay();, Delay_10us();,COM();

//--------------------------------

void RH(void)

{

//主机拉低18ms

P2_0=0;

Delay(180);

P2_0=1;

//总线由上拉电阻拉高 主机延时20us

Delay_10us();

Delay_10us();

Delay_10us();

Delay_10us();

//主机设为输入 判断从机响应信号

P2_0=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行

if(!P2_0) //T !

{

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束

while((!P2_0)&&U8FLAG++);

U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while((P2_0)&&U8FLAG++);

//数据接收状态

COM();

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

P2_0=1;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}//fi

}//fi

}

void main()

{

U8 i,j;

LcdInit();

Delay(1); //延时100US(12M晶振)

while(1)

{

RH();//调用温湿度读取子程序

str[0]=U8T_data_H;

str[1]=U8T_data_L;

str[2]=U8RH_data_H;

str[3]=U8RH_data_L;

str[4]=U8checkdata;

wd_sw=U8T_data_H/10%10+0x30;

wd_gw=U8T_data_H%10+0x30;

sd_sw=U8RH_data_H/10%10+0x30;

sd_gw=U8RH_data_H%10+0x30;

a[12]=wd_sw;

a[13]=wd_gw;

a[14]=0xdf;

a[15]='C';

a[16]='\0';

LcdWriteCom(0x00+0x80);

for(i=0;i<16;i++)

{

LcdWriteData(a[i]);

}

b[9]=sd_sw;

b[10]=sd_gw;

b[11]='\%';

b[12]='\0';

LcdWriteCom(0x42+0x80);

for(i=0;i<12;i++)

{

LcdWriteData(b[i]);

}

//读取模块数据周期不易小于 2S

Delay(30000);

}

}

相关问答

51单片机 向PC机 实时 发送数据,我发送的是一个数字,但PC机收到的数据是91,为什么不是1呢?

这要问你,单片机发送的数据是十六进制数,还是字符,即ASCII码?PC机接收是用串口助手吗?接收的数据是以十六进制数显示的,还是显示的字符,必须与单片机发送...

51单片机 为什么自己会中断?

51单片机之所以会自己中断,是因为它内部集成了中断控制器。中断是一种机制,允许外部设备或内部事件打断正常的程序执行流程,优先处理紧急或重要的任务。当外...

51单片机 教程有哪些推荐?

有没有什么教程,视频比较好的,或者有什么好的方法呢?

51单片机 定时器0的中断响应过程?

8051单片机有5个中断源和两个中断优先级,高优先级的中断源可以中断低优先级的服务程序,反之不行。INT0>T0>INT1>T1>串口中断。8051没有专门的开中断和关中断....

上位机怎样 实时 检测 单片机 所测数据?

这个很简单,花个几十块钱买个蓝牙收发模块就行。单片机有串口就行,接串口蓝牙小电路板,上位机手机进行搜索连接。不过你需要进行二次开发,手机端需要开发蓝牙...

利用 单片机 进行液位检测并显示的基本原理进行阐述?

单片机液位检测原理是通过将传感器与单片机连接,实时检测液位高低,将传感器输出的信号转换为数字信号并进行处理,最终通过LED或LCD等显示器显示液位高低情况。...

想学习 单片机 ,有什么好的书籍推荐?

五年之前那是在大学期间,距离现在大约有4年了吧,教我们单片机的老师要离我们而去了,因为她要去她的城市教书去了。怎么形容她呢?那是一个风度翩翩,很有才华...

批处理、分时、 实时 操作系统有什么区别?

批处理——以前的大型机(Mainframe)上所采用的系统,需要把一批程序事先写好(打孔纸带),然后计算得出结果分时——现在流行的PC,服务器都是采用这种运行模...

51单片机 机和其他单片机区别?

简单来说,arm是单片机的一种,51也是,但arm的ROM和RAM远大于51,而且IO口功能和处理速度也是两个级别的,arm能上很多操作系统,51只能勉强上极其简单的实时操...

为什么自己设计不出来 单片机 程序?该怎么做?

设计编写单片机程序是一个渐进的过程不可一蹴而就,毕竟单片机程序是与硬件有密切关系的,我们一般称为单片机程序叫底层硬件驱动程序。编写程序不但要对软件要熟...

猜你喜欢