当前位置:首页 > 单片机
亮时为逻辑“0\符合光采集电路输出信号状态),暗时为“1\,人体存在为“1\,人体不存在为“0\,开灯为“1”,关灯为“0\,那么环境光与人体存在可以用以下的逻辑关系表来表示,如表所示3.1:
表3.1 环境光与人体存在逻辑关系
环境光参数 0 1 0 1 人体存在参数 0 0 1 1 教室灯状态 0 0 0 1 上表数据表明可将环境光参数与人体存在参数进行与操作,又由于继电器是低电平驱动,所以要将采集处理后的信号进行非操作,才可以驱动继电器工作,即可得到教室灯的状态。 3.3时钟模块
在系统启动自检初始化时,首先会对时钟芯片DS1302的运行状态进行判断,当检测到DS1302处于启动状态时才对其进行初始化,启动时钟。实时时钟芯片DS1302的初始化及其读写程序设计的关键是要遵循其时序要求。 3.3.1数据输入输出
在对DS1302进行各种操作之前,必须先对其初始化,即需要把复位输入RST端置为高电平,如果RST输入为低电平,那么所有的数据传送中止,且I/O引脚变为高阻抗状态。在数据读/写完后,RST端应置成低电平,以防止外部干扰对DS1302内部时钟的影响。
同时,为了防止复位输入端受到外部的干扰,要求上电时,在主电源引脚Vcc2≥2.5V之前,RST必须为逻辑0。无论是读操作还是写操作,都必须在开头的8个时钟周期内把提供地址和命令信息的8位数据装入到DS1302的移位寄存器中。地址/命令信息用于指明40个寄存器中的哪个进行何种操作。数据在SCLK的上升沿串行输入,在开始的8个时钟周期把命令字装入移位寄存器之后,若跟随的是写命令字节,则在下8个SCLK周期的上升沿输入数据字节,若跟随在读命令字节的8个SCLK周期之后,在下8个SCLK周期的下降沿输出数据字节。程序流程如图3-3所示:
图3-3数据输入输出流程图
3.3.2时钟程序设计
驱动程序 //寄存器宏定义
#define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR 0x84 #define READ_SECOND 0x81 #define READ_MINUTE 0x83 #define READ_HOUR 0x85 #define WRITE_PROTECT 0x8E //位寻址寄存器定义
sbit ACC_7 = ACC^7; //管脚定义
sbit SCLK = P3^5; // DS1302时钟信号 7脚 sbit DIO= P3^6; // DS1302数据信号 6脚 sbit CE = P3^7; // DS1302片选 5脚 //地址、数据发送子程序
void Write1302 ( unsigned char addr,dat ) {
unsigned char i,temp;
CE=0; //CE引脚为低电平,数据传送中止 SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高电平,逻辑控制有效 //发送地址
for ( i=8; i>0; i-- ) //循环8次移位 {
SCLK = 0; temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1; } //发送数据
for ( i=8; i>0; i-- ) {
SCLK = 0; temp = dat;
DIO = (bit)(temp&0x01); dat >>= 1; SCLK = 1; } CE = 0; }
//数据读取子程序
unsigned char Read1302 ( unsigned char addr ) {
unsigned char i,temp,dat1,dat2; CE=0;
SCLK=0; CE = 1; //发送地址
for ( i=8; i>0; i-- ) //循环8次移位 {
SCLK = 0; temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1; }
//读取数据
for ( i=8; i>0; i-- ) {
ACC_7=DIO; SCLK = 1; ACC>>=1; SCLK = 0; } CE=0; dat1=ACC;
dat2=dat1/16; //数据进制转换 dat1=dat1; //十六进制转十进制 dat1=dat1+dat2*10; return (dat1); }
//初始化DS1302 void Initial(void) {
Write1302 (WRITE_PROTECT,0X00); //禁止写保护 Write1302 (WRITE_SECOND,0x56); //秒位初始化 Write1302 (WRITE_MINUTE,0x34); //分钟初始化 Write1302 (WRITE_HOUR,0x12); //小时初始化 Write1302 (WRITE_PROTECT,0x80); //允许写保护 }
共分享92篇相关文档