如何使用app inventor 软件通过蓝牙模块控制单片机流水灯单片机亮灭

  今天记录一下前几天做的一个关於智能窗户APP的制作过程这次制作是通过APP inventor来实现的下面是最原始的版本,虽然有点丑但这都不是重点,以后有待改进

(1)APP初次打开的顯示:

如图所示,这一APP有获取蓝牙地址、连接蓝牙、开关灯、气泵的开关、智能模式的开关、湿度的显示等功能

图中程序的作用是:当初次打开APP程序,屏幕会出现提醒语“欢迎使用本软件”然后使按键“连接”、“打开气泵”、“开灯”和定时器功能失效,“蓝牙地址”功能正常

(2)蓝牙地址的获取:

图中“1”的作用是:当列表1(即按键“蓝牙地址”)打开之前将蓝牙地址的名称发送到列表1

图中“2”嘚作用是:当列表1点击后,屏幕上显示提醒语“选择前请确认已与手机配对”选择蓝牙地址后,将选择的蓝牙地址赋值给全局变量name然後让按键“连接”的功能恢复。

当按键“连接”被触动时恢复按键“开灯”、“打开气泵”和定时器的功能,让屏幕出现提醒语“已点擊请等待两秒”然后进入一个条件语句,如果蓝牙已经连接令蓝牙断开,然后将按键“连接”的内容变为“请连接”并让屏幕显示请“连接”;如果蓝牙没有连接令蓝牙和刚列表选择的蓝牙地址连接,并将按键“连接”内容改为“断开连接”和用提醒语在屏幕上显示“连接成功”

(注意:dakai即是按键“打开气泵”)

图中程序的作用是:当按键“dakai”被触动是,如果当时的按键内容为“打开气泵”则让藍牙发送“1”到arduino,将字体颜色改为绿色并且将按键内容改为“关闭气泵”;如果按键内容为“关闭气泵”,则将字体颜色改为黑色让藍牙向arduino发送“2”,并且按键内容改为“打开气泵”

图中程序的作用:当按键“开灯”被触动是,如果当时按键内容为“开灯”则让蓝牙姠arduino发送"5",将字体颜色改为黑色并将按键内容改为“关灯”;如果当时按键内容为”关灯“,则让蓝牙想arduino发送“6”将按键内容改为“开灯”,并将字体颜色改为黄色

(6)智能模式的开关:

  图中的作用:当按键“智能模式”被触动时,如果当时按键内容为“智能模式”则让藍牙向arduino发送"8",将字体颜色改为黄色并将按键内容改为“关闭模式”;如果当时按键内容为”关灯“,则让蓝牙想arduino发送“9”将按键内容改為“智能模式”,并将字体颜色改为黑色

(7)蓝牙的接收和发送:

图中一开始我定义了两个全局变量,分别为text,和text2然后当定时器(1秒接收10次)达到定时的时间后,如果蓝牙有检测到数据则让蓝牙接收3个数据并将其赋值给全局变量text,然后通过湿度的算法计算出湿度并将结果赋值给text2计算公式为sqrt((100-(text-285/4))^2),实际上湿度是不会超过100%的,但安全起见我在程序中加了个检测环节如果text2>100,则令其等于100;最后将text2赋值给Label的内容以此在手机上显示。

}

本次笔记包含两个方面:

1.只是控淛LED的亮灭不返回数值

2.控制LED的亮灭,并返回数值

看了几讲的视频都是在讲串口的方式1。其他的还没接触这里也只用串口的方式1实现这兩个功能。串口里面需要计算的地方是根据所要使用的波特率求定时器的初始值定时器使用的是方式2,可以自动装初始值避免赋值语呴装初始值时出现误差。

以9800bps定时器使用方式2,串口使用方式1晶振波特率为 11.0592MHZ,求TH1跟TL1的值

方式1的波特率 = (2^SMOD/32)xT1溢出率。单片机复位后电源管悝寄存器PCON全部清零,SMOD作为其中一位自然也清零

波特率已经知道了。这样就剩下T1溢出率了

假设初值为X,则定时器每次计256-X个数溢出一次(定時器为8位最大为255 。256时发生溢出)每计一个数的时间为一个机器周期,机器周期 = T时钟周期 X 12 于是溢出的时间为 = 个数X 每个时间 = ( 256 - X) * 12/Fosc . 那么基础率就昰溢出时间的倒数。

于是结合公式“方式1的波特率 = (2^SMOD/32)xT1溢出率”式子可以总结为:

在此基础上,如果把SMOD 设为1 则 求得波特率为  :

如果把晶振換成12MHZ再求初值,求得的X为: 252.744792…… 无穷小数这样就会产生误差。以前一直感觉整数的晶振挺好现在才知道为什么会有11.0592MHZ这种晶振的存在了,呵呵

这样计算得到了初值,下面贴代码

只是控制LED的亮灭,不返回数值

实现这个又分为查询和中断两种方法

A。先用查询感觉叫判斷更好些,因为是用if判断来实现的

* 此处使用的是查询法判断接收中断标志位所以即便不开启中断允许位,也可以 if(RI == 1)//RI为接收中断标志位硬件置为1,必须软件清0

这两个除了代码感觉就是是否开启中断允许了。因为RI置为1是硬件自动执行的即便是不开启中断允许位,照样可以鼡if进行判断

上面这两个是单方向的,再来个双向的

*通过串口给下位机发送数据,并使之显示在P1口的流水灯单片机上 *同时单片机返回接收到的数据,显示在串口助手上 /* 刚开始单片机缓冲寄存器为空无数据可以显示 * 先从串口接收数据,再返回该数据 * 在中断中接收数据哃时将flag标志位置为1.说明接收到了数据 * 若接收到数据(flag == 1),说明接收到了;否则说明未接收到数据不显示。继续判断flag数值 ES = 0; //关闭串口中断发送數据

主函数里面那个flag = 0  。 一定不能少了否则只要一小会儿的功能,串口助手就卡了。。

这个例子里还有两条语句比较关键:

SBUF是这么写嘚:SBUF 串行数据缓冲寄存器一个发送缓冲寄存器,一个接收缓冲寄存器两个公用一个地址99H,但在物理上是两个独立的寄存器那么如何區分是发送还是接收呢?就用语句来区分了

控制流水灯单片机的话,需要发送十六进制格式的

比如发送FB(1111,1011)在我的开发板上是L2灯煷。如果发送字符就不太好控制了。如果用2中的例程以字符方式发送“fb”,单片机返回串口助手并用十六进制显示为“62” .这个嗯,目前不会算 :P

没啥值得纪念的图片还是几个流水灯单片机。不过此时的流水灯单片机非彼时的流水灯单片机。现在的流水灯单片机可昰我从电脑上就能控制开发板上的了:D

只是不知道下次自己写个上位机是什么时候了,呵呵

}

为用户提供各种低成本,低功耗,低能耗,功能强的微控制器解决方案.恩智浦微控制器,高性能,设计新颖,性能稳定,价格超低,欲购从速,欢迎垂询!

}

我要回帖

更多关于 流水灯单片机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信