基于51单片机ds1302和ds18b20芯片设计的电子日历.docx
- 文档编号:328056
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:13
- 大小:43.24KB
基于51单片机ds1302和ds18b20芯片设计的电子日历.docx
《基于51单片机ds1302和ds18b20芯片设计的电子日历.docx》由会员分享,可在线阅读,更多相关《基于51单片机ds1302和ds18b20芯片设计的电子日历.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机ds1302和ds18b20芯片设计的电子日历
用DS1302时钟芯片、AT89C51单片机、温度传感器DS18B20、LCD液晶1602设计的电子日历,proteus仿真及C程序.
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7;//ds18b20和单片机连接口
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志
unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字
sbitDATA=P3^6;//位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbitRST=P3^4;//位定义1302芯片的接口,复位端口定义在P1.1引脚
sbitSCLK=P3^5;//位定义1302芯片的接口,时钟输出端口定义在P1.1引脚
//液晶引脚定义
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;
/*****************************************************
函数功能:
延时若干微秒
入口参数:
n
***************************************************/
voiddelaynus(unsignedcharn)
{
unsignedchari;
for(i=0;i } voidWrite1302(unsignedchardat) { unsignedchari; 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,储存待写的数据 ***************************************************/ voidWriteSet1302(unsignedcharCmd,unsignedchardat) { RST=0;//禁止数据传递 SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 delaynus (2);//稍微等待,使硬件做好准备 Write1302(Cmd);//写入命令字 Write1302(dat);//写数据 SCLK=1;//将时钟电平置于已知状态 RST=0;//禁止数据传递 } unsignedcharRead1302(void) { unsignedchari,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);//稍微等待 } returndat;//将读出的数据返回//dat已经是一位一位的存在单 }//片集中 unsignedcharReadSet1302(unsignedcharCmd) { unsignedchardat; RST=0;//拉低RST SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 Write1302(Cmd);//写入命令字 dat=Read1302();//读出数据 SCLK=1; RST=0; returndat; } voidInit_DS1302(void) { WriteSet1302(0x8E,0x00); WriteSet1302(0x80,((0/10)<<4|(0%10))); WriteSet1302(0x82,((0/10)<<4|(0%10))); WriteSet1302(0x84,((12/10)<<4|(12%10))); WriteSet1302(0x86,((16/10)<<4|(16%10))); WriteSet1302(0x88,((11/10)<<4|(11%10))); WriteSet1302(0x8c,((8/10)<<4|(8%10))); } /***************************************************** 函数功能: 延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ voiddelay1ms() { unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能: 延时若干毫秒 入口参数: n ***************************************************/ voiddelaynms(unsignedcharn) { unsignedchari; for(i=0;i delay1ms(); } bitBusyTest(void) { bitresult; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result=BF; E=0; returnresult; } voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1); RS=0; RW=0; E=0; _nop_(); _nop_(); P0=dictate; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } / voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80); } voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1; RW=0; E=0; P0=y; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } voidLcdInitiate(void) { delaynms(15); WriteInstruction(0x38); delaynms(5); WriteInstruction(0x38); delaynms(5); WriteInstruction(0x38); delaynms(5); WriteInstruction(0x0c); delaynms(5); WriteInstruction(0x06); delaynms(5); WriteInstruction(0x01); delaynms(5); } voidDisplaySecond(unsignedcharx) { unsignedchari,j; i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x49); WriteData(digit[i]); WriteData(digit[j]); delaynms(50); } voidDisplayMinute(unsignedcharx) { unsignedchari,j; i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x46); WriteData(digit[i]); WriteData(digit[j]); delaynms(50);//延时1ms给硬件一点反应时间 } voidDisplayHour(unsignedcharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10; j=x%10; WriteAddress(0x43); WriteData(digit[i]); WriteData(digit[j]); delaynms(50); } voiddelay_18B20(unsignedinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ { unsignedcharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0; delay_18B20(100); DQ=1; delay_18B20(40); } uchards1820rd()/*读数据*/ { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) {DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } voidds1820wr(ucharwdata
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 ds1302 ds18b20 芯片 设计 电子 日历
![提示](https://static.bdocx.com/images/bang_tan.gif)