基于51单片机的无线通信智能定时插座 本系统采用STC89C52RC单片机为主控制器,由DS1302时钟芯片、SIM900A模块、DS18B20温度传感器、LCD1602液晶屏、ADE7755电能计量模块组成 有四个按键为减键、加键、选择键、设置键。 单独一个按键为复位按键。 DS1302时钟芯片,自带3V纽扣电池,当系统掉电后,纽扣电池供电给时钟芯片继续工作,再次上电无需重新设置时间。 ADE7755能够计量插在排插上用电器电能。 LCD1602液晶可以显示时、分、秒、温度和电能。 采用DS18B20温度传感器测温度,可以在LCD显示测到的温度。 可以设置5个开关开的时间和5个开关关的时间,每一个时间都可以单独设置成是否工作有效,设定的时间并具有掉电保存功能,保存在STC单片机的内部,上电无需重新设置。 继电器吸合指示灯亮实现开关开,继电器断开指示灯灭实现开关关,继电器外接一个排插。 具有自动模式和手动模式,手动模式下按加、减键就可以实现开关的开和关。 开机默认是自动模式,当现在的时间和设置开的时间一致时,继电器工作打开开关,当现在的时候和设置关的时间一致继电器断开关闭开关。 可以通过手机发送短信获取插座状态、温度、电能信息,可以发送短信控制继电器开关。 温度超过40℃会自动关闭继电器并给手机发送报警短信。 资料

最近搞了个基于51单片机的无线通信智能定时插座,感觉挺有意思,跟大家分享下。

这个系统的核心是STC89C52RC单片机 ,围绕它搭配了一堆实用的模块,像DS1302时钟芯片、SIM900A模块、DS18B20温度传感器、LCD1602液晶屏,还有ADE7755电能计量模块 。

先说说按键部分,有四个功能键,分别是减键、加键、选择键、设置键 ,还有个单独的复位按键。这几个按键承担着人机交互的重任,通过它们我们可以轻松设置定时插座的各种参数。

DS1302时钟芯片很贴心,自带3V纽扣电池。系统掉电的时候,纽扣电池就开始工作,保证时钟芯片继续运行,再次上电时就不用重新设置时间了,代码里大概是这样设置的:

// 假设定义了DS1302相关的引脚
sbit SCK = P1^0; 
sbit IO = P1^1; 
sbit CE = P1^2; 

// 写入一个字节到DS1302
void Write_DS1302_Byte(unsigned char dat) {
    unsigned char i;
    for (i = 0; i < 8; i++) {
        IO = dat & 0x01;
        SCK = 1;
        dat >>= 1;
        SCK = 0;
    }
}

这段代码就是往DS1302里写数据的,先把数据一位一位拿出来,通过IO引脚送进去,SCK引脚负责控制数据传输的节奏。

基于51单片机的无线通信智能定时插座 本系统采用STC89C52RC单片机为主控制器,由DS1302时钟芯片、SIM900A模块、DS18B20温度传感器、LCD1602液晶屏、ADE7755电能计量模块组成 有四个按键为减键、加键、选择键、设置键。 单独一个按键为复位按键。 DS1302时钟芯片,自带3V纽扣电池,当系统掉电后,纽扣电池供电给时钟芯片继续工作,再次上电无需重新设置时间。 ADE7755能够计量插在排插上用电器电能。 LCD1602液晶可以显示时、分、秒、温度和电能。 采用DS18B20温度传感器测温度,可以在LCD显示测到的温度。 可以设置5个开关开的时间和5个开关关的时间,每一个时间都可以单独设置成是否工作有效,设定的时间并具有掉电保存功能,保存在STC单片机的内部,上电无需重新设置。 继电器吸合指示灯亮实现开关开,继电器断开指示灯灭实现开关关,继电器外接一个排插。 具有自动模式和手动模式,手动模式下按加、减键就可以实现开关的开和关。 开机默认是自动模式,当现在的时间和设置开的时间一致时,继电器工作打开开关,当现在的时候和设置关的时间一致继电器断开关闭开关。 可以通过手机发送短信获取插座状态、温度、电能信息,可以发送短信控制继电器开关。 温度超过40℃会自动关闭继电器并给手机发送报警短信。 资料

ADE7755这个模块能精准计量插在排插上用电器的电能 ,LCD1602液晶则把时、分、秒、温度和电能这些信息都清晰地显示出来。DS18B20温度传感器负责测量温度,并在LCD上展示。

// 读取DS18B20温度的代码片段
bit Init_DS18B20(void) {
    bit status;
    DQ = 1; 
    _nop_(); 
    _nop_(); 
    DQ = 0; 
    // 拉低总线480us - 960us
    delay_18B20(60); 
    DQ = 1; 
    // 释放总线
    delay_18B20(6); 
    status = DQ; 
    // 读取DS18B20的响应信号
    delay_18B20(45); 
    return status; 
}

这个初始化DS18B20的代码,先拉低总线一段时间,然后释放,再读取DS18B20的响应信号,判断是否初始化成功。

插座可以设置5个开关开的时间和5个开关关的时间,每个时间都能单独设置是否有效,设定的时间还能掉电保存,存在STC单片机内部,上电不用重设。

继电器的控制也很关键,吸合指示灯亮开关开,断开指示灯灭开关关,继电器外接排插。系统有自动和手动两种模式,手动模式下按加、减键就能控制开关。开机默认自动模式,时间到了就自动控制继电器开关。

// 手动模式下控制继电器开关示例代码
if (mode == MANUAL_MODE) {
    if (key == KEY_ADD) {
        // 继电器开
        RELAY = 1;
        LED = 1; 
    } else if (key == KEY_SUB) {
        // 继电器关
        RELAY = 0;
        LED = 0; 
    }
}

这段代码就是在手动模式下,根据按下的加键或减键来控制继电器和指示灯。

还有个很酷的功能,能通过手机发短信获取插座状态、温度、电能信息,也能发短信控制继电器开关。温度超过40℃还会自动关继电器并给手机发报警短信,这就靠SIM900A模块来实现短信功能啦。

// 发送短信的部分代码示例
void send_sms(char *phone_number, char *message) {
    // 初始化串口与SIM900A通信
    UART_Init(); 
    // 发送AT指令设置短信格式为文本模式
    send_at_command("AT+CMGF=1", "OK", 100); 
    // 设置接收短信的号码
    char command[30];
    sprintf(command, "AT+CMGS=\"%s\"", phone_number); 
    send_at_command(command, ">", 100); 
    // 发送短信内容
    send_string(message); 
    // 发送Ctrl+Z结束短信发送
    send_char(0x1A); 
    delay(2000); 
}

这段代码就是利用串口和SIM900A模块来发送短信,先设置短信格式,再指定接收号码,最后发送内容。

总之,这个基于51单片机的无线通信智能定时插座功能丰富,无论是日常生活用电管理还是一些小型项目应用,都挺实用。后续还可以继续优化,加些更有趣的功能,大家要是有啥想法,欢迎一起交流呀!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐