赞
踩
#机智云( esp8266)与74hc595控制16路继电器
说明:使用74hc595编码器增加8266的io口功能,从而只要利用3个io就可以16路的继电器。
我们这里使用它的二级电路,运用俩个595产生16路输出,电路如图所示:
/* * relay16.c * * Created on: 2018年11月2日 * Author: 小罗 */ #include "ets_sys.h" #include "driver/relay16.h" #include "osapi.h" #include "eagle_soc.h" //放在初始化函数里面:void ICACHE_FLASH_ATTR user_init(void) void ICACHE_FLASH_ATTR hc595Iinit(void) //gpio初始化 { PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12); PIN_PULLUP_EN(PERIPHS_IO_MUX_MTMS_U);//上拉使能 PIN_PULLUP_EN(PERIPHS_IO_MUX_MTCK_U); PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U); gpio_output_set(0,0,GPIO_ID_PIN(12)|GPIO_ID_PIN(13)|GPIO_ID_PIN(14),0); hc595sendbyte(0xffff); //关闭所有继电器 os_printf("hc595Iinit\r\n"); } void hc595sendbyte(unsigned int temp) { unsigned char i; for(i=0;i<16;i++) { if((temp<<i) & 0x8000) DS1; else DS0; SH0; os_delay_us(5); SH1; } ST0; os_delay_us(5); ST1; } /*改变某一位为0/1,flag=0/1, position=1-16*/ unsigned int bit_set(unsigned int data,unsigned char flag,unsigned char position ) { if (flag)//置1 { data |= (1<<position-1); } else { data &= ~(1<<position-1); } return data; } //放在int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)使用 //gizwits_product.c //对网络按了那些按键进行变化 //sta=1/0 void relay(unsigned char sta,unsigned char n) { //继电器的开关状态,1开,0关 static unsigned int state=0xffff;//目前的开关状态 switch(n) { case 1: if(sta)state=bit_set(state,1,1);//第一位置1 else state=bit_set(state,0,1);//第一位置0 break; case 2: if(sta)state=bit_set(state,1,2);//第x位置1 else state=bit_set(state,0,2);//第x位置0 break; case 3: if(sta)state=bit_set(state,1,3);//第x位置1 else state=bit_set(state,0,3);//第x位置0 break; case 4: if(sta)state=bit_set(state,1,4);//第x位置1 else state=bit_set(state,0,4);//第x位置0 break; case 5: if(sta)state=bit_set(state,1,5);//第x位置1 else state=bit_set(state,0,5);//第x位置0 break; case 6: if(sta)state=bit_set(state,1,6);//第x位置1 else state=bit_set(state,0,6);//第x位置0 break; case 7: if(sta)state=bit_set(state,1,7);//第x位置1 else state=bit_set(state,0,7);//第x位置0 break; case 8: if(sta)state=bit_set(state,1,8);//第x位置1 else state=bit_set(state,0,8);//第x位置0 break; case 9: if(sta)state=bit_set(state,1,9);//第x位置1 else state=bit_set(state,0,9);//第x位置0 break; case 10: if(sta)state=bit_set(state,1,10);//第x位置1 else state=bit_set(state,0,10);//第x位置0 break; case 11: if(sta)state=bit_set(state,1,11);//第x位置1 else state=bit_set(state,0,11);//第x位置0 break; case 12: if(sta)state=bit_set(state,1,12);//第x位置1 else state=bit_set(state,0,12);//第x位置0 break; case 13: if(sta)state=bit_set(state,1,13);//第x位置1 else state=bit_set(state,0,13);//第x位置0 break; case 14: if(sta)state=bit_set(state,1,14);//第x位置1 else state=bit_set(state,0,14);//第x位置0 break; case 15: if(sta)state=bit_set(state,1,15);//第x位置1 else state=bit_set(state,0,15);//第x位置0 break; case 16: if(sta)state=bit_set(state,1,16);//第x位置1 else state=bit_set(state,0,16);//第x位置0 break; default: //断掉所有继电器 //断开继电器 break; } hc595sendbyte(state);//发送state的状态 } /* * relay16.h * * Created on: 2018年11月2日 * Author: 小罗 */ #ifndef APP_INCLUDE_DRIVER_RELAY16_H_ #define APP_INCLUDE_DRIVER_RELAY16_H_ #include <stdio.h> #include <c_types.h> #include <gpio.h> #include <eagle_soc.h> #define DS1 GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1) #define DS0 GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 0) #define ST0 GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0)//输出低 #define ST1 GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1)//输出高 #define SH0 GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0)//输出低 #define SH1 GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1)//输出高 void hc595Iinit(void); void hc595sendbyte(unsigned int temp); unsigned int bit_set(unsigned int data,unsigned char flag,unsigned char position ); void relay(unsigned char sta,unsigned char n); #endif /* APP_INCLUDE_DRIVER_RELAY16_H_ */
把这俩程序添加到工程文件里就可以了,稍作修改编译就可以下载固件使用了。亲测可行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。