基于51单片机ds1302和ds18b20芯片方案设计书的电子日历 下载本文

内容发布更新时间 : 2024/6/18 21:55:10星期一 下面是文章的全部内容请认真阅读。

用DS1302时钟芯片、AT89C51单片机、温度传感器DS18B20、LCD液晶1602设计的电子日历,proteus仿真及C程序.

#include //包含单片机寄存器的头文件

#include //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int

sbit DQ=P3^7。//ds18b20与单片机连接口uchar data disdata[5]。uint tvalue。//温度值

uchar tflag。//温度正负标志

unsigned char code digit[10]={\。 //定义字符数组显示数字

sbit DATA=P3^6。 //位定义1302芯片的接口,数据输出端定义在P1.1引脚sbit RST=P3^4。 //位定义1302芯片的接口,复位端口定义在P1.1引脚

sbit SCLK=P3^5。 //位定义1302芯片的接口,时钟输出端口定义在P1.1引脚//液晶引脚定义

sbit RS=P2^0。 //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1。 //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2。 //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7。

/*****************************************************函数功能:延时若干微秒入口参数:n

***************************************************/ void delaynus(unsigned char n){

unsigned char i。

for(i=0。i

void Write1302(unsigned char dat){

unsigned char i。

SCLK=0。 //拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2)。 //稍微等待,使硬件做好准备 for(i=0。i<8。i++) {

DATA=dat&0x01。 //取出dat的第0位数据写入1302 delaynus(2)。 //稍微等待,使硬件做好准备 SCLK=1。

delaynus(2)。 //稍微等待,使硬件做好准备 SCLK=0。 //重新拉低SCLK,形成脉冲 dat>>=1。 }

}

/*****************************************************函数功能:根据命令字,向1302写一个字节数据

入口参数:Cmd,储存命令字;dat,储存待写的数据

***************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat) {

RST=0。 //禁止数据传递

SCLK=0。 //确保写数居前SCLK被拉低 RST=1。 //启动数据传输

delaynus(2)。 //稍微等待,使硬件做好准备 Write1302(Cmd)。 //写入命令字 Write1302(dat)。 //写数据

SCLK=1。 //将时钟电平置于已知状态 RST=0。 //禁止数据传递 }

unsigned char Read1302(void) {

unsigned char i,dat。

delaynus(2)。 //稍微等待,使硬件做好准备

for(i=0。i<8。i++) //连续读8个二进制位数据 {

dat>>=1。 //将dat的各数据位右移1位,因为先读出的是字节的最低位

if(DATA==1) //如果读出的数据是1

dat|=0x80。 //将1取出,写在dat的最高位

SCLK=1。 //将SCLK置于高电平,为下降沿读出 delaynus(2)。 //稍微等待

SCLK=0。 //拉低SCLK,形成脉冲下降沿 delaynus(2)。 //稍微等待 }

return dat。 //将读出的数据返回//dat已经是一位一位的存在单}// 片集中

unsigned char ReadSet1302(unsigned char Cmd) {

unsigned char dat。

RST=0。 //拉低RST

SCLK=0。 //确保写数居前SCLK被拉低 RST=1。 //启动数据传输

Write1302(Cmd)。 //写入命令字 dat=Read1302()。 //读出数据 SCLK=1。 RST=0。 return dat。 }

void Init_DS1302(void){

WriteSet1302(0x8E,0x00)。

WriteSet1302(0x80,((0/10)<<4|(0)))。 WriteSet1302(0x82,((0/10)<<4|(0)))。

WriteSet1302(0x84,((12/10)<<4|(12)))。 WriteSet1302(0x86,((16/10)<<4|(16)))。 WriteSet1302(0x88,((11/10)<<4|(11)))。 WriteSet1302(0x8c,((8/10)<<4|(8)))。 }

/*****************************************************函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/void delay1ms(){

unsigned char i,j。

for(i=0。i<10。i++)

for(j=0。j<33。j++) 。