内容发布更新时间 : 2024/11/5 17:20:27星期一 下面是文章的全部内容请认真阅读。
用DS1302时钟芯片、AT89C51单片机、温度传感器DS18B20、LCD液晶1602设计的电子日历,proteus仿真及C程序.
#include
#include
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++) 。