自学内容网 自学内容网

CC2530传感器应用实例

1.CC2530流水灯实验

在这里插入图片描述

//基于CC2530微控制器的程序,用于控制三个LED灯的闪烁。


#include <ioCC2530.h>
 
#define uint unsigned int
#define uchar unsigned char
 
uint代表无符号整型,uchar代表无符号字符型。

#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4
 
//这里使用了宏定义,分别将LED1、LED2和LED3映射到微控制器的特定端口,P1_0、P1_1和P0_4。


void Delay(uint); //延时函数
void InitIO(void); //初始化 LED 控制 IO 口函数
 

void Delay(uint n)
{
 uint i;
 for(i = 0;i<n;i++);
 for(i = 0;i<n;i++);
 for(i = 0;i<n;i++);
 for(i = 0;i<n;i++);
 for(i = 0;i<n;i++);
}
 
/*延时函数,通过循环空操作来实现延时。循环次数由参数n决定,延时时间与n的值和微控制器的时钟频率有关。*/


void InitIO(void)
{
 P1DIR |= 0x03; //P10、P11 定义为输出 0000 0011
 P0DIR |= 0x10; //P04 定义为输出 0001 0000
 LED1 = 1;
 LED2 = 1;
 LED3 = 1; //LED 灯初始化为关
}
 
/*这个函数初始化LED控制端口为输出模式,并将LED灯设置为关闭状态。
P1DIR |= 0x03;和P0DIR |= 0x10;
这两行代码通过位或操作将对应的端口方向寄存器设置为输出。*/


void main(void)
{
 InitIO(); //初始化 LED 灯控制 IO 口
 while(1) //死循环
 {
  LED1 = !LED1; // LED1 灯闪一次
  Delay(50000);
  LED2 = !LED2; // LED2 灯闪一次
  Delay(50000);
  LED3 = !LED3; // LED3 灯闪一次
  Delay(50000);
 }
}
 
//主函数首先调用InitIO函数来初始化LED端口。
//然后进入一个无限循环,循环内部依次翻转三个LED灯的状态,
//并在每次翻转后调用Delay函数来实现闪烁效果。


2.CC2530 按键控制流水灯

代码:

#include <ioCC2530.h> 
#define uint unsigned int 
#define uchar unsigned char 
 

#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4
#define KEY1 P0_1
 
//声明初始化IO口函数、初始化按键函数和按键扫描函数。

void Delay(uint);
void InitIO(void);
void InitKey(void);
uchar KeyScan(void);
 
uchar Keyvalue = 0;
uint KeyTouchtimes = 0;
 
//定义了两个全局变量,Keyvalue用于记录按键动作,KeyTouchtimes用于记录按键次数(尽管在代码中未使用)。


void Delay(uint n) {
    // ... 循环体
}
 
//延时函数通过嵌套循环实现延时,延时的具体时间取决于传入的参数n和微控制器的时钟频率。


void InitKey(void) {
    // 设置按键为输入模式并启用上拉电阻
}
 
//将按键对应的端口设置为输入模式,并启用上拉电阻。


void InitIO(void) {
    // 设置LED对应的端口为输出模式,并初始化LED灯为灭
}
 
//设置LED对应的端口为输出模式,并将LED灯初始化为灭。


uchar KeyScan(void) {
    // 检测按键是否被按下,并返回按键状态
}
 
//检测按键是否被按下,如果按键被按下,则等待直到按键被释放,并返回1;否则返回0。


void main(void) {
    // 初始化LED和按键
    // 循环检测按键,并根据按键状态控制LED灯闪烁
}
 
/*主函数首先初始化LED和按键,然后进入一个无限循环,在循环中调用`KeyScan`函数来检测按键状态。如果按键被按下,则依次翻转LED3、LED2、LED1的状态,并在每次翻转后调用延时函数。

注意事项
- 延时函数Delay的具体时间没有给出,需要根据微控制器的时钟频率和循环迭代次数来计算。
- 按键扫描函数KeyScan使用简单的消抖逻辑,但并没有实现去抖动功能,可能会导致按键的误触发。
- KeyTouchtimes变量被声明但未在代码中使用,可能是一个预留的变量,用于未来的功能扩展。*/


3.按键控制 LED 灯光强度


#include <ioCC2530.h>
 
#define uint unsigned int
#define uchar unsigned char
 
#define LED1 P1_0
#define KEY1 P0_1
 
//定义了LED1的控制端口为P1.0,按键KEY1的控制端口为P0.1。

void Delay(unsigned int t);
void InitIO(void);
void InitKey();
 
//声明了三个函数:Delay用于延时,InitIO用于初始化LED控制IO口,InitKey用于初始化按键。


void main(void)
{
    unsigned int CYCLE=600, PWM_LOW=0; // 定义周期并赋值
    InitIO();
    InitKey();
    while (1) // 主循环
    {
        if(KEY1==0) // 检测按键是否被按下
        {
            PWM_LOW++; // 增加PWM低电平时间
            if(PWM_LOW>CYCLE)
            {
                PWM_LOW=CYCLE-1;
            }
        }
        else
        {
            PWM_LOW--; // 减少PWM低电平时间
            if(PWM_LOW<1)
            {
                PWM_LOW=1;
            }
        }

        if(PWM_LOW==1)
        {
            LED1=0; // LED始终关闭
        }
        else if(PWM_LOW==CYCLE)
        {
            LED1=1; // LED始终开启
        }
        else if(CYCLE>PWM_LOW)
        {
            LED1=1; // LED开启
            Delay(PWM_LOW); // 延时PWM_LOW时间
            LED1=0; // LED关闭
            Delay(CYCLE-PWM_LOW); // 延时剩余时间
        }
    }
}
 
//主函数初始化IO口,进入一个无限循环,根据按键状态调整PWM_LOW的值,进而控制LED的亮度。


void Delay(unsigned int t)
{
    while(t)
    {
        t--;
        t++;
        t--;
    }
}
 
//延时函数通过一个循环来实现延时,但由于循环体内部的操作并不影响t的值,这个函数实际上是一个死循环,不会产生预期的延时效果。

//初始化IO口程序
 
void InitIO(void)
{
    P1DIR |= 0x13; // P10、P11、P14 定义为输出
}
 
//设置P1.0、P1.1和P1.4为输出端口。

//按键初始化函数

void InitKey()
{
    P0SEL &= ~0x01; // 设置 P0.1 为普通 IO 口
    P0DIR &= ~0X01; // 按键接在 P0.1 口上,设 P0.1 为输入模式
    P0INP &= ~0x01; // 打开 P0.1 上拉电阻
}
 
/*初始化按键,将P0.1设置为输入模式,并启用上拉电阻。

注意事项
- 延时函数`Delay`的实现是错误的,它不会产生任何延时效果。
- 代码中包含了一些非功能性注释(如技术工程师的联系方式),这在实际应用中应该被移除。
- 程序没有考虑到按键去抖动的问题,可能会因为按键抖动而产生不稳定的输出。
- 程序的PWM控制逻辑比较简单,可能不适合精确的亮度控制。*/

4.红外传感器

//类型定义

typedef unsigned char uchar;
typedef unsigned int uint;
 
这里定义了两个类型简写,uchar代表无符号字符类型,uint代表无符号整型。

// 端口定义
 
#define LED1 P1_0
#define DATA_PIN P0_6
 
//定义了LED1的控制端口为P1.0,并且定义了DATA_PIN为P0.6,这可能是连接到一个传感器或其他输入设备的端口。

//延时函数
 
void DelayMS(uint msec)
{
    uint i, j;
    for (i = 0; i < msec; i++)
        for (j = 0; j < 535; j++);
}
 
//这个函数用于实现毫秒级的延时。它通过两层嵌套循环来实现延时,延时的精确时间取决于微控制器的时钟频率和循环次数。这里假设`j`循环535次大约等于1毫秒的延时。

//初始化LED和输入端口
 
void InitLed(void)
{
    P1DIR |= 0x01; //P1.0 定义为输出口
    P0SEL = 0x00;  //P0.6 不用作特殊功能
    P0DIR &= ~0x40; //P0.6 定义为输入口
    P2INP |= 0x20; //可能用于配置P0.6的上拉/下拉电阻
}
 
//这个函数初始化LED1的端口为输出,并设置P0.6为输入端口。`P2INP |= 0x20;`这行代码可能用于启用P0.6端口的上拉或下拉电阻,但具体取决于硬件配置。

//主函数
 
void main(void)
{
    InitLed(); //设置 LED 灯和 P0.6 相应的 IO 口

    while(1) //无限循环
    {
        if(DATA_PIN == 1)
        {
            DelayMS(10); //延时消抖
            if(DATA_PIN == 1)
            {
                LED1 = 0; //有人时 LED1 亮
            }
        }
        else
            LED1 = 1; //无人时 LED1 熄灭
    }
}
//主函数首先调用`InitLed`函数来初始化端口。然后进入一个无限循环,在循环中检查P0.6端口的电平状态。如果P0.6为高电平(假设表示有人),则延时10毫秒后再次检查以消抖,如果仍然为高电平,则点亮LED1。如果P0.6为低电平(假设表示无人),则熄灭LED1。

/* 注意事项
- 延时函数`DelayMS`并没有给出精确的延时时间,这取决于微控制器的时钟频率。
- 消抖逻辑仅使用了简单的延时,这在某些情况下可能不足以消除机械开关的抖动。
- 代码中没有对`P2INP |= 0x20;`进行详细说明,这需要根据具体的硬件设计来理解其作用。
- 代码中没有错误处理机制,例如,如果P0.6端口的状态一直不变,LED1将不会改变状态。*/

5.温湿度传感器 DHT11


#include <ioCC2530.h>
#include <string.h>
#include "UART.H"
#include "DHT11.H"
 

uchar temp[3];
uchar humidity[3];
uchar strTemp[13]="Temperature:";
uchar strHumidity[10]="Humidity:";
 
//声明了用于存储温度和湿度的字符数组,以及用于显示的字符串。

// 程序入口函数

void main(void)
{
    Delay_ms(1000); // 让设备稳定
    InitUart(); // 串口初始化
    while(1)
    {
        memset(temp, 0, 3);
        memset(humidity, 0, 3);
        DHT11(); // 获取温湿度
        // 将温湿度的转换成字符串
        temp[0] = wendu_shi + 0x30;
        temp[1] = wendu_ge + 0x30;
        humidity[0] = shidu_shi + 0x30;
        humidity[1] = shidu_ge + 0x30;
        // 获得的温湿度通过串口输出到电脑显示
        UartSendString(strTemp, 12);
        UartSendString(temp, 2);
        UartSendString(" ", 3);
        UartSendString(strHumidity, 9);
        UartSendString(humidity, 2);
        UartSendString("\n", 1);
        Delay_ms(2000); // 延时,2S 读取 1 次
    }
}
 //主函数首先进行延时以确保设备稳定,然后初始化串口。在无限循环中,它清除之前的数据,读取DHT11传感器的温湿度数据,将数据转换为字符串,并通过串口发送这些数据。



原文地址:https://blog.csdn.net/2302_81216114/article/details/143934394

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!