本设计由STC89C52单片机电路+按键电路+DS1302时钟电路+DS18B20温度检测电路+光敏电阻检测电路+LCD1602液晶显示电路+蜂鸣器报警电路+ULN2003步进电机驱动电路+电源电路组成。
1、通过按键可以设置窗帘自动模式和手动模式,LCD1602实时显示当前模式。
2、LCD1602实时显示当前时间、当前温度值和温度阈值。如果当前温度超过温度阈值,则蜂鸣器报警。否则,蜂鸣器不报警。
3、LCD1602实时显示当前光照值和光照阈值。光照检测采用滤波算法,即采集五个光照值,对比去掉最大值和最小值,将中间三个值取平均值。
4、在手动模式下,可以通过按键控制步进电机的正反转(正转和反转均为1圈)。
5、在自动模式下,如果当前光照值超过设置的光照阈值(光照阈值设定由可购买者自行设定),则步进电机正转1圈,否则,步进电机反转1圈。
资料下载地址
https://pan.baidu.com/s/1PZK2iF-4zrzx2yaBV5qWEQ?pwd=8888
void Init_Timer0(void); //函数声明
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void TIM2Inital(void);
void main(void)
{
Ds1302_Init();
Ds1302_Read_Time();//读取时间参数
sprintf(dis0,"%02d:%02d:%02d %4.1f C ",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6],temperature);//时分秒 温度
LCD_Write_String(0,0,dis0);//显示时间及温度
LCD_Write_Char(13,0,0xdf);//温度符号
uartSendStr("ready ok !",10);
// Ds1302_Write_Time();
while(1)
{
if((key1==0)||(key2==0)||(key3==0)) //检测到按键按下
{
if(rekey == 0)//防止重复按下
{
DelayMs(10);
}
}
else
{rekey =0 ;} //防止重复按下
if(ReadTempFlag==1) //读取温度标志
{
temp1=ReadTemperature();
temperature=(float)temp1*0.0625; //温度转换
if((temperature>1)&&(temperature<84))
{
disTemp = temperature; //温度值赋值
}
}
if(SetFlag==1) //如果接收到串口信息则更新时钟
{
Ds1302_Write_Time();//接收更新的时间然后写入ds1302
SetFlag=0; //时钟信息更新后标志位清零
}
if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零
{
ReadTimeFlag=0; //标志位清零
Ds1302_Read_Time();//读取时间参数
if(lighCount >= 5)
{
lighCount =0;
minligh = midLigh[0]; //赋值
maxligh = midLigh[0]; //赋值
ligh = ((int)midLigh[0]+(int)midLigh[1]+(int)midLigh[2]+(int)midLigh[3]+(int)midLigh[4]-(int)minligh -(int)maxligh)/3;
}
sprintf(dis0,"%02d:%02d:%02d T%4.1f C",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6],disTemp);//时分秒
LCD_Write_String(0,0,dis0);//显示时间
LCD_Write_Char(14,0,0xdf);//温度符号
if(modeFlag == 0)
{
sprintf(dis1,"L%02d l70-t35-m:Z ",(int)ligh);//显示
}
LCD_Write_String(0,1,dis1);//显示时间
if(disTemp > 35)
{buzzer = 0;}//打开蜂鸣器
else
{buzzer = 1;}//关闭蜂鸣器
if(modeFlag == 0)
{
}
}
}
}
资料下载地址