项目简介 :

本项目基于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的控制装置(窗帘控制)相关推荐

  1. 基于机智云的智能家用窗户窗帘控制及物联网系统

    摘要: 随着生活水平的提高,人们对环境质量和解放劳动的工具的要求越来越高,这使得家居设备的智能化和自动化受到广泛关注.本文来自机智云开发者分享,文中主要根据通风透光的功能要求,设计了一款基于物联网技术 ...

  2. 智能窗帘传感器c语言程序,基于单片机的智能窗帘控制系统设计(附程序代码)

    基于单片机的智能窗帘控制系统设计(附程序代码)(论文18000字,程序代码) 摘要:二十一世纪初以来,科学技术不断发展,智能家居涌现于各家各户,人们越来越重视生活质量的提高.但是传统的手动开合窗帘耗时 ...

  3. 【自动化毕业设计】基于机械视觉控制的板球控制装置

    [自动化毕业设计]基于机械视觉控制的板球控制装置 大四自动化专业毕业设计,断断续续制作了三个月,中途参加了校招和其他杂事,按照一般工作强度制作大概需要3个星期. [实现功能] 自平衡控制 定位控制 运 ...

  4. android客户端显示拓扑结构,基于WIFI构建的智能家居系统综合接入及控制装置(Android客户端及综合测控).doc...

    基于WIFI构建的智能家居系统综合接入及控制装置(Android客户端及综合测控) 毕 业 论 文(设计) 中文题目: 基于WIFI构建的智能家居系统综合接入 及控制装置(安卓及综合测控) 英文题目: ...

  5. (毕业设计资料)基于STM32智能窗帘控制系统设计

    096[电路方案]基于STM32智能窗帘控制系统设计 基于STM32单片机的智能窗帘控制系统.该系统集蓝牙遥控.人声识别控制.空调红外遥控.24c02数据储存.433m遥控.热释电红外感应.温湿度检测 ...

  6. 基于单片机家具窗帘控制系统设计、基于单片机路灯教室灯光家具智能控制设计-基于单片机简易电饭煲电饭锅仿真系统设计、基于单片机酒精检测控制系统仿真设计-设计资料

    1426基于单片机酒精检测控制系统仿真设计-全套资料 (1)  学习气体测量传感器的原理和使用,并完成数据采集.调理电路的设计: (2)  学习单片机系统的设计及编程,完成系统整体设计: (3)  通 ...

  7. 基于西门子PLC的自动门控制装置设计

    机电传动控制设计 目录 机电传动控制设计 1 一. 选题情况 3 二. 题目要求概述 3 1.自动门控制装置的硬件组成: 3 2.控制要求: 3 2. 方案论证 3 方案一的设计 4 3. 确定方案 ...

  8. 基于STM32的DS1302时钟芯片驱动

    基于STM32的DS1302时钟芯片驱动 /****************************************************************************** ...

  9. 【毕业设计】基于STM32的宠物自动喂食装置

    目录 修改记录 1.摘要 2.整体功能分析 3.硬件选型 3.1 ESP8266 WIFI模块 3.2 STM32F103ZET6 3.3 CLS150TD舵机 3.4 压力传感器 3.5 HX711 ...

最新文章

  1. 文章17周项目2--通过基准线结合(三个数字排序(指针参数))
  2. sigsuspend的使用
  3. 007_html头部元素
  4. tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)
  5. 自动化运维之 部署Saltstack 并批量部署 Nginx
  6. (七)SpringBoot+SpringCloud —— 集成断路器
  7. 如何正确处理 .NET 文件的 `File in use by another process` 异常 ?
  8. 如何给一个响应式数据添加一个属性 this.$set
  9. 制作一个简单HTML中华传统文化网页(HTML+CSS)
  10. 基于 SpringBoot + Mybatis 的个人在线音乐平台
  11. 较新颖的智能优化算法
  12. win的反义词_英语近反义词辨析
  13. Android中添加商品的购物车
  14. VC:CString.Format()函数详解
  15. 全国超能吃辣的省份,连四川和湖南都不是对手
  16. iOS H5原生WKWebView调起支付宝客户端支付方案
  17. 数据集COCO在目标检测的介绍与使用
  18. 【150】设计测试用例:假设京东有一个web API:输入打折价p1和原价p0,返回折扣信息0.9,请设计测试用例进行测试
  19. 即时通信回弹 android,放大10倍看华为 P30,看完“真像”的你可能和我一样放弃 P30Pro...
  20. 一个15分钟的视频,教你用Python创建自己的微信聊天机器人文中赠送全部源代码

热门文章

  1. Java中二维数组的动态初始化
  2. PPT肘形箭头不好控制,画不出想要的弯曲箭头?
  3. JS与DOM的兼容性
  4. 数据结构--学生成绩管理系统(顺序表)
  5. 500G的硬盘实际可用空间是多少?
  6. 关于三子棋(井字棋)小游戏
  7. [HEOI2012]采花 (离线树状数组)
  8. notion函数_高效工作必备,手把手教你玩转 Notion 模板(附下载)
  9. Ubuntu onenote下载安装使用
  10. 电动汽车蒙特卡洛模拟(附Matlab代码)