2020年整理基于单片机DS1302的时钟万年历(带闹钟).doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;