摘 要
图3-1 定时中断处理程序框图
本系统还采用了外部中断,此外部中断主要用来判断是否有外来信号输入,若有,就采集下来并加以处理;若无,则返回到主循环。
3.2数据采集模块
本控制系统中的数据采集对象为环境光信号及人体存在信号,在程序设计中对这两个数据的采集放置在多任务模块中实施定时采集。 3.2.1人体存在传感器的优缺点
人体存在传感器具有本身不发出任何类型的辐射,器件功耗很小,隐蔽性好,价格低廉的优点。而缺点是容易受各种热源、光源干扰。由于红外穿透力差,因此人体的红外辐射容易被遮挡,不易被探头接收;易受射频辐射的干扰;当环境温度和人体温度接近时,探测和灵敏度就会明显下降,甚至造成短时失灵。试验也证明了这点,如果人体存在却一定时间内没有活动,人体传感器则认为没有人体存在。为避免这种现象的出现,本系统软件程序中设计为有人体存在状态后间隔1分钟或更长的时间来对人体存在参数信号的采集。 3.2.2数据采集软件的实现
本系统考虑到环境光足够亮时,无论是否有人体存在都不开灯;而环境光不够亮时,有人体存在才开灯,无人体存在则不开灯。本系统逻辑定义为:环境光亮时为逻辑“0\符合光采集电路输出信号状态),暗时为“1\,人体存在为“1\,人体不存在为“0\,开灯为“1”,关灯为“0\,那么环境光与人体存在可以用以下的逻辑关系表来表示,如表所示3.1:
表3.1 环境光与人体存在逻辑关系
环境光参数 0 1 0 1 人体存在参数 0 0 1 1 教室灯状态 0 0 0 1 上表数据表明可将环境光参数与人体存在参数进行与操作,又由于继电器是低电平驱动,所以要将采集处理后的信号进行非操作,才可以驱动继电器工作,
XVI
即可得到教室灯的状态。
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脚
XVIII
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); //允许写保护 }
3.4显示驱动模块
系统运行过程中的数据显示是人机交互对话的一个重要通道。通过的显示系统数据,我们才可以更好的了解系统运行的状态,从而方便对整个系统进行必要的操作。本系统中采用共阳极的数码管,其中采用ULN2803作为驱动数码管的
XX
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库毕业设计(论文)-基于AT89S51单片机的教室灯光智能控制系统设计2(4)在线全文阅读。
相关推荐: