学习STC51单片机29(芯片为STC89C52RCRC)
每日一言
人生没有重来的机会,珍惜当下,全力以赴
3.串口接收数据
那么我们要是想要将数据在电脑上面的串口助手显示,那么我们就需要建立起串口通信,
1初始化波特率的代码 2.发送字符和发送字符串到串口的函数
我们需要做到以上两点
所以我们要加入这些代码
初始化9600波特率 发送字符和发送字符串到串口的函数
我还需要讲一下原理吗 ??? 亲爱的少年,请你好好的巩固你的江山
原理就是,我们不是通过那个datainfo[]这个数组将数据都存放到这里了吗
这个sendByte(此参数是一个字节的数据)
那我们就可以利用sendByte函数,或者是说sendString函数将数据发送到SUBF发送寄存器,然后由SUBF发送到PC的接收寄存器,那么SUBF为什么可以发送,凭借着相同的波特率和usb转ttl的ch340芯片,pc有ch340驱动、单片机有ch340芯片,这样两者就可以进行串口通信了,别看数据线是没有显示RXD和TXD的但是其实是有的,只是我们看不到....
代码展示
这边主要就是讲一下sendByte(datainfo[0]/10+0x30);
这个参数的意思,为啥要这样设置
比如datainfo[5]这个数组里面不是第一项都是湿度的整数吗,那如果DHT11传上来的01010010这样的二进制数,而且他是想要表示的是37,可是这个是数字37,那么我们再将这个直接传给串口助手的话,他是会讲这个37作为ASCII码值转换成字符的,那就不是我们想要的了,所以我们要将datainfo[]数组里面的数字37转换成字符37再传给串口,这样才是我们想要的
我们先将整数的十位取出来,再将个位转取出来,取十位就是/10 ,取个位就是%10(c语言基础),加上0x30,为什么加上0x30呢,因为是 ’字符0’的16进制,对应ASCII码值为48(十进制),那么我可以通过取出来的十位(比如5)或者个位加上48,得到比如53这个ASCII码,那么53对应的就是字符5 (注意,这也是我们为什么要用十位和个位取出来的一个方向)
这样我们的串口助手就可以收到正确的信息了,其实还有一个点就在串口助手是用文本模式接收的,那么肯定就是需要字符啊,不是字符的格式,那么就是会有误啊
这样就OK啦
4.LCD显示温度
我们将LCD的代码与DHT11的代码整合起来
主要的区别点在哪?
就是将temp温度 和 humi湿度的数据存放到数组里面,进行整合一下,那为什么要存放到数组里面呢?1、其实也跟我们LCD的显示字符串的函数有关,因为需要传进去的是指针,2、封装函数显得main函数不会那么多代码,
在写一个函数用于构建temp数组和humi数组,这样我们调用的时候,就可以都获取到全部数据了,循环调用,数据会不断的刷新,最后我们的show_string()
函数里面的第三个参数就填数组名就好了,因为show_string函数的第三个函数接收的是指针,那么我们直接传数组名,就等于是数组的首地址,随后一个个遍历出来
复习一下:
二、DataBuffer 的作用:数据暂存与读写控制
1. 写操作(单片机→LCD)
流程:
① 单片机将数据(如字符 'A' 的 ASCII 码0x41)写入dataBuffer。
② 设置控制信号:RS=1(数据模式),RW=0(写操作),E=1→0(触发使能)。
③ dataBuffer中的数据通过 8 位数据线传输到 LCD 的数据寄存器(DR),LCD 根据 DR 中的内容执行显示动作(如在当前光标位置显示字符)。
核心原理:
LCD 内部有显示缓冲区(DDRAM),当 DR 接收到数据后,会将其写入 DDRAM 对应的地址,而 LCD 的控制器会周期性扫描 DDRAM,并将数据转换为驱动像素的电信号,最终在屏幕上显示字符
分文件优化代码
我们来优化一下又长又臭的代码!!!!
我们这个代码不是来到了300行嘛,那肯定是很难受的,且不易于维护,那么我们就要进行分文件优化代码
最终效果
会发现多了好多文件,这就是最终的效果
怎么操作??
我们右键sourse group 1 选择第二个添加新文件
举个例子这边用delay
我们不是有很多模块吗,都是先给每一个模块创建一个.c文件,还有一个.h文件
先讲.c文件
我们将main函数里面比如有关delay、uart啊等等,把他们分别剥离到属于他们自己的.c文件中,只要,是有关的都给剥离出来。也就是模块化,一个个模块分清楚
随后我们讲一讲.h文件里面的内容
这个.h文件里面的内容就是,将.c文件复制过去,删掉比如引脚、宏定义、等等。只要留下函数,并把函数体删掉,.h文件的作用目的是做声明函数的作用
就像我们在图书馆看书,.h文件就是目录,.c文件就是内容
我们main函数要引用.h文件啊
这样我们的main函数调用函数的时候才可以找得到对应的函数。
别忘了,要会看编译错误的信息,因为有些就是需要我们加上引用其他的头文件,比如uart.c是关于串口的文件,那么是不是那些寄存器的定义都不懂,所以我们要加上reg52.h文件,当然了这个文件就是51单片机对寄存器那些名字的声明,和我们的.h文件实质上是一样的,就是你的.c文件里面的代码需要用到另外一个.c文件里面的函数,那我们就需要引用另外一个文件的.h文件
最后对于我们这个代码,重点来了
我们这个main函数里面不是需要用到humi和temp数组吗,但是这两个数组是dht.c文件里面的,然后我们是不能重复定义的(肯定啊,语法) ,但是main函数我们又要用到这个两个数组,那么我们可以利用extern这个关键字
这个关键字呢通俗的讲:就是可以直接调用dht.c函数的temp和humi的数组,而不是自己创建 自己创建的能一样吗,直接语法错了不让重复定义,(在python中:县长张三和村长张三能一样吗?)
好了,这样就符合我们的main函数的编译和运行了,就成功了,就是那么舒服
分文件优化代码的视频(跟着视频操作,或者看一下,一下就懂了)