基于单片机DS1302的时钟万年历(带闹钟)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#define uchar unsigned char

#define uint unsigned int

sbit lcdws=P2^1; //1602管脚定义

sbit lcden=P2^0;

sbit lcdrs=P2^2;

sbit key1=P2^3; //闹钟设置键

sbit key2=P2^4;

sbit key3=P1^5;//功能键定义

sbit key4=P1^6;//增大键定义

sbit key5=P1^7;//减小键定义

uchar shi,fen,miao,ashi,afen,amiao,year,month,day,week; uchar s1num=0,s1num2=0,temp;

bit flag;

float f_temp;

uint i,d;

uchar code table2[]={0x20,0x20,0x2e,0x20,0xdf,0x43};

uchar code table[]="20 - - ";

uchar code table1[]=" : : ";

sbit ds=P1^0;//ds18b20信号线

sbit beep=P1^4; //蜂鸣器管脚定义

sbit ACC_7 = ACC^7; //位寻址寄存器定义

sbit SCLK = P1^2; // DS1302时钟信号sbit DIO= P1^1; // DS1302数据信号sbit CE = P1^3;

//地址、数据发送子程序

//void delay2(uint ms)

// {

// uchar t;

// while(ms--); for(t=0;t<120;t++);

//}

// void playmusic()

// {

// uint i2=0,j2,k2;

// while(jiepai[i2]!=0||song[i2]!=0)

// {

// for(j2=0;j2

// {

// beep=~beep;

// for(k2=0;k2

// }

// delay2(10);

// i2++;

// }

// }

void write_1302( uchar addr,uchar dat )

{

uchar 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;

}

//数据读取子程序

uchar Read1302 ( uchar 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%16;

dat1=dat1+dat2*10;

return (dat1);

}

//初始化DS1302

void Initial(void) //初始化1302 2010年09月30日23点58分56秒星期一{

write_1302 (0x8e,0x00); //允许写保护

write_1302 (0x80,0x56); //秒位初始化

write_1302 (0x82,0x58); //分钟初始化

write_1302 (0x84,0x23); //小时初始化

write_1302 (0x86,0x30); //日初始化

write_1302 (0x88,0x09); //月初始化

write_1302 (0x8c,0x10); //年初始化

write_1302 (0x8a,0x01); //日期始化

write_1302 (0x8e,0x80); //禁止写保护

}

void delay(uint z)//延时1ms

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(uchar com)//1602写命令

{

lcdrs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

相关文档
最新文档