最初接触单片机就是自己想把自己的汽车改成自动大灯(可能是自己懒,又可能是为了安全,但后面实际上耗费了大量精力)。最开始是买了个开发板在家看教程学习了好几天,然后就买了继电器,8个一起的,但我因车的原因,只用了两个,所以大的开发板加上长的继电器放在车上换挡的地方,你们脑补一下有多乱多丑。经过了一年多的升级,做了最小系统,把最初的光敏二极管换成了红外线感应器(自己焊接的感应器),把8组继电器换成了2个,可以直接放在仪表台下面。 ————————这里是正题————————-------功能:通过红外线感应器接收自然光,adc转换器处理接收到的光的强度,再发送到51单片机处理,单片机通过设定好的判断程序控制继电器闭合,延时断开。
-------材料:单片机最小系统 图1(电路板+stc8952芯片)、红外传感 图2、继电器 图3、pcf8591adc转换器 图4、车载usb充电器、usb充电线给单片机 供电用,所以要看好单片机的接口是哪种)、杜邦线若干。
------接线及烧写:继电器控制接口接单片机p1.4与p1.5,pcf8591的scl与sda分别接单片机的p2.1与p2.0,红外感应器out接口接pcf8591的AIN0或AIN1(两个接口只有一个是正确的),其余的该接vcc的接vcc,该接gnd的接gnd(汽车部分接线不懂的请咨询汽车维修工程师,请勿乱接,发生危险我是不负责的),下载器我用的cp2102,怎么下载请去百度一下。最后附上程序,程序可以根据自己喜好去修改,若有高手发现程序中有可以优化的地方请指出及把修改后的程序发出来。
图1
图2
图3
图4
下载器
红外线强度+out+按键V1.2的单片机源程序如下:
- /****************************************************
- 自动控制
- 红外线感应电阻IR与ADC构成亮度检测电路,
- 光线弱时继电器闭合灯光开启,光线强时继电器延时断开灯光关闭,达到节约电量同时保证黑夜行驶安全。
- ****************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #include"IIC.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- unsigned char Voltage;
- unsigned char Voltagetwo;
- sbit turn1=P1^4;//开关
- sbit turn2=P1^5;
- sbit turn3=P1^6;
- sbit turn0=P1^7;//悬空
- sbit turn4=P1^3;
- sbit k1=P3^6;//按键
- u16 t;
- u8 bz;
- void delay(int j) //误差 0us
- {
- int i;
- for(j;j>0;j--)
- for(i=0;i<110;i++);
- }
-
- void IR() //第一感应器
- {
- ADC_Init();
- Voltage=ADC_Read(); //读取光敏电阻采样电压//最大255,用10进制转换为16进制
-
- if((Voltage<0x0a)&&(bz==0)){bz=1;turn1=0;} //比较函数
- if(bz==1){t=t+1;if(t>20){bz=0;t=0;}} //时钟延时函数
- if((Voltage<0x32)&&(bz==0)){bz=0;turn2=0;}
- if(bz==1){t=t+1;if(t>200){bz=0;t=0;}} //时钟延时函数
-
- if((Voltage>0x12)&&(bz==0)){bz=2;turn0=1;}//故意添加一个空指令来延长时间
- if(bz==2){t=t+1;if(t>1100){bz=0;t=0;}}
- if((Voltage>0x50)&&(bz==0)){bz=3;turn1=1;}
- if(bz==3){t=t+1;if(t>1100){bz=0;t=0;}}
- if((Voltage>0xc8)&&(bz==0)){bz=0;turn2=1;}
-
- if(k1==0){t=t+1;if(t>20){turn3=~turn3;t=0;}}//按键处理
- }
- void IRw() //第二个感应器
- {
- ADC_Inittwo();
- Voltagetwo=ADC_Read(); //读取光敏电阻采样电压//最大255,用10进制转换为16进制
-
- //以下是远光控制
-
- if(Voltagetwo>0x64){turn4=0;}
- if(Voltagetwo<0x32){turn4=1;}
- }
- void main()
- {
- turn1=1; //开机优先处理值
- turn2=1;
- turn4=1;
- delay(500);
- while(1)
- {
- IR();
- IRw();
- }
- }
复制代码
所有资料51hei提供下载:
红外线强度 out 按键V1.2 - 副本.rar
(47.56 KB, 下载次数: 63)
|