LED 驱动电路图
下面我们来看一下本次实验所用到的控制寄存器中每一位的取值所对应的意义:
P1DIR (P1 方向寄存器,P0DIR 同理)
P1SEL (P1 功能选择寄存器, P0SEL 同理)
寄存器的设置:
将控制寄存器的某一位置 1:
例: P1DIR |= 0X02;
解释:”|=“表示按位或运算,0X02 为十六进制数,转换成二进制数为 0000 0010 ,若 P1DIR 原 来的值为 0011 0000,或运算后 P1DIR 的值为 0011 0010。根据上面给出的取值表可知, 按位与运 算后 P1_1 的方向改为输出,其他 I/O 口方向保持不变。
将控制寄存器某一位清 0:
例: P1DIR &= ~0X02;
解释:”&=“表示按位与运算,”~“运算符表示取反,0X02 为 0000 0010,即~0X02 为 1111 1101。 若 P1DIR 原来的值为 0011 0010,与运算后 P1DIR 的值为 0011 0000。
1.4 实验内容
通过上述实验原理得知,要实现 D6、D7 的点亮熄灭只需配置 P1_0、P1_1 口引脚即可, 然后将引脚适当的输出高低电平则可实现 D6、D7 的闪烁控制。 下面是源码实现的解析过程:
/\* 主函数 \*/
void main(void){
xtal\_init();
led\_init();
uart0\_init(0x00, 0x00); //初始化串口
lcd\_dis(); //在LCD上显示实验内容、MAC地址等相关信息
while(1){
led\_test();
}
}
主函数中主要实现了以下步骤:
1)初始化 LED 灯即 led_init():设置 P1.0 和 P1.1 为普通 I/O 口, P1 方向为输出,关闭 D6、D7 灯。
2)在主函数中使用 while(1) 等待 LED 灯开关的测试即可。
通过下面的代码来解析 LED 灯的初始化:
/\* led初始化 \*/
void led\_init(void){
P1SEL &= ~0x03; //P1.0和P1.1为普通I/O口
P1DIR |= 0x03; //输出
D7 = 1; //关LED
D6 = 1;
}
上述代码实现了 P1 选择寄存器和方向寄存器的设置,并将 LED 灯的电平置为高电平,即初始 状态下 LED 灯灭。接下来就只需要实现 LED 灯的轮流闪烁了, 通过下面的代码来解析 LED 灯开关的测试:
/\* led闪烁函数 \*/
void led\_test(void){
D7 = 0;
D6 = 1;
Uart\_Send\_String("{data=D6=OFF;D7=ON}"); //在LCD上更新LED状态信息
halWait(250);
halWait(250);
halWait(250);
halWait(250);
D7 = 1;
D6 = 0;
Uart\_Send\_String("{data=D6=ON;D7=OFF}"); //在LCD上更新LED状态信息
halWait(250);
halWait(250);
halWait(250);
halWait(250);
}
上述代码中,通过改变 LED 灯的电平高低来实现灯的亮与灭,即每隔 1s 让 LED 灯闪烁一次, 并在 LCD 上显示当前的 LED 状态。 为了增加实验效果,也可以手动更改闪烁时间。其中, 延时函数的代码如下:
/\* 延时函数 \*/
void halWait(unsigned char wait){
unsigned long largeWait;
if(wait == 0){
return;
}
largeWait = ((unsigned short) (wait << 7));
largeWait += 114 \* wait;
largeWait = (largeWait >> CLKSPD);
while(largeWait--);
return;
}
下图 2.2.2 是本节 LED 实验的流程图:
LED灯实验流程图
通过图 2.2.2 流程图可得知,实现 D6、D7 的轮流闪烁, 会经过系统时钟初始化的过程,而且系 统时钟初始化是必须的, 8051 微处理器的正常运行,必须要经过系统初始化,也就是 xtal_init () 方法,该方法在 sys_init.c 源文件中定义。而在 main.c 中并没有看到调用系统时钟初始化的方法, 这是因为官方库文件已经将系统时钟初始化的方法的调用过程写进启动文件中了。 (在后面的所有章 节中也需要涉及到系统时钟的初始化, 将不再重复说明)
1.5 实验步骤
- 正确连接 SmartRF04 仿真器到 PC 机和 ZXBee CC2530 节点板,确定按照第一章 1.2 节 设置节点板跳线为模式一, 打开 ZXBee CC2530 节点板电源(上电)。
- 打开实验工程: 在文件夹“05-实验例程\第 2 章\2.2-LED”下双击打开工程 LEDs.eww,选 择 Project->Rebuild All 重新编译工程。
- 将连接好的硬件平台上电(CC2530 务必按下开关上电),然后按下 SmartRF04 仿真器上 的复位按键。接下来选择 Project->Download and debug 将程序下载到 CC2530 节点板。
- 下载完后将 CC2530 重新上电或者按下复位按钮,观察两个 LED 的闪烁情况和 LCD 上的 显示内容。
- 修改延时函数,可以改变 LED 小灯的闪烁间隔时间。
1.6 实验结果
LED
2 实验名称——温湿度传感器实验
温湿度传感器实验
2.1 实验目的
- 掌握 DHT11 温湿度传感器的使用
- 通过 CC2530 读取 DHT11 的温湿度数据,并通过串口显示出来
2.2 实验环境
- 硬件:ZXBee CC2530 节点板一块,温湿度传感器板一块,USB 接口 SmartRF04 仿真器,调试转接板, PC 机,USB mini 线
- 软件: Windows XP/Windows 7/8/10 ,IAR 集成开发环境,串口调试工具(超级终端)
2.3 实验原理
本实验中通过 CC2530 IO 口模拟 DHT11 的读取时序,读取 DHT11 的温湿度数据。
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感器都在极为精确的 湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达 20 米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。使用 4 针单排引脚封装。连接方便。
温湿度模块与 CC2530 部分接口电路如下图 3.2.1 所示:
温湿度模块与CC2530 部分接口电路
下面介绍一下 DHT11 的获取温湿度值的原理:
DHT11 的串行接口
DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次通讯时间 4ms 左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为 零。操作流程如下:
一次完整的数据传输为 40bit ,高位先出。
数据格式:8bit 湿度整数数据 +8bit 湿度小数数据 +8bit 温度整数数据 +8bit 温度小数数据+8bit 校验和数据传送正确时校验和数据等于“ 8bit 湿度整数数据 +8bit 湿度小数数据+8bit 温度整数数 据 +8bit 温度小数数据 ” 所得结果的末 8 位。 CC2530 发送一次开始信号后, DHT11 从低功耗模 式转换到高速模式, 等待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触 发一次信号采集, 用户可选择读取部分数据。从模式下, DHT11 接收到开始信号触发一次温湿度采 集, 如果没有接收到主机发送开始信号, DHT11 不会主动进行温湿度采集。采集数据后转换到低速 模式。
通讯过程如下所示:
通讯过程(一)
总线空闲状态为高电平,主机把总线拉低等待 DHT11 响应,主机把总线拉低必须大于 18 毫秒,保证 DHT11 能检测到起始信号。 DHT11 接收到主机的开始信号后, 等待主机开始信号结束,然后发送 80us 低电平响应信号。主机发送开始信号结束后,延时等待 20-40us 后,读取 DHT11 的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。