好几天没有来,这几天装了好几次系统,不知为何引导老是自己丢失,winload.efi错误。
后来发现好像是MDK装了stm32的包导致的,不装就好好的,好奇葩。
话说win10刚更新的15058带了夜灯实在太适合我这种夜猫子了^_^
今天晚上画好电路板,闲来无事就再写一个,给自己留个回忆也好,同学们交流一下也好。大佬看到可别笑。୧(๑•̀⌄•́๑)૭
言归正传。其实这是上一篇的更新,这几天调了些程序但还是有些小bug不过几乎达到要求了。
主要就是实现蓝牙控制步进电机开关窗和灯,查询室内温湿度,光线不时进门自动开灯。然后还能在检测到室内可燃气体超标或者有烟雾时切断电源并且打开窗户。
这是用面包板搭的电路:
现在主要试了烟雾传感器控制开关窗和蓝牙控制开关窗查询温湿度(・ω< )★
准备等明天板打好再测试其他模块。
这是电路板图
下面是半成品的代码
#include<stc15.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar wd_gao, wd_di, shi_gao, shi_di, check; //分别为温度高/低,湿度高/低,校验数据,接收到的数据
uint wd_gaoi, wd_dii, shi_gaoi, shi_dii, sum; //温湿度传感器读取数据检测通过后各自赋给相应变量
uchar code F_Rotation[4]={0x20,0x40,0x80,0x10}; //步进电机正转表格
uchar code B_Rotation[4]={0x10,0x80,0x40,0x20}; //步进电机反转表格
uchar zhuan = 0; //选择电机转动方向
uchar chuang = 0; //窗户状态: 0 为关,1为开
uchar recval = 0; //串口数据存储位置
uchar deng = 0; //灯控制位
uchar com_dat, U8temp, yan;
uint U8FLAG;
sbit io = P0^0; //温湿度检测接口
sbit yw = P0^7; //烟雾传感器接口
sbit gx = P3^4; //光线强度检测数据接收口
sbit gh = P3^5; //干簧管接口
sbit bee = P0^3; //蜂鸣器控制口
sbit jdq = P3^6; //继电器控制口
sbit jdqz = P3^7; //总继电器控制口
/**************************************************************************************
********************************** 串口通讯 *****************************************
**************************************************************************************/
void chuankou_init()
{
SCON = 0x5a; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Focs,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定时器1为16位自动重装方式
TL1 = 0xE0; //设置定时器初值
TH1 = 0xFE; //设置定时器初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开总中断
ES = 1; //开串口中断
}
void send_data(uchar i,float dat)
{
switch(i)
{
case 1:TI = 1; printf("当前室内温度为:%.0f\n", dat); while(!TI); TI = 0; recval = 0; break;
case 2:TI = 1; printf("当前室内湿度为:%.0f\n", dat); while(!TI); TI = 0; recval = 0; break;
case 3:TI = 1; printf("室内烟雾及其他可燃气体浓度正常\n"); while(!TI); TI = 0; recval = 0; break;
case 7:TI = 1; printf("室内状态不正常,请勿进入\n"); while(!TI); TI = 0; recval = 0; break;
}
}
/******************************************************************************************
************************************ 温湿度检测 ******************************************
******************************************************************************************/
void delayus(uint x) //延时 2 US
{
uint a;
for(a = x;a>0;a--)
{
_nop_();
_nop_();
_nop_();
}
}
void delayms() //延时 8 MS
{
unsigned char i, j, k;
i = 1;
j = 194;
k = 160;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void COM() //温湿度数据接收与处理
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!io)&&U8FLAG++);
delayus(30);
U8temp=0;
if(io)U8temp=1;
U8FLAG=2;
while((io)&&U8FLAG++);
if(U8FLAG==1)break;
com_dat<<=1;
com_dat|=U8temp;
}
}
void re_dat() //温湿度传感器启动
{
io=0;
delayms();
io=1;
delayus(40);
io=1;
if(!io)
{
U8FLAG=2;
while((!io)&&U8FLAG++);
U8FLAG=2;
while((io)&&U8FLAG++);
COM();
shi_gao=com_dat;
COM();
shi_di=com_dat;
COM();
wd_gao=com_dat;
COM();
wd_di=com_dat;
COM();
check=com_dat;
io=1;
sum=(shi_gao+shi_di+wd_gao+wd_di); //校验读取数据
if(sum==check)
{
shi_gaoi=shi_gao;
shi_dii=shi_di;
wd_gaoi=wd_gao;
wd_dii=wd_di;
}
}
}
/*****************************************************************************************
************************************ 步进电机 *******************************************
******************************************************************************************/
void stepmotor()
{
uchar a;
uint n;
if((zhuan == 0) && (chuang == 1)) //电机转向控制
{
for(n = 0;n < 200;n++)
{
for(a = 0;a < 4;a++) //4相
{
P2 = B_Rotation[a]; //输出对应的相 可以自行换成反转表格
delayus (1500); //改变这个参数可以调整电机转速
}
}
P2 = 0;
recval = 0;
chuang = 0;
}
if((zhuan == 1) && (chuang == 0)) //
{
for(n = 0;n < 200;n++)
{
for(a = 0;a < 4;a++) //4相
{
P2 = F_Rotation[a]; //输出对应的相 可以自行换成反转表格
delayus (1500); //改变这个参数可以调整电机转速
}
}
P2 = 0;
recval = 0;
chuang = 1;
}
}
/*****************************************************************************************
*********************************** 烟雾传感器 ******************************************
******************************************************************************************/
void yanwu()
{
if(!yw)
{
jdqz = 1;
zhuan = 1;
// yan = 7;
}
else
{
yan = 0;
}
}
/*****************************************************************************************
************************************* 干簧管 & 光敏电阻 **********************************
******************************************************************************************/
void ganhuangguan()
{
if( ( gh == 1 ) && ( gx == 0 ) && ( deng == 0 ) ) //检测开门
{
delayms();
if(gh == 1)
{
deng++;
}
}
if( deng > 0 )
{
jdq = 1; //开灯
}
if( ( deng == 1 ) && ( gh == 0 ) )
{
delayms();
if(gh == 0)
{
deng++;
}
}
if( ( deng == 2 ) && ( gh == 1 ) )
{
delayms();
if(gh == 1)
{
deng++;
}
}
if( ( deng == 3 ) && ( gh == 0 ) )
{
delayms();
if(gh == 1)
{
deng = 0;
jdq = 0; //关灯
}
}
}
/*****************************************************************************************
************************************* 主函数 ********************************************
******************************************************************************************/
void main()
{
// uchar i;
P2M0 = 0xff;
P2M1 = 0x00;
chuankou_init(); //串口初始化
P2 = 0;
while(1)
{
switch(recval)
{
case 1: re_dat(); send_data(recval, wd_gaoi); break;
case 2: re_dat(); send_data(recval, shi_gaoi); break;
case 3: send_data(recval, 0); break;
case 4: send_data(recval, 0); break;
case 5: zhuan = 1; break; //开窗
case 6: zhuan = 0; break; //关窗
case 7: send_data(recval, 0); zhuan = 1; break;
}
stepmotor(); //步进电机启动
yanwu(); //烟雾传感器
ganhuangguan(); //干簧管
}
}
void isr() interrupt 4
{
RI=0; //串口接收中断标志位,为1时开始中断,因此需要软件清零以备下一次中断开始
recval = SBUF; //将接收到的数据存到recval
}
这个代码还是半成品,真真正的半成品,有不少bug。路过的大佬可以帮忙看看,感激不尽。
就这样子,遁走睡觉。(=-ω-)zzZZ