(完整版)基于AT89S51单片机的教室灯光智能控制毕业论文 下载本文

#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=dat116; 数据进制转换 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作为驱动数码管的段选的芯片,采用简单又便宜的9012三极管来驱动数码管的位选,节约成本,程序编写简单。

考虑到数码管驱动信号要求的电流较大,采用功率驱动器件ULN2803芯片。此芯片是八组NPN型达林顿功放三极管集成芯片,典型的输入电压是5V,集电极输出功率可达50V×0.6A。因此采用ULN2803共阳极数码管的段信号驱动器。而共阳极数码管的位信号驱动则采用8个晶体管9012来实现。又由于ULN2803为低电平驱动,所以数据送到单片机端口前,应在程序中先将数据取反。然后将数据送到ULN2803输入端相连接单片机的P0端口即可。

每次先送一位要显示的数据字节,然后再送该位数码管的地址字节,直到8位显示完全。

本系统在运行过程中需要显示查看的数据有时钟及显示数值。正常工作中8位显示器显示实时时钟,显示小时、分钟、秒,其中有两位用来显示“—”,用以分隔显示小时、分钟和秒,这样显示更加清晰。