智能照明控制器(基于24c02和光敏电阻的使用)

需要用到的函数和变量来实现相应的功能:

数码管显示一般只直接显示数据,所以先要将数据给处理好

调用相关的函数将光敏电阻传感器产生的值放入到一个变量中

进行数据的分析函数:根据光照强度点亮相关的led灯,等级

打开24c02

定义按键函数: 按键1 实时显示数码管的值,然后将光敏电阻产生的数据放入到24c02的存储器中

按键2 显示 24c02中的数据

主函数while中 一直判断一直显示

存储变化的数值要用全局变量

实现具体步骤:

定义4个变量,用来存放实时的光敏电阻的值和将数据保存到24c02中的数据

调用数码管显示函数

先显示实时光敏电阻的值:

调用iic协议:

iic初始化,写入器件地址(0x90),等待应答,写入芯片对应的外设的地址光敏电阻(0x01),等待应答,iic结束 数码管显示相关的值 iic初始化 ,写入器件地址(0x91),等待应答,创建变量接收数值,发送终止iic信号(1),iic结束

led处理函数:需要将光敏电阻的显示调用到,根据光敏电阻的值来进行等级的划分

调用24c02:

写入函数 :需要填入地址,和数据

将地址和数据写入到24c02中:iic初始化,写入设备地址地址(0xa0),等待应答,写入需要存储的地址(addr),等待应答,写入数据(date),等待应答,终止iic

读取函数: 需要填入地址

        为写操作:iic初始化,等待应答,写入设备地址(0xa0),等待应答,写入要读取数据的地址(addr),等待应答,iic初始化,写入设备地址(0xa1),等待应答,创建变量接收数据,发送终止信号(1),停止iic,返回变量

按键处理函数:按键1按下,将数据写入到相关的地址中,等待按键松开显示实时数据

        按键2按下,利用创建的变量接收读取的数据,数码管显示数据(不是实时显示数据)

注意的是:数码管需要定义两个用来显示实时数据和存储在24c02中的数据

调用24c02函数时,是将数据写入到地址中,写两个数据中间不需要用到延时函数

#include <STC15F2K60S2.H>
#include"iic.h"
unsigned char dat_1;
unsigned char level;
unsigned char dat_2=0;
unsigned char level_1=0;
sbit S5=P3^2;
sbit S4=P3^3;
code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};
void delay(unsigned int i);
void select138(unsigned char n)
{
	switch(n)
	{
		case 4: P2=(P2&0x1f)|0x80;
		break;
		case 5: P2=(P2&0x1f)|0xa0;
		break;
		case 6: P2=(P2&0x1f)|0xc0;
		break;
		case 7: P2=(P2&0x1f)|0xe0;
		break;
	}
}

void smg_bite(unsigned char date, unsigned char pos)
{
	select138(6);
	P0=0x01<<pos;
	select138(7);
	P0=date;
}

void  shoutdown(unsigned char date)
{
	select138(6);
	P0=0xff;
	P0=date;

}
void smg_show()
{
	smg_bite(SMG_NoDot[16],0);
	delay(500);
	smg_bite(SMG_NoDot[level],1);
	delay(500);
	smg_bite(SMG_NoDot[16],2);
	delay(500);
	smg_bite(0xff,3);
	delay(500);
	smg_bite(0xff,4);
	delay(500);
	smg_bite(SMG_NoDot[(dat_1/100)%10],5);
	delay(500);
	smg_bite(SMG_NoDot[(dat_1%100)/10],6);
	delay(500);
	smg_bite(SMG_NoDot[dat_1%10],7);
	delay(500);
	shoutdown(0xff);
	delay(500);
}
void smg_show_1()
{
	smg_bite(SMG_NoDot[16],0);
	delay(500);
	smg_bite(SMG_NoDot[level_1],1);
	delay(500);
	smg_bite(SMG_NoDot[16],2);
	delay(500);
	smg_bite(0xff,3);
	delay(500);
	smg_bite(0xff,4);
	delay(500);
	smg_bite(SMG_NoDot[(dat_2/100)%10],5);
	delay(500);
	smg_bite(SMG_NoDot[(dat_2%100)/10],6);
	delay(500);
	smg_bite(SMG_NoDot[dat_2%10],7);
	delay(500);
	shoutdown(0xff);
	delay(500);
}

void delay(unsigned int i)
{
	while(i--);
}

void RD1()
{
	IIC_Start(); 
	IIC_SendByte(0x90); 
	IIC_WaitAck(); 
	IIC_SendByte(0x01);
	IIC_WaitAck();
	IIC_Stop(); 
	
	smg_show();
	
	IIC_Start(); 
	IIC_SendByte(0x91); 
	IIC_WaitAck(); 
	dat_1=IIC_RecByte(); 
	IIC_SendAck(1); 
	IIC_Stop(); 
	
	smg_show();
}

void auto_show()
{		RD1();
		select138(4);
		if(dat_1>200)
					{
						level=1;
						P0=0xfe;
					}
					
					else if( dat_1>150 && dat_1<200)
					{
						level=2;
						P0=0xfc;
					}
					
					else if(dat_1>100&& dat_1<150)
					{
						level=3;
						P0=0xf0;
					}
					
					else if(dat_1>50&&dat_1<100)
					{
						level=4;
						P0=0xc0;
					}
					
					else 
					{
						level=5;
						P0=0x00;
					}
}



void _24c02(unsigned char date,unsigned char addr)
{
	IIC_Start(); 
	IIC_SendByte(0xa0); 
	IIC_WaitAck(); 
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop(); 
	
}

unsigned char _24c02read(unsigned char addr)
{
	unsigned char date;
	IIC_Start(); 
	IIC_SendByte(0xa0); 
	IIC_WaitAck(); 
	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start(); 
	IIC_SendByte(0xa1); 
	IIC_WaitAck(); 
	date=IIC_RecByte(); 
	IIC_SendAck(1);
	IIC_Stop();
	return date;

}

void key()
{
					
	if(S4==0)
	{
		delay(500);
			if(S4==0)
			{
				_24c02(dat_1,0x06);
				
				_24c02(level,0x05);
				
				
			
				
				
				while(S4==0)
				{
					
					smg_show();
					
				}
			}
	}
	if(S5==0)
	{
		delay(500);
		if(S5==0)
		{
				level_1=_24c02read(0x05);
				
				dat_2 = _24c02read(0x06);
			
				
			while(S5==0)
			{
				smg_show_1();
			}
		
		}
	
	}

}



void  main()
{	
	while(1)
	{
	auto_show();
	smg_show();
	key();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值