基于DS1820与DS1302的控制装置(窗帘控制)
项目简介 :
本项目基于51单片机和DS1302时钟芯片,DS18B20温度检测芯片与LCD1602显示屏人机交互界面,AT24C02(EEPROM)来从时间和温度两个维度对于窗帘的开关展开控制,仅需设置一次即可自动控制窗帘开关,并具有断电保存设置的功能。
protuse版本:链接:https://pan.baidu.com/s/1vbQNclW13FHfQXIbpJUc9g
提取码:pg0a
开发板版本:链接:https://pan.baidu.com/s/1QdUVruTRJBYoPhYUjGnL6g
提取码:sau8
具体功能 :
- 显示时钟与当前环境温度
- 可设置触发时钟(小时、分钟)
- 可设置触发温度(最高温、最低温),并设置控制装置模式
- 当是时钟或温度达到触发条件后,装置按设定模式运行
- 断电后可保存上次设置的触发时钟与触发温度
程序仿真:
实物运行:
注:protuse仿真与开发板实物仿真代码引脚不同,注意区分版本
运行视频:
DS18B20,AT24C02,DS18B20测试
程序源码:
protuse仿真,部分源码
main:
#include <REGX52.H> #include "LCD1602.h" #include "DS18B20.h" #include "Delay.h" #include "DS1302.h" #include "MOTO.h" #include "Int0.h"float T; int i = 4;temp=1;temp1=1; int TemperatureA=4,TemperatureB=12,TimeA=0,TimeB=0; int MotoAngle;void main() {DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误Delay(100); //等待转换完成LCD_Init();Int0_Init(); //开启外部中断DS1302_SetTime();//设置时间while(1){DS18B20_ConvertT(); //转换温度T=DS18B20_ReadT(); //读取温度if(T<0) //如果温度小于0{LCD_ShowChar(2,3,'-'); //显示负号T=-T; //将温度变为正数}else //如果温度大于等于0{LCD_ShowChar(2,3,'+'); //显示正号}LCD_ShowString(2,1,"T:");LCD_ShowNum(2,4,T,3); //显示温度整数部分LCD_ShowChar(2,7,'.'); //显示小数点LCD_ShowNum(2,8,(unsigned long)(T*10000)%10000,2);//显示温度小数部分//---------------------------------------------------------------------------------//LCD_ShowString(1,1," : : ");//静态字符初始化显示DS1302_ReadTime();//读取时间while(i--){LCD_ShowNum(1,1,DS1302_Time[3],2);//显示时LCD_ShowNum(1,4,DS1302_Time[4],2);//显示分LCD_ShowNum(1,7,DS1302_Time[5],2);//显示秒 }i = 4;/*---------------------------------------------------------------------------------//电机部分判断//---------------------------------------------------------------------------------*/if(T==TemperatureA && temp==1) //温度有关电机判断{LCD_Init();LCD_ShowString(2,1,"Waiting");switch(MotoAngle){case 0: Moto_Zheng_Circle1(); break;case 1: Moto_Zheng_Circle2(); break;case 2: Moto_Zheng_Circle3(); break;}LCD_Init();temp=0;}if(T==TemperatureB && temp==1){LCD_Init();LCD_ShowString(2,1,"Waiting");switch(MotoAngle){case 0: Moto_Fan_Circle1(); break;case 1: Moto_Fan_Circle2(); break;case 2: Moto_Fan_Circle3(); break;}LCD_Init();temp=0;}if(T!=TemperatureA && T!=TemperatureB) {temp=1;}/*---------------------------------------------------------------------------------*/if(DS1302_Time[3]==TimeA&&DS1302_Time[4]==TimeB) {temp=1;}if((DS1302_Time[3]==TimeA&&DS1302_Time[4]==TimeB)&&temp1==1)//时间有关电机判断{LCD_Init();LCD_ShowString(2,1,"Waiting");Moto_Zheng_Circle2();LCD_Init();temp1=0;}} }
OneWire.c
#include <REGX52.H>//引脚定义 sbit OneWire_DQ=P3^7;/*** @brief 单总线初始化* @param 无* @retval 从机响应位,0为响应,1为未响应*/ unsigned char OneWire_Init(void) {unsigned char i;unsigned char AckBit;OneWire_DQ=1;OneWire_DQ=0;i = 247;while (--i); //Delay 500usOneWire_DQ=1;i = 32;while (--i); //Delay 70usAckBit=OneWire_DQ;i = 247;while (--i); //Delay 500usreturn AckBit; }/*** @brief 单总线发送一位* @param Bit 要发送的位* @retval 无*/ void OneWire_SendBit(unsigned char Bit) {unsigned char i;OneWire_DQ=0;i = 4;while (--i); //Delay 10usOneWire_DQ=Bit;i = 24;while (--i); //Delay 50usOneWire_DQ=1; }/*** @brief 单总线接收一位* @param 无* @retval 读取的位*/ unsigned char OneWire_ReceiveBit(void) {unsigned char i;unsigned char Bit;OneWire_DQ=0;i = 2;while (--i); //Delay 5usOneWire_DQ=1;i = 2;while (--i); //Delay 5usBit=OneWire_DQ;i = 24;while (--i); //Delay 50usreturn Bit; }/*** @brief 单总线发送一个字节* @param Byte 要发送的字节* @retval 无*/ void OneWire_SendByte(unsigned char Byte) {unsigned char i;for(i=0;i<8;i++){OneWire_SendBit(Byte&(0x01<<i));} }/*** @brief 单总线接收一个字节* @param 无* @retval 接收的一个字节*/ unsigned char OneWire_ReceiveByte(void) {unsigned char i;unsigned char Byte=0x00;for(i=0;i<8;i++){if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}}return Byte; }
OneWire.h
#ifndef __ONEWIRE_H__ #define __ONEWIRE_H__unsigned char OneWire_Init(void); void OneWire_SendBit(unsigned char Bit); unsigned char OneWire_ReceiveBit(void); void OneWire_SendByte(unsigned char Byte); unsigned char OneWire_ReceiveByte(void);#endif
DS18B20.c
#include <REGX52.H> #include "OneWire.h"//DS18B20指令 #define DS18B20_SKIP_ROM 0xCC #define DS18B20_CONVERT_T 0x44 #define DS18B20_READ_SCRATCHPAD 0xBE/*** @brief DS18B20开始温度变换* @param 无* @retval 无*/ void DS18B20_ConvertT(void) {OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_CONVERT_T); }/*** @brief DS18B20读取温度* @param 无* @retval 温度数值*/ float DS18B20_ReadT(void) {unsigned char TLSB,TMSB;int Temp;float T;OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_READ_SCRATCHPAD);TLSB=OneWire_ReceiveByte();TMSB=OneWire_ReceiveByte();Temp=(TMSB<<8)|TLSB;T=Temp/16.0;return T; }
DS18B20.h
#ifndef __DS18B20_H__ #define __DS18B20_H__void DS18B20_ConvertT(void); float DS18B20_ReadT(void);#endif
DS1302.c
#include <REGX52.H>//引脚定义 sbit DS1302_SCLK=P3^6; sbit DS1302_IO=P3^4; sbit DS1302_CE=P3^5;//寄存器写入地址/指令定义 #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTH 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_WP 0x8E//时间数组,索引0~6分别为年、月、日、时、分、秒、星期 unsigned char DS1302_Time[]={22,10,16,2,59,42,6};/*** @brief DS1302初始化* @param 无* @retval 无*/ void DS1302_Init(void) {DS1302_CE=0;DS1302_SCLK=0; }/*** @brief DS1302写一个字节* @param Command 命令字/地址* @param Data 要写入的数据* @retval 无*/ void DS1302_WriteByte(unsigned char Command,Data) {unsigned char i;DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for(i=0;i<8;i++){DS1302_IO=Data&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_CE=0; }/*** @brief DS1302读一个字节* @param Command 命令字/地址* @retval 读出的数据*/ unsigned char DS1302_ReadByte(unsigned char Command) {unsigned char i,Data=0x00;Command|=0x01; //将指令转换为读指令DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=0;DS1302_SCLK=1;}for(i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}}DS1302_CE=0;DS1302_IO=0; //读取后将IO设置为0,否则读出的数据会出错return Data; }/*** @brief DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中* @param 无* @retval 无*/ void DS1302_SetTime(void) {DS1302_WriteByte(DS1302_WP,0x00);DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);DS1302_WriteByte(DS1302_WP,0x80); }/*** @brief DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中* @param 无* @retval 无*/ void DS1302_ReadTime(void) {unsigned char Temp;Temp=DS1302_ReadByte(DS1302_YEAR);DS1302_Time[0]=Temp/16*10+Temp%16;//BCD码转十进制后读取Temp=DS1302_ReadByte(DS1302_MONTH);DS1302_Time[1]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DATE);DS1302_Time[2]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_HOUR);DS1302_Time[3]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_MINUTE);DS1302_Time[4]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_SECOND);DS1302_Time[5]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DAY);DS1302_Time[6]=Temp/16*10+Temp%16; }
DS1302.h
#ifndef __DS1302_H__ #define __DS1302_H__//外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期 extern unsigned char DS1302_Time[];void DS1302_Init(void); void DS1302_WriteByte(unsigned char Command,Data); unsigned char DS1302_ReadByte(unsigned char Command); void DS1302_SetTime(void); void DS1302_ReadTime(void);#endif
I2C.c
#include <REGX52.H>sbit I2C_SCL=P2^1; sbit I2C_SDA=P2^0;//I2C开始 void I2C_Start() {I2C_SDA=1;I2C_SCL=1;//I2C_SDA=1;I2C_SDA=0;I2C_SCL=0; }//I2C停止 void I2C_Stop() {//I2C_SCL=0;I2C_SDA=0;I2C_SCL=1;I2C_SDA=1; }//发送一个字节 void I2C_SendByte(unsigned char Byte) {unsigned char temp;//I2C_SCL=0;for(temp=0;temp<8;temp++){I2C_SDA=Byte&(0x80>>temp);I2C_SCL=1;I2C_SCL=0;} }//接收一个字节 unsigned char I2C_ReceiveByte() {unsigned char temp,Byte=0x00;I2C_SDA=1;//I2C_SCL=0; for(temp=0;temp<8;temp++){I2C_SCL=1;if(I2C_SDA) {Byte|=(0x80>>temp);}I2C_SCL=0;}return Byte; }//发送应答 void I2C_SendAck(unsigned char AckBit) {//I2C_SCL=0;I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0; }//接收应答 unsigned char I2C_ReceiveAck() {unsigned char AckBit;//I2C_SCL=0;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;I2C_SCL=0;return AckBit; }
I2C.h
#ifndef __I2C_H__ #define __I2C_H__void I2C_Start(); void I2C_Stop(); void I2C_SendByte(unsigned char Byte); unsigned char I2C_ReceiveByte(); void I2C_SendAck(unsigned char AckBite); unsigned char I2C_ReceiveAck();#endif
AT24C02.c
#include <REGX52.H> #include "I2C.h"#define AT24C02_ADDRESS 0xA0extern int TemperatureA; extern int TemperatureB; extern int TimeA; extern int TimeB; extern int MotoAngle;//AT24C02写入一个字节 void AT24C02_WriteByte(unsigned char WordAddress,Data) {I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop(); }//AT24C02读取一个字节 unsigned char AT24C02_ReadByte(unsigned char WordAddress) {unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS|0x01);I2C_ReceiveAck();Data=I2C_ReceiveByte();I2C_SendAck(1);I2C_Stop(); return Data; }void AT24C20_ReadSet() {TemperatureA=AT24C02_ReadByte(0);TemperatureB=AT24C02_ReadByte(1);MotoAngle=AT24C02_ReadByte(2);TimeA=AT24C02_ReadByte(3);TimeB=AT24C02_ReadByte(4); }
AT24c02.h
#ifndef __AT24C02_H__ #define __AT24C02_H__void AT24C02_WriteByte(unsigned char WordAddress,Data); unsigned char AT24C02_ReadByte(unsigned char WordAddress); void AT24C20_ReadSet();#endif
Int0.c
#include <regx52.h> #include "LCD1602.h" #include "Delay.h" #include "AT24C02.h"#define plus P3_0 //+ #define subtract P3_1 //- #define set P3_2 //设置确认按钮 #define Beep P2_5unsigned char Compare,Counter; extern int TemperatureA,TemperatureB,TimeA,TimeB,TimeC; extern int MotoAngle,temp;void Int0_Init() {IE=0X85;IP=0X04;TCON=0X00; }void Timer0_Init() {TMOD&=0xF0;TMOD|=0x01;TL0=0x9C;TH0=0XFF;TF0=0;TR0=1;ET0=1;EA=1;PT0=0; } void Timer0() interrupt 1 //定时器PWM {TL0=0x9c;TH0=0xFF;Counter++;if(Counter==100) {Counter=0;}if(Counter<Compare){Beep=0;}else{Beep=1;} }void Int0() interrupt 0 //中断中设置报警时间,温度,与报警强度 {LCD_Init();while(1){LCD_ShowString(1,1,"SET:");LCD_ShowString(1,6,"Time(-)");LCD_ShowString(2,3,"Temperature(+)");/*-----------------------------------设置温度-------------------------------------------*/if(plus==0) {while(plus==0);LCD_Init();LCD_ShowString(1,1,"SET:Temperature");LCD_ShowString(2,1,"MIN:");while(1) //最低温设置{if(plus==0) {while(plus==0);TemperatureA++;}if(subtract==0) {while(subtract==0);TemperatureA--;} if(TemperatureA>0) {LCD_ShowString(2,5,"+");LCD_ShowNum(2,6,TemperatureA,3);}if(TemperatureA<0) {LCD_ShowString(2,5,"-");LCD_ShowNum(2,6,TemperatureA,3);}if(set==0) {while(set==0); LCD_Init(); break;}//完成最低温设置}AT24C02_WriteByte(0,TemperatureA);LCD_Init();LCD_ShowString(1,1,"SET:Temperature");LCD_ShowString(2,1,"MAX:");while(1) //最高温设置{if(plus==0) {while(plus==0);TemperatureB++;}if(subtract==0) {while(subtract==0);TemperatureB--;} if(TemperatureA>0) {LCD_ShowString(2,5,"+");LCD_ShowNum(2,6,TemperatureB,3);}if(TemperatureA<0) {LCD_ShowString(2,5,"-");LCD_ShowNum(2,6,TemperatureB,3);}if(set==0) {while(set==0); LCD_Init(); break;}//完成最高温设置}AT24C02_WriteByte(1,TemperatureB);LCD_Init();LCD_ShowString(1,1,"SET:Curtain");LCD_ShowString(2,1,"Angle:");while(1) //选择开启多少只有0,1,2档位{if(plus==0) {while(plus==0);MotoAngle++;if(MotoAngle>2) {MotoAngle=0;} }if(subtract==0) {while(subtract==0);MotoAngle--;if(MotoAngle<0) {MotoAngle=3;}} LCD_ShowNum(2,8,MotoAngle,2);if(set==0) {while(set==0); LCD_Init(); break;}//完成最高温设置}break;AT24C02_WriteByte(2,MotoAngle);}/*-----------------------------------设置时间-------------------------------------------*/if(subtract==0){while(subtract==0);LCD_Init();LCD_ShowString(1,1,"SET:Time");LCD_ShowString(2,1,"Hour:");while(1) //设置小时{if(plus==0) {while(plus==0);TimeA++;}if(subtract==0) {while(subtract==0);TimeA--;} if(TimeA>23) {TimeA=0;}if(TimeA<0) {TimeA=23;}LCD_ShowNum(2,6,TimeA,2);if(set==0) {while(set==0); LCD_Init(); break;}}AT24C02_WriteByte(3,TimeA);LCD_Init();LCD_ShowString(1,1,"SET:Time");LCD_ShowString(2,1,"minute:");while(1) //设置分钟{if(plus==0) {while(plus==0);TimeB++;}if(subtract==0) {while(subtract==0);TimeB--;} if(TimeB>59) {TimeB=0;}if(TimeB<0) {TimeB=59;}LCD_ShowNum(2,8,TimeB,2);if(set==0) {while(set==0); LCD_Init(); break;}}AT24C02_WriteByte(4,TimeB);break;}}}
MOTO.c
#include "REGX52.H" #include "MOTO.H"#define uint unsigned int #define uchar unsigned char #define MOTO P2unsigned char arr1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};//步进正转脉冲数组unsigned char arr2[]={0x03,0x01,0x09,0x08,0x0c,0x04,0x06,0x02};//步进反转脉冲数组unsigned char a=0;//iunsigned char b=0;//nvoid delay1(int n)//延迟函数 {for(n=1000*n; n!=0; n--); }void Delay2000ms() //@11.0592MHz延迟函数 {unsigned char i, j, k;i = 13;j = 156;k = 83;do{do{while (--k);} while (--j);} while (--i); }void Moto_Zheng_Circle1() {while(b<8)//旋转两圈{a=a<8 ? a+1 : 0;P2=arr1[a];delay1(10); b++;}b=0; }void Moto_Zheng_Circle2() {while(b<16)//旋转两圈{a=a<8 ? a+1 : 0;P2=arr1[a];delay1(10); b++;}b=0; }void Moto_Zheng_Circle3() {while(b<24)//旋转三圈{a=a<8 ? a+1 : 0;P2=arr1[a];delay1(10); b++;}b=0; }void Moto_Fan_Circle1() {while(b<8)//旋转两圈{a=a<8 ? a+1 : 0;P2=arr2[a];delay1(10); b++;}b=0; }void Moto_Fan_Circle2() {while(b<16)//旋转两圈{a=a<8 ? a+1 : 0;P2=arr2[a];delay1(10); b++;}b=0; }void Moto_Fan_Circle3() {while(b<24)//旋转三圈{a=a<8 ? a+1 : 0;P2=arr2[a];delay1(10); b++;}b=0; }
MOTO.h
#ifndef __MOTO_H__ #define __MOTO_H__void Moto_Zheng_Circle3(void); void Moto_Zheng_Circle2(void); void Moto_Zheng_Circle1(void);void Moto_Fan_Circle2(void); void Moto_Fan_Circle2(void); void Moto_Fan_Circle2(void);#endif
结语:
本项目综合运用了I2c,单总线协议使主机与各个芯片通信,并用中断设置触发条件,在主函数中循环扫描达到项目目的。
protuse的无掉电不丢失特性,在实际单片机开发板中可实现设置掉电不丢失,因单片机开发板硬件电路复用,开发板暂时不可以实现触发功能,自己用单片机最小系统搭建可以实现。
程序源码部分protuse仿真与开发板源码有差异,故有双版本软件代码。
基于DS1820与DS1302的控制装置(窗帘控制)相关推荐
- 基于机智云的智能家用窗户窗帘控制及物联网系统
摘要: 随着生活水平的提高,人们对环境质量和解放劳动的工具的要求越来越高,这使得家居设备的智能化和自动化受到广泛关注.本文来自机智云开发者分享,文中主要根据通风透光的功能要求,设计了一款基于物联网技术 ...
- 智能窗帘传感器c语言程序,基于单片机的智能窗帘控制系统设计(附程序代码)
基于单片机的智能窗帘控制系统设计(附程序代码)(论文18000字,程序代码) 摘要:二十一世纪初以来,科学技术不断发展,智能家居涌现于各家各户,人们越来越重视生活质量的提高.但是传统的手动开合窗帘耗时 ...
- 【自动化毕业设计】基于机械视觉控制的板球控制装置
[自动化毕业设计]基于机械视觉控制的板球控制装置 大四自动化专业毕业设计,断断续续制作了三个月,中途参加了校招和其他杂事,按照一般工作强度制作大概需要3个星期. [实现功能] 自平衡控制 定位控制 运 ...
- android客户端显示拓扑结构,基于WIFI构建的智能家居系统综合接入及控制装置(Android客户端及综合测控).doc...
基于WIFI构建的智能家居系统综合接入及控制装置(Android客户端及综合测控) 毕 业 论 文(设计) 中文题目: 基于WIFI构建的智能家居系统综合接入 及控制装置(安卓及综合测控) 英文题目: ...
- (毕业设计资料)基于STM32智能窗帘控制系统设计
096[电路方案]基于STM32智能窗帘控制系统设计 基于STM32单片机的智能窗帘控制系统.该系统集蓝牙遥控.人声识别控制.空调红外遥控.24c02数据储存.433m遥控.热释电红外感应.温湿度检测 ...
- 基于单片机家具窗帘控制系统设计、基于单片机路灯教室灯光家具智能控制设计-基于单片机简易电饭煲电饭锅仿真系统设计、基于单片机酒精检测控制系统仿真设计-设计资料
1426基于单片机酒精检测控制系统仿真设计-全套资料 (1) 学习气体测量传感器的原理和使用,并完成数据采集.调理电路的设计: (2) 学习单片机系统的设计及编程,完成系统整体设计: (3) 通 ...
- 基于西门子PLC的自动门控制装置设计
机电传动控制设计 目录 机电传动控制设计 1 一. 选题情况 3 二. 题目要求概述 3 1.自动门控制装置的硬件组成: 3 2.控制要求: 3 2. 方案论证 3 方案一的设计 4 3. 确定方案 ...
- 基于STM32的DS1302时钟芯片驱动
基于STM32的DS1302时钟芯片驱动 /****************************************************************************** ...
- 【毕业设计】基于STM32的宠物自动喂食装置
目录 修改记录 1.摘要 2.整体功能分析 3.硬件选型 3.1 ESP8266 WIFI模块 3.2 STM32F103ZET6 3.3 CLS150TD舵机 3.4 压力传感器 3.5 HX711 ...
最新文章
- 文章17周项目2--通过基准线结合(三个数字排序(指针参数))
- sigsuspend的使用
- 007_html头部元素
- tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)
- 自动化运维之 部署Saltstack 并批量部署 Nginx
- (七)SpringBoot+SpringCloud —— 集成断路器
- 如何正确处理 .NET 文件的 `File in use by another process` 异常 ?
- 如何给一个响应式数据添加一个属性 this.$set
- 制作一个简单HTML中华传统文化网页(HTML+CSS)
- 基于 SpringBoot + Mybatis 的个人在线音乐平台
- 较新颖的智能优化算法
- win的反义词_英语近反义词辨析
- Android中添加商品的购物车
- VC:CString.Format()函数详解
- 全国超能吃辣的省份,连四川和湖南都不是对手
- iOS H5原生WKWebView调起支付宝客户端支付方案
- 数据集COCO在目标检测的介绍与使用
- 【150】设计测试用例:假设京东有一个web API:输入打折价p1和原价p0,返回折扣信息0.9,请设计测试用例进行测试
- 即时通信回弹 android,放大10倍看华为 P30,看完“真像”的你可能和我一样放弃 P30Pro...
- 一个15分钟的视频,教你用Python创建自己的微信聊天机器人文中赠送全部源代码