电路原理图如下:
制作出来的实物图如下:
手机蓝牙控制器
单片机源程序如下:
- //蓝牙房间控制器
- //编写时间为2015-6-2
- //时钟用22.1M,cpu用STC12C5A60
- #include <stc12c5a60s2.h>
- #include <intrins.h>
- unsigned char oldkey,keyval,pagevol,bbtemp;
- unsigned int keyjixu ,jisu,tempxidu;
- bit BBkongvol,readtimekong,time05s,dingkong,timeauto,rscRSkong;
- unsigned char t_sec,t_min,t_hour,t_1224ji;
- unsigned char timetao,settao,RSzhuantai2,recRSjisu;
- unsigned char dingon_hour,dingon_min,dingoff_hour,dingoff_min;
- unsigned char recRSvol[6];
- extern void OLED_Init(void);
- extern void OLED_Clear(void);
- extern void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no);
- extern void OLED_ShowString(unsigned char x,unsigned char y, unsigned char *p);
- extern void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr);
- extern void OLED_32X16(unsigned char x,unsigned char y,unsigned char c);
- //外部引用DS1302子程序
- extern void write_time(unsigned char temp1,temp2);
- extern unsigned char read_time(unsigned char hangmu);
- extern void DS1302ini();
- sbit KEY1=P1^0;
- sbit KEY2=P1^1;
- sbit KEY3=P1^4;
- sbit KEY4=P1^5;
- sbit KEY5=P1^6;
- sbit KEY6=P1^7;
- sbit BB=P4^7;
- sbit OUT1=P2^7;
- sbit OUT2=P2^6;
- sbit OUT3=P2^5;
- sbit OUT4=P2^4;
- sbit OUT5=P2^3;
- sbit OUT6=P2^2;
- sbit OUT7=P2^1;
- sbit OUT8=P2^0;
- sbit DHT11DA=P3^6;
- void delay(unsigned int t) //长延时程序,延时t毫秒,STC 1T单片机11.0592M晶振I值为648,22.1I值为1298,12MI值为705。
- {
- unsigned int i;
- while(t--)
- {
- for(i=1298;i>0;i--);
- }
- }
-
- void delay10us() //延时10us,STC 1T单片机11.0592M晶振J值为23,22。1MJ值为51。
- {
- unsigned char j;
- for(j=51;j>0;j--);
- }
- //======================EEPROW偏程==============================
- //写字节时,可以将原有数据中的1改为0,无法将0改为1,只能使用擦除命令将0改为1
- //应注意,擦除命令会将整个扇区擦除
- //由于擦除会将整个扇区擦除,为了方便写,所以这里用第二扇区存第一屏的状态,
- //第三扇区存定时1的5个时间,每个时间有启用、开时间、关时间、星期(8b)
- //第四扇区存定时6-10,第5扇区存温度值,
- // 第二扇区地址0x0200-0x03ff,0x0400-0x05ff,0x0600-0x07ff,0x0800-0x09ff.
- void IAPIDLE()
- {
- IAP_CMD = 0; //关闭令,保护
- IAP_CONTR = 0; //关EEPROM,保护
- IAP_TRIG = 0;
- IAP_ADDRL = 0; //设置读取地址的低字节,地址改变才需要设置
- IAP_ADDRH = 0X80; //设置读取地址的高字节,地址改变才需要设置
- }
- unsigned char readEEP(unsigned int adddata)
- { //读取
- unsigned char eerdata;
- IAP_CONTR=0X83;//设置等待时间,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前导1表示许档IAP
- IAP_CMD = 1; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
- IAP_ADDRL = adddata; //设置读取地址的低字节,地址改变才需要设置
- IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即触发
- _nop_();
- eerdata=IAP_DATA;
- IAPIDLE();
- return eerdata;
- }
- void writeEEP(unsigned int adddata, unsigned char eerdata)
- {//写入
- IAP_CONTR=0X83;//设置等待时间,
- IAP_CMD = 2; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
- IAP_ADDRL = adddata; //设置读取地址的低字节,地址改变才需要设置
- IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
- IAP_DATA= eerdata;//传入数据
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即触发
- _nop_();
- IAPIDLE();
- }
- void eraseEEP(unsigned int adddata)
- { //擦除
- IAP_CONTR=0X83;//设置等待时间,
- IAP_CMD = 3; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
- IAP_ADDRL = adddata; //设置读取地址的低字节,地址改变才需要设置
- IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
- IAP_TRIG = 0x5A; //先送5A
- IAP_TRIG = 0xA5; //先送5A再送A5立即触发
- _nop_();
- IAPIDLE();
- }
- void writeDAT()
- {
- eraseEEP(0x0200);
- writeEEP(0x0200, dingkong);//定时状态
- writeEEP(0x0201, dingon_hour); // 开时
- writeEEP(0x0202, dingon_min);//开分
- writeEEP(0x0203, dingoff_hour);//关时
- writeEEP(0x0204, dingoff_min);//关分
- writeEEP(0x0205, BBkongvol);//按键不发声
- writeEEP(0x0206, timeauto);//自动校时
- }
- void timedisp() //时间提取。这里只读时分秒及星期,时采用24小时制。
- {
- unsigned char i,j,times,timeg;
- i =read_time(0x84);//读时,这里还要判断是24小时制还是12小时制。
- if(i>=0x80)
- { //12小时
- //只是小时的数值是最后5位为小时值,所以时的取法先置高3位为0,再除法及求余法。
-
- times=(i&0x1f)/16;//取高4位的数值给十分。
- timeg=i%16;//取低4位数值,把高4位置0。
- t_hour=times*10+timeg;
- j=i<<2;
- if(j>=0x80)
- {
- t_1224ji=1;//12小时制,0为24小时制。
- if(t_hour!=12){t_hour=t_hour+12;}//转为24小时,方便计算。
- }
- else
- {
- t_1224ji=1; //2为上午。
- if(t_hour==12)t_hour=0;//转为24小时,方便计算。
- }
- }
- else
- { //24小时
- times=i/16;//取高4位的数值给十分。
- timeg=i%16;//取低4位数值,把高4位置0。
- t_hour=times*10+timeg;
- t_1224ji=0;//24小时制
- }
- i=read_time(0x82);//读分
- times=i/16;
- timeg=i%16;
- t_min=times*10+timeg;
- i =read_time(0x80);//读秒
- times=i/16;
- timeg=i%16;
- t_sec=times*10+timeg;//算出当前秒数。
-
- }
- void disppage0(bit xaxin)
- {//当为0时,全屏更新,为1只刷新部份
- unsigned int kaka;
-
- if(xaxin==0)
- {
- OLED_Clear();
- // 蓝牙房间控制
- OLED_ShowCHinese(16,0,0);
- OLED_ShowCHinese(32,0,1);
- OLED_ShowCHinese(48,0,2);
- OLED_ShowCHinese(64,0,3);
- OLED_ShowCHinese(80,0,4);
- OLED_ShowCHinese(96,0,5);
- }
- //18:55:23 36C 75%
- if(timetao==1&&time05s!=0)
- {
- OLED_ShowChar(0,2,13);
- OLED_ShowChar(8,2,13);
- }
- else
- {
- OLED_ShowChar(0,2,t_hour/10);
- OLED_ShowChar(8,2,t_hour%10);
- }
- if(time05s!=0&&timetao==0)
- {
- OLED_ShowChar(16,2,13);
- OLED_ShowChar(40,2,13);
- }
- else
- {
- OLED_ShowChar(16,2,10);
- OLED_ShowChar(40,2,10);
- }
- if(timetao==2&&time05s!=0)
- {
- OLED_ShowChar(24,2,13);
- OLED_ShowChar(32,2,13);
- }
- else
- {
- OLED_ShowChar(24,2,t_min/10);
- OLED_ShowChar(32,2,t_min%10);
- }
- if(timetao==3&&time05s!=0)
- {
- OLED_ShowChar(48,2,13);
- OLED_ShowChar(56,2,13);
- }
- else
- {
- OLED_ShowChar(48,2,t_sec/10);
- OLED_ShowChar(56,2,t_sec%10);
- }
- kaka=tempxidu%256;
- OLED_ShowChar(72,2,kaka/10);
- OLED_ShowChar(80,2,kaka%10);
- OLED_ShowChar(88,2,11);
- kaka=tempxidu/256;
- OLED_ShowChar(104,2,kaka/10);
- OLED_ShowChar(112,2,kaka%10);
- OLED_ShowChar(120,2,12);
- //开关状态
- //读P0值,低电平为开,
- if((P0&0x01)==0)
- {
- OLED_ShowCHinese(0,4,7);
- }
- else
- {
- OLED_ShowCHinese(0,4,15);
- }
- if((P0&0x02)==0)
- {
- OLED_ShowCHinese(16,4,8);
- }
- else
- {
- OLED_ShowCHinese(16,4,16);
- }
- if((P0&0x04)==0)
- {
- OLED_ShowCHinese(32,4,9);
- }
- else
- {
- OLED_ShowCHinese(32,4,17);
- }
- if((P0&0x08)==0)
- {
- OLED_ShowCHinese(48,4,10);
- }
- else
- {
- OLED_ShowCHinese(48,4,18);
- }
- if((P0&0x10)==0)
- {
- OLED_ShowCHinese(64,4,11);
- }
- else
- {
- OLED_ShowCHinese(64,4,19);
- }
- if((P0&0x20)==0)
- {
- OLED_ShowCHinese(80,4,12);
- }
- else
- {
- OLED_ShowCHinese(80,4,20);
- }
- if((P0&0x40)==0)
- {
- OLED_ShowCHinese(96,4,13);
- }
- else
- {
- OLED_ShowCHinese(96,4,21);
- }
- if((P0&0x80)==0)
- {
- OLED_ShowCHinese(112,4,14);
- }
- else
- {
- OLED_ShowCHinese(112,4,22);
- }
- //灯及插座工作状态
- if(OUT1==0)
- {//低电平为开
- OLED_ShowCHinese(0,6,27);
- }
- else
- {
- OLED_ShowCHinese(0,6,23);
- }
- if(OUT2==0)
- {//低电平为开
- OLED_ShowCHinese(16,6,28);
- }
- else
- {
- OLED_ShowCHinese(16,6,24);
- }
- if(OUT3==0)
- {//低电平为开
- OLED_ShowCHinese(32,6,29);
- }
- else
- {
- OLED_ShowCHinese(32,6,25);
- }
- if(OUT4==0)
- {//低电平为开
- OLED_ShowCHinese(48,6,30);
- }
- else
- {
- OLED_ShowCHinese(48,6,26);
- }
- if(OUT5==0)
- {//低电平为开
- OLED_ShowCHinese(64,6,35);
- }
- else
- {
- OLED_ShowCHinese(64,6,31);
- }
- if(OUT6==0)
- {//低电平为开
- OLED_ShowCHinese(80,6,36);
- }
- else
- {
- OLED_ShowCHinese(80,6,32);
- }
- if(OUT7==0)
- {//低电平为开
- OLED_ShowCHinese(96,6,37);
- }
- else
- {
- OLED_ShowCHinese(96,6,33);
- }
- if(OUT8==0)
- {//低电平为开
- OLED_ShowCHinese(112,6,38);
- }
- else
- {
- OLED_ShowCHinese(112,6,34);
- }
- }
- void disppage1(bit xaxin)
- {//当为0时,全屏更新,为1只刷新部份
- if(xaxin==0)
- {
- OLED_Clear();
- //插座2定时设置
- OLED_ShowCHinese(0,0,41);
- OLED_ShowCHinese(16,0,42);
- OLED_ShowChar(32,0,2);
- OLED_ShowCHinese(40,0,43);
- OLED_ShowCHinese(56,0,44);
- OLED_ShowCHinese(72,0,45);
- OLED_ShowCHinese(88,0,46);
- }
- //选中 22:10-23:55
- if(settao==1&&time05s!=0)
- {
- OLED_ShowCHinese(0,2,6);
- }
- else
- {
- if(dingkong==0)
- {//当为0时不定时
- OLED_ShowCHinese(0,2,40);
- }
- else
- {
- OLED_ShowCHinese(0,2,39);
- }
- }
- if(settao==2&&time05s!=0)
- {
- OLED_ShowChar(16,2,13);
- OLED_ShowChar(24,2,13);
- }
- else
- {
- OLED_ShowChar(16,2,dingon_hour/10);
- OLED_ShowChar(24,2,dingon_hour%10);
- }
- OLED_ShowChar(32,2,10);
- if(settao==3&&time05s!=0)
- {
- OLED_ShowChar(40,2,13);
- OLED_ShowChar(48,2,13);
- }
- else
- {
- OLED_ShowChar(40,2,dingon_min/10);
- OLED_ShowChar(48,2,dingon_min%10);
- }
- OLED_ShowChar(56,2,14);
- if(settao==4&&time05s!=0)
- {
- OLED_ShowChar(64,2,13);
- OLED_ShowChar(72,2,13);
- }
- else
- {
- OLED_ShowChar(64,2,dingoff_hour/10);
- OLED_ShowChar(72,2,dingoff_hour%10);
- }
- OLED_ShowChar(80,2,10);
- if(settao==5&&time05s!=0)
- {
- OLED_ShowChar(88,2,13);
- OLED_ShowChar(96,2,13);
- }
- else
- {
- OLED_ShowChar(88,2,dingoff_min/10);
- OLED_ShowChar(96,2,dingoff_min%10);
- }
-
- //不选中 按键发声
- if(settao==6&&time05s!=0)
- {
- OLED_ShowCHinese(0,4,6);
- }
- else
- {
- if(BBkongvol==0)
- {
- OLED_ShowCHinese(0,4,40);
- }
- else
- {
- OLED_ShowCHinese(0,4,39);
- }
- }
- if(xaxin==0)
- {
- OLED_ShowCHinese(16,4,47);
- OLED_ShowCHinese(32,4,48);
- OLED_ShowCHinese(48,4,52);
- OLED_ShowCHinese(64,4,53);
- //OLED_ShowCHinese(80,4,53);
- }
- //不选中 自动效时
- if(settao==7&&time05s!=0)
- {
- OLED_ShowCHinese(0,6,6);
- }
- else
- {
- if(timeauto==0)
- {
- OLED_ShowCHinese(0,6,40);
- }
- else
- {
- OLED_ShowCHinese(0,6,39);
- }
- }
- if(xaxin==0)
- {
- OLED_ShowCHinese(16,6,49);
- OLED_ShowCHinese(32,6,50);
- OLED_ShowCHinese(48,6,54);
- OLED_ShowCHinese(64,6,55);
- }
- }
- //***********************键盘扫描子程序。******************
- //*********************************************************
- unsigned char keyboard()//键盘扫描
- {
- unsigned char keyboardj;
- keyboardj=0;
- if(KEY1==0)
- {
- delay(10);
- if(KEY1==0)
- {
- keyboardj=1;
- }
- }
- if(KEY2==0)
- {
- delay(10);
- if(KEY2==0)
- {
- keyboardj=2;
- }
- }
- if(KEY3==0)
- {
- delay(10);
- if(KEY3==0)
- {
- keyboardj=3;
- }
- }
- if(KEY4==0)
- {
- delay(10);
- if(KEY4==0)
- {
- keyboardj=4;
- }
- }
- if(KEY5==0)
- {
- delay(10);
- if(KEY5==0)
- {
- keyboardj=5;
- }
- }
- if(KEY6==0)
- {
- delay(10);
- if(KEY6==0)
- {
- keyboardj=6;
- }
- }
- return keyboardj;
- }
- //************键盘控制子程序***************
- //K2短按为开电源,关机显----,正常显铬铁实际温度,长按为调铬铁温度,最后个C闪,表示调温,再长按为存储并退出调温。
- //K3K1分别为向上向下,短按为慢速增加减少,长按为快速。调节范围为200-480度。
- //******************************************
- void keydisphong()//主要功能是
- {
- unsigned char keyyy;
- keyyy=keyboard();
- if (keyyy!=oldkey)
- {
- if(keyyy==0)//
- {
- if(keyjixu>0)
- {
- if(keyjixu<80)
- {
-
- if(oldkey==6)
- {
- keyval=6;
- }
- if(oldkey==5)
- {
- keyval=5;
- }
- }
- else
- {
- //keyval=11;
- keyjixu=0;
- }
- }
- else
- {
- keyval=0;
- keyjixu=0;
- }
- }
- if(keyyy==1)
- {
- if(OUT1==0)
- {
- OUT1=1;
- }
- else
- {
- OUT1=0;
- }
-
- }
- if(keyyy==2)
- {
- if(OUT2==0)
- {
- OUT2=1;
- }
- else
- {
- OUT2=0;
- }
- }
- if(keyyy==3)
- {
- if(OUT3==0)
- {
- OUT3=1;
- }
- else
- {
- OUT3=0;
- }
- }
- if(keyyy==4)
- {
- if(OUT4==0)
- {
- OUT4=1;
- }
- else
- {
- OUT4=0;
- }
- }
- if(keyyy!=0)
- {
- //刷新
- if(pagevol==0&&keyval!=6)disppage0(1);
- if(BBkongvol==1)
- {//当BB可以发声,就
- BB=1;//发响声。
- bbtemp=15;//
- }
- }
- }
- oldkey=keyyy;
- if(keyyy==5)//
- {
- keyjixu++;
- if(keyjixu>=80)
- {
- if((keyjixu%6)==0)
- {
- keyval=15;
- }
- }
- }
- if(keyyy==6)//
- {
- keyjixu++;
- if(keyjixu==80)keyval=16;
- }
-
- //键盘处理完成。
- //以下为功能子程序
- if(keyval==5)
- {
- keyval=0;//这步必须的,清键值。
- keyjixu=0;//清计数值,这两步是必要的。
- if(timetao==0&&settao==0)
- {
- //当不处于调整时,就控电器5
- if(OUT5==0)
- {
- OUT5=1;
- }
- else
- {
- OUT5=0;
- }
- }
- else
- {
- if(pagevol==0)
- {
- if(timetao==1)
- {//调时
- t_hour++;
- if(t_hour>23)t_hour=0;
- OLED_ShowChar(0,2,t_hour/10);
- OLED_ShowChar(8,2,t_hour%10);
- }
- if(timetao==2)
- {//调分
- t_min++;
- if(t_min>59)t_min=0;
- OLED_ShowChar(24,2,t_min/10);
- OLED_ShowChar(32,2,t_min%10);
- }
- if(timetao==3)
- {//调秒
- t_sec++;
- if(t_sec>59)t_sec=0;
- OLED_ShowChar(48,2,t_sec/10);
- OLED_ShowChar(56,2,t_sec%10);
- }
-
- }
- else
- {
- if(settao==1)
- {//调定时
- if(dingkong==0)
- {
- dingkong=1;
- }
- else
- {
- dingkong=0;
- }
- }
- if(settao==2)
- {//调开时
- dingon_hour++;
- if(dingon_hour>23)dingon_hour=0;
- OLED_ShowChar(16,2,dingon_hour/10);
- OLED_ShowChar(24,2,dingon_hour%10);
- }
- if(settao==3)
- {//调开分
- dingon_min++;
- if(dingon_min>59)dingon_min=0;
- OLED_ShowChar(40,2,dingon_min/10);
- OLED_ShowChar(48,2,dingon_min%10);
- }
- if(settao==4)
- {//调关时
- dingoff_hour++;
- if(dingoff_hour>23)dingoff_hour=0;
- OLED_ShowChar(64,2,dingoff_hour/10);
- OLED_ShowChar(72,2,dingoff_hour%10);
- }
- if(settao==5)
- {//调关分
- dingoff_min++;
- if(dingoff_min>59)dingoff_min=0;
- OLED_ShowChar(88,2,dingoff_min/10);
- OLED_ShowChar(96,2,dingoff_min%10);
- }
- if(settao==6)
- {//调发声
- if(BBkongvol==0)
- {
- BBkongvol=1;
- }
- else
- {
- BBkongvol=0;
- }
- }
- if(settao==7)
- {//调自动校时
- if(timeauto==0)
- {
- timeauto=1;
- }
- else
- {
- timeauto=0;
- }
- }
- }
-
- }
- }
- if(keyval==6)
- {
- keyval=0;//这步必须的,清键值。
- keyjixu=0;//清计数值,这两步是必要的。
- if(timetao==0&&settao==0)
- {
- if(pagevol==0)
- {
- pagevol=1;
- disppage1(0);
- }
- else
- {
- pagevol=0;
- disppage0(0);
- }
- }
- else
- {
- if(pagevol==0)
- {
- timetao++;
- if(timetao==4)
- {
- timetao=1;
-
- }
- }
- else
- {
- settao++;
- if(settao==8)
- {
- settao=1;
-
- }
- }
- }
- }
- if(keyval==15)
- {
- keyval=0;//这步必须的,清键值。
- //keyjixu=0;//清计数值,这两步是必要的。
- if(pagevol==0)
- {
- if(timetao==1)
- {//调时
- t_hour++;
- if(t_hour>23)t_hour=0;
- OLED_ShowChar(0,2,t_hour/10);
- OLED_ShowChar(8,2,t_hour%10);
- }
- if(timetao==2)
- {//调分
- t_min++;
- if(t_min>59)t_min=0;
- OLED_ShowChar(24,2,t_min/10);
- OLED_ShowChar(32,2,t_min%10);
- }
- if(timetao==3)
- {//调秒
- t_sec++;
- if(t_sec>59)t_sec=0;
- OLED_ShowChar(48,2,t_sec/10);
- OLED_ShowChar(56,2,t_sec%10);
- }
-
- }
- else
- {
- if(settao==2)
- {//调开时
- dingon_hour++;
- if(dingon_hour>23)dingon_hour=0;
- OLED_ShowChar(16,2,dingon_hour/10);
- OLED_ShowChar(24,2,dingon_hour%10);
- }
- if(settao==3)
- {//调开分
- dingon_min++;
- if(dingon_min>59)dingon_min=0;
- OLED_ShowChar(40,2,dingon_min/10);
- OLED_ShowChar(48,2,dingon_min%10);
- }
- if(settao==4)
- {//调关时
- dingoff_hour++;
- if(dingoff_hour>23)dingoff_hour=0;
- OLED_ShowChar(64,2,dingoff_hour/10);
- OLED_ShowChar(72,2,dingoff_hour%10);
- }
- if(settao==5)
- {//调关分
- dingoff_min++;
- if(dingoff_min>59)dingoff_min=0;
- OLED_ShowChar(88,2,dingoff_min/10);
- OLED_ShowChar(96,2,dingoff_min%10);
- }
-
- }
- }
- if(keyval==16)
- {//长按进入设置及退出设置
- keyval=0;//这步必须的,清键值。
- //keyjixu=0;//清计数值,这两步是必要的。
- if(pagevol==0)
- {
- if(timetao==0)
- {
- timetao=1;
- }
- else
- {//保存数据
- timetao=0;
- write_time(0X84,(t_hour/10)*16+t_hour%10);//时
- write_time(0X82,(t_min/10)*16+t_min%10);//写分
- write_time(0X80,(t_sec/10)*16+t_sec%10);//写秒
- }
- }
- else
- {
- if(settao==0)
- {
- settao=1;
- }
- else
- {//保存数据
- settao=0;
- writeDAT();
- }
- }
- }
-
- }
- void dingtimekong()
- {//定时控制,采用触发式。每0.5S比较一次
- if(dingkong==1)
- {
- if(dingon_hour==t_hour&&dingon_min==t_min)OUT6=0;
- if(dingoff_hour==t_hour&&dingoff_min==t_min)OUT6=1;
- }
- }
- unsigned char DHT11readbit()
- {
- unsigned char i,temp,dataDHT,caoxi;
- for(i=0;i<8;i++)
- {
- //数据时序先低电平50us,再高电平,当26-28us为0、70us为1。
- caoxi=2;
- while((!DHT11DA)&&caoxi++);//检测50us低电平是否过去。
- delay10us();delay10us();delay10us();//延时30us,再判断,如还是高电平就数据为1,如低电平为0。
- temp=0; //先置0
- if(DHT11DA)temp=1; //超过30us还是高电平的就置1。
- caoxi=2;
- while((DHT11DA)&&caoxi++);//如还是高电平就等它为低电平,如超时就跳出循环.
- //超时则跳出for循环
- if(caoxi==1)break;
- //合成数据
- dataDHT<<=1;
- dataDHT|=temp;
- }
- return(dataDHT);
- }
- unsigned int DHT11read() //由于返回的温度及湿度只有2个8b,所以用个16b的来存贮,前8位为湿度,后8位为温度。
- {
- unsigned char temp1,temp2,temp3,temp4,temp5,caoxi;
- unsigned int DHTdata ;
- //主机拉低大于18ms
- DHT11DA=0;
- delay(20);
- DHT11DA=1;
- //主机放开总线,由上拉电阻拉高 主机延时20us-40us.
- delay10us();delay10us();delay10us();delay10us();
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下读数。
- if(DHT11DA==0)
- {
- caoxi=2;//初始化超时值,对于22M晶振为175us,主要是防止DHT不动作引起程序进入死循环,超时就跳出来。
- while((!DHT11DA)&&caoxi++);
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- caoxi=2;
- while((DHT11DA)&&caoxi++);
- //数据接收状态
- temp1=DHT11readbit();
- temp2=DHT11readbit();
- temp3=DHT11readbit();
- temp4=DHT11readbit();
- temp5=DHT11readbit();
- //数据校验
- DHT11DA=1;
- if(temp5=(temp1+temp2+temp3+temp4)) //如校对正确就组合数据,并返回。
- {
- DHTdata=temp1*256+temp3;
- }
- else
- {
- DHTdata=0;//当数据不正确时,就送0值,当然这一步看情况来决定是否用它。
- }
- }
- return(DHTdata); //返回数据
- }
- void rs2232tx(unsigned char txdata)//串口2发送程序
- {
- S2BUF=txdata;//把数据传给串口寄存器SBUF。
- while(!(S2CON & 0x02));//检测是否发完。
- //S2TI=0;//重置初值。
- S2CON=S2CON & 0xfd;
- }
- void senddata()
- {//串口数据发送,命令格式EF,EE,P0(低7位开关状态),P2(低7位输出状态),P0P2第8位(主要是防止与引导码冲突),温度,湿度,定时状态,开时,开分,关时,关分,FF 不进行校验数据。
- //为方便手机编程,传送的数据用BCD码
- unsigned char kkkkk,hhhh;
- rs2232tx(0xef);
- rs2232tx(0xee);
- rs2232tx(P0&0x7f);
- rs2232tx(P2&0x7f);
- kkkkk=0;
- if((P0&0x80)!=0)
- {
- kkkkk=kkkkk+2;
- }
- if((P2&0x80)!=0)
- {
- kkkkk=kkkkk+1;
- }
- rs2232tx(kkkkk);
- kkkkk=tempxidu%256;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- kkkkk=tempxidu/256;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- rs2232tx(dingkong);
- kkkkk=dingon_hour;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- kkkkk=dingon_min;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- kkkkk=dingoff_hour;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- kkkkk=dingoff_min;
- hhhh=(kkkkk/10)*16+kkkkk%10;
- rs2232tx(hhhh);
- rs2232tx(0xff);
- }
- void rscRSkongji()
- {//串口数据接收后处理子程序
- //开关控制 命令 01 受控值,00,00,00,00
- //校时控制 命令 02 时 分 秒 00 00
- //定时控制 命令 03 受控值 开时 开分 关时 关分
- if(rscRSkong==1)
- {//收到处理的数据
-
- switch(recRSvol[0])
- {
- case 1:
- if((recRSvol[1]&0x01)!=0)
- {//当手机开关1按下
- if(OUT1==0)
- {
- OUT1=1;
- }
- else
- {
- OUT1=0;
- }
- }
- if((recRSvol[1]&0x02)!=0)
- {//当手机开关1按下
- if(OUT2==0)
- {
- OUT2=1;
- }
- else
- {
- OUT2=0;
- }
- }
- if((recRSvol[1]&0x04)!=0)
- {//当手机开关1按下
- if(OUT3==0)
- {
- OUT3=1;
- }
- else
- {
- OUT3=0;
- }
- }
- if((recRSvol[1]&0x08)!=0)
- {//当手机开关1按下
- if(OUT4==0)
- {
- OUT4=1;
- }
- else
- {
- OUT4=0;
- }
- }
- if((recRSvol[1]&0x10)!=0)
- {//当手机开关1按下
- if(OUT5==0)
- {
- OUT5=1;
- }
- else
- {
- OUT5=0;
- }
- }
- if((recRSvol[1]&0x20)!=0)
- {//当手机开关1按下
- if(OUT6==0)
- {
- OUT6=1;
- }
- else
- {
- OUT6=0;
- }
- }
- if((recRSvol[1]&0x40)!=0)
- {//当手机开关1按下
- if(OUT7==0)
- {
- OUT7=1;
- }
- else
- {
- OUT7=0;
- }
- }
- if((recRSvol[1]&0x80)!=0)
- {//当手机开关1按下
- if(OUT8==0)
- {
- OUT8=1;
- }
- else
- {
- OUT8=0;
- }
- }
- break;
- case 2:
- //手机自动校时,当手机建立连接时,如需自动校时,就启用。这是在串口中断程序内执行。
- if(timeauto==1)
- {
- write_time(0X84,(recRSvol[1]/10)*16+recRSvol[1]%10);//时
- write_time(0X82,(recRSvol[2]/10)*16+recRSvol[2]%10);//写分
- write_time(0X80,(recRSvol[3]/10)*16+recRSvol[3]%10);//写秒
- }
- break;
- case 3: //需BCD码转16进
- dingkong=recRSvol[1];
- dingon_hour=(recRSvol[2]/16)*10+recRSvol[2]%16;
- dingon_min=(recRSvol[3]/16)*10+recRSvol[3]%16;
- dingoff_hour=(recRSvol[4]/16)*10+recRSvol[4]%16;
- dingoff_min=(recRSvol[5]/16)*10+recRSvol[5]%16;
- writeDAT();
- break;
- default: break;
- }
-
- rscRSkong=0;
- }
-
- }
- void sysintEEP()
- {
- dingkong=readEEP(0x0200);//定时状态
- dingon_hour=readEEP(0x0201); // 开时
- if(dingon_hour>23)dingon_hour=23;
- dingon_min=readEEP(0x0202);//开分
- if(dingon_min>59)dingon_min=59;
- dingoff_hour=readEEP(0x0203);//关时
- if(dingoff_hour>23)dingoff_hour=23;
- dingoff_min=readEEP(0x0204);//关分
- if(dingoff_min>59)dingoff_min=59;
- BBkongvol=readEEP(0x0205);//按键不发声
- timeauto=readEEP(0x0206);//自动校时
- }
- void Timer0Init(void) //1毫秒@22.1MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x9A; //设置定时初值
- TH0 = 0xA9; //设置定时初值
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
手机蓝牙房间控制器.zip
(132.33 KB, 下载次数: 17)
|