北京软件网站开发,来个可以做渗透的网站,做动态的网站,网络开发工程师是做什么的本节主要展示上位机部分#xff0c;采用BSP编程#xff0c;不附带BSP中各个头文件的说明#xff0c;仅仅是对main逻辑进行解释 main.c
上下位机通信
通过串口通信#xff0c;有两位数据验证头#xff08;verify数组中保存对应的数据头 0xAA55)
通信格式 上位发送11字节…本节主要展示上位机部分采用BSP编程不附带BSP中各个头文件的说明仅仅是对main逻辑进行解释 main.c
上下位机通信
通过串口通信有两位数据验证头verify数组中保存对应的数据头 0xAA55)
通信格式 上位发送11字节数据其中前两位是0xAA55用于数据验证第三位用于判断当前上位机发送数据的功能 当第三位数据为0x00时表明当前是验证数据用于检验串口通信是否成功若成功返回字节序列 [0xaa ,0x55,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09] 当第三位数据为0x01时表明当前是收集温度光照土壤湿度数据返回字节序列 [0xaa ,0x55,0x01,0x温度十位,0x温度个位,0x温度小数位,0x光照百位,0x光照十位,0x光照个位,0x,0x电压个位,0x电压小数位] 当第三位数据为0x02时表明当前是修改温度光照土壤湿度阈值 在函数my1S中定义了收集温度光照土壤湿度数据的实现函数并且通过检验数据是否超过阈值来触发蜂鸣器报警根据不同的触发条件来发出不同的声音。
全部代码
#include STC15F2K60S2.H //±ØÐë¡£
#include sys.H //±ØÐë¡£
#include Uart1.H
#include adc.h
#include displayer.H
#include Beep.H
#include StepMotor.h#define N 11#ifdef _displayer_H_
code char decode_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01, 0x41, 0x48, /* ÐòºÅ: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 *//* ÏÔʾ: 0 1 2 3 4 5 6 7 8 9 (ÎÞ) ÏÂ- ÖÐ- ÉÏ- ÉÏÖÐ- ÖÐÏÂ- */ 0x3f|0x80,0x06|0x80,0x5b|0x80,0x4f|0x80,0x66|0x80,0x6d|0x80,0x7d|0x80,0x07|0x80,0x7f|0x80,0x6f|0x80 }; /* ´øÐ¡Êýµã 0 1 2 3 4 5 6 7 8 9 */
#endifcode unsigned long SysClock11059200; //±ØÐë¡£¶¨Òåϵͳ¹¤×÷ʱÖÓÆµÂÊ(Hz)£¬Óû§±ØÐëÐ޸ijÉÓëʵ¼Ê¹¤×÷ƵÂÊ£¨ÏÂÔØÊ±Ñ¡ÔñµÄ£©Ò»ÖÂunsigned char rxdbuf[N],txdbuf[N];
code char verify[2]{0xaa,0x55};
unsigned int s0,s1,s2,s3,s4,s5,s6,s7;
unsigned char limit[8] {3,7,5,0,9,0,1,0};int rt_to_tem(unsigned int adc, unsigned char adcbit)
{ code int temtable[32]{2000,1293,1016,866,763,685,621,567,520,477,439,403,370,338,308,278,250,222,194,167,139,111,83,53,22,-11,-4.7,-87,-132,-186,-256,-364};unsigned char resh; //¸ß5bit ²é±íunsigned int resl; //µÍ11bit ²åÖµresladc(16-adcbit); //ÏÈͳһÀ©Õ¹³É16bitreshresl11;reslresl 0x07ff;return(temtable[resh]-(((temtable[resh]-temtable[resh1])*resl)11));
}void check_received_data(void) {unsigned int flag 0;unsigned int data_flag 0;unsigned int change_flag 0;if(rxdbuf[2] 0x00) flag 1;if(rxdbuf[2] 0x01) data_flag 1;if(rxdbuf[2] 0x02) change_flag 1;if(flag){txdbuf[0] 0xaa;txdbuf[1] 0x55;txdbuf[2] 0x00;txdbuf[3] 0x01;txdbuf[4] 0x02;txdbuf[5] 0x03;txdbuf[6] 0x04;txdbuf[7] 0x05;txdbuf[8] 0x06;txdbuf[9] 0x07;txdbuf[10] 0x08;Uart1Print(txdbuf, sizeof(txdbuf));}if(!flag data_flag){// txdbuf[0] 0xaa;txdbuf[1] 0x55;txdbuf[2] 0x01;txdbuf[3] s0;txdbuf[4] s1;txdbuf[5] s2;txdbuf[6] s3;txdbuf[7] s4;txdbuf[8] s5;txdbuf[9] s6;txdbuf[10] s7;Uart1Print(txdbuf, sizeof(txdbuf)); }if(!flag change_flag){limit[0] rxdbuf[3];limit[1] rxdbuf[4];limit[2] rxdbuf[5];limit[3] rxdbuf[6];limit[4] rxdbuf[7];limit[5] rxdbuf[8];limit[6] rxdbuf[9];limit[7] rxdbuf[10];txdbuf[0] 0xaa;txdbuf[1] 0x55;txdbuf[2] 0x02;txdbuf[3] limit[0];txdbuf[4] limit[1];txdbuf[5] limit[2];txdbuf[6] limit[3];txdbuf[7] limit[4];txdbuf[8] limit[5];txdbuf[9] limit[6];txdbuf[10] limit[7];Uart1Print(txdbuf, sizeof(txdbuf)); }
}void my1S()
{ static unsigned int temperature_sum0;static unsigned int light_sum 0;static unsigned int voltage_ge_sum 0;static unsigned int voltage_xiaoshu_sum 0;static unsigned int count0;int temperature_tem;int light_tem;int voltage_ge_tem;int voltage_xiaoshu_tem;struct_ADC adcres;int temperature_shi;int temperature_ge;int temperature_xiaoshu;int temperature;int temperature_aac;int light_bai;int light_shi;int light_ge;int voltage_ge;int voltage_xiaoshu;int voltage;int i0;adcresGetADC();temperature_sum adcres.Rt;temperature_tem rt_to_tem(temperature_sum,14);temperature_shi temperature_tem/100%10;temperature_ge temperature_tem/10%10;temperature_xiaoshu temperature_tem%10;temperature temperature_shi *100 temperature_ge * 10 temperature_xiaoshu - 320;temperature_shi (temperature * 10 / 18) /100;temperature_ge (temperature * 10 /18) %100 /10;temperature_xiaoshu (temperature * 10 /18) %10;s0 temperature_shi;s1 temperature_ge-2;s2 temperature_xiaoshu;temperature_aacs0*10s1*1s2*0.1;light_sum adcres.Rop;light_tem light_sum;light_bai light_tem%1000/100;light_shi light_tem%100/10;light_ge light_tem%10;s3 light_bai;s4 light_shi;s5 light_ge;voltage_ge_sum adcres.EXT_P10/50;voltage_xiaoshu_sum adcres.EXT_P10%50/5;voltage_ge voltage_ge_sum;voltage_xiaoshu voltage_xiaoshu_sum;voltage (adcres.EXT_P10%1000/100) * 100 (adcres.EXT_P10%100/10) * 10 adcres.EXT_P10%10;s6 voltage / 50;s7 voltage%50/5;if(light_sum90){SetBeep(1000,200);}if(temperature_aac38){SetBeep(8000,50);}if(s63){SetBeep(2000,100);P41 ~ 0X2;}if(s63){for( i0;i60;i){P41 | 0X2;}
}Seg7Print(s0,16s1,s2,s3,s4,s5,16s6,s7); //ÿ160mSÏÔʾһ´Îζȣ¬Ã¿´ÎÊÇ16´Î²âÁ¿µÄƽ¾ù tem%10
}void main()
{ Uart1Init(9600);AdcInit(ADCexpEXT); DisplayerInit();BeepInit();StepMotorInit();SetDisplayerArea(0,7);LedPrint(0);P41 | 0X2;SetUart1Rxd(rxdbuf, sizeof(rxdbuf), verify, 2); SetEventCallBack(enumEventSys1S,my1S); SetEventCallBack(enumEventUart1Rxd, check_received_data);MySTC_Init(); while(1) { MySTC_OS(); }
} 硬件电路连接
扩展了树莓派的自动灌溉模块链接如下灌溉元件 元件单独使用的链接图但是由于我们需要获取实时电压我们选择将 AO 接入到 P1.0 来做数模转换与之对应的是对于继电器的 IN 端口我们采用stc-b板的vcc来给它供电这是因为电池提供的电压是6v超过了继电器的 5v 需求电源只用来给水泵供电。
整体线路图 外加电源
黄色的模块竖串联横断路 检测单元 驱动模块