课程设计论文-基于at89s52单片机的电子万年历设计内容摘要:

{ uint x,y。 for(x=z。 x0。 x) for(y=112。 y0。 y)。 } /*********************************************************** ******************DS1302 驱动程序 ****************** ************************************************************/ void DS1302InputByte(unsigned char d) //实时时钟写入一字节 (内部函数 ) { unsigned char i。 ACC = d。 for(i=8。 i0。 i) { DS1302_IO = ACC0。 //相当于汇编中的 RRC DS1302_CLK = 1。 DS1302_CLK = 0。 ACC = ACC 1。 } } unsigned char DS1302OutputByte(void) //实时时钟读取一字节 (内部函数 ) { unsigned char i。 for(i=8。 i0。 i) { ACC = ACC 1。 //相当于汇编中的 RRC ACC7 = DS1302_IO。 DS1302_CLK = 1。 DS1302_CLK = 0。 } return(ACC)。 } void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302 地址 , ucData: 要写的数据 { DS1302_RST = 0。 DS1302_CLK = 0。 徐州师范 大学 物理与 电子工程学院课程 设计 报告 14 DS1302_RST = 1。 DS1302InputByte(ucAddr)。 // 地址,命令 DS1302InputByte(ucDa)。 // 写 1Byte 数据 DS1302_CLK = 1。 DS1302_RST = 0。 } unsigned char Read1302(unsigned char ucAddr) //读取 DS1302 某地址的数据 { unsigned char ucData。 DS1302_RST = 0。 DS1302_CLK = 0。 DS1302_RST = 1。 DS1302InputByte(ucAddr|0x01)。 // 地址,命令 ucData = DS1302OutputByte()。 // 读 1Byte 数据 DS1302_CLK = 1。 DS1302_RST = 0。 return(ucData)。 } void DS1302_init() { if(Read1302(0xc1) != 0xf0) { Write1302(0x8e,0x00)。 //允许写操作 Write1302(0xc0,0xf0)。 //写 入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一次。 /******时间初始值 ******/ Write1302(0x8c,0x10)。 //年 Write1302(0x88,0x04)。 //月 Write1302(0x86,0x06)。 //日 Write1302(0x84,0x22)。 //时 Write1302(0x82,0x59)。 //分 Write1302(0x80,0x55)。 //秒 Write1302(0x90,0xa4)。 //充电 Write1302(0x8e,0x80)。 //禁止写操作 } } /*********************************************************** ******************DS18B20 驱动程序 ****************** ************************************************************/ /*************************************************************************************/ void delay_18b20(unsigned int i)//延时函数 { 徐州师范 大学 物理与 电子工程学院课程 设计 报告 15 while(i)。 } /***************************************************************************************/ //18b20 初始化函数 void Init_DS18B20(void) { unsigned char x=0。 DQ = 1。 //DQ 复位 delay_18b20(8)。 //稍做延时 DQ = 0。 //单片机将 DQ 拉低 delay_18b20(80)。 //精确延时 大于 480us DQ = 1。 //拉高总线 delay_18b20(10)。 x=DQ。 //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败 delay_18b20(5)。 } //读一个字节 unsigned char ReadOneChar(void) { unsigned char i=0。 unsigned char dat = 0。 for (i=8。 i0。 i) { DQ = 0。 // 给脉冲信号 dat=1。 DQ = 1。 // 给脉冲信号 if(DQ) dat|=0x80。 delay_18b20(5)。 } return(dat)。 } //写一个字节 void WriteOneChar(unsigned char dat) { unsigned char i=0。 for (i=8。 i0。 i) { DQ = 0。 DQ = datamp。 0x01。 delay_18b20(5)。 徐州师范 大学 物理与 电子工程学院课程 设计 报告 16 DQ = 1。 dat=1。 } delay_18b20(5)。 } //读取温度 unsigned char ReadTemperature(void) { unsigned char a=0。 unsigned char b=0。 unsigned char t=0。 Init_DS18B20()。 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 delay_18b20(200)。 Init_DS18B20()。 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器等 ( 共可读 9 个寄存器 ) 前两个就是温度 a=ReadOneChar()。 b=ReadOneChar()。 b=4。 b+=(aamp。 0xf0)4。 t=b。 return(t)。 } /*************************************************/ void display() { //年 P2=0xf0。 P0=seg[2]。 delay(1)。 P2=0xf1。 P0=seg[0]。 delay(1)。 P2=0xf2。 P0=seg[year/16]。 delay(1)。 P2=0xf3。 P0=seg[year%16]。 徐州师范 大学 物理与 电子工程学院课程 设计 报告 17 delay(1)。 //month P2=0xf4。 P0=seg[month/16]。 delay(1)。 P2=0xf5。 P0=seg[month%16]。 delay(1)。 //date P2=0xf6。 P0=seg[date/16]。 delay(1)。 P2=0xf7。 P0=seg[date%16]。 delay(1)。 // hour P2=0xf8。 P0=seg[hour/16]。 delay(1)。 P2=0xf9。 P0=seg[hour%16]。 delay(1)。 //minute P2=0xfa。 P0=seg[minute/16]。 delay(1)。 P2=0xfb。 P0=seg[minute%16]。 delay(1)。 //second P2=0xfc。 P0=seg[second/16]。 delay(1)。 P2=0xfd。 P0=seg[second%16]。 delay(1)。 //temp P2=0xfe。 P0=seg[temp/10]。 徐州师范 大学 物理与 电子工程学院课程 设计 报告 18 delay(1)。 P2=0xff。 P0=seg[temp%10]。 delay(1)。 //week encode=1。 week_wei=0。 P0=seg[week]。 delay(1)。 encode=0。 week_wei=1。 P0=0。 } void set() { if(mode==0) { delay(5)。 if(mode==0) { position++。 if(。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。