DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51 - 图文 联系客服

发布时间 : 星期六 文章DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51 - 图文更新完毕开始阅读3e9e625049649b6648d74799

//定义变量

uchar numbr[10]=\

//字模

uchar dis4[]=\ \ // 第四行显示 自己添加 uchar t[]=\ . ℃\ //18b20 uint sdata,xiaoshu1,xiaoshu2; //整数、小数1位、小数2位 bit fg=1; //温度正负标志 uchar tempL=0,tempH=0; // 变量 uchar year,month,date,hour,min,sec; // ds3231 uchar a[]=\年22月33日%uchar b[]=\时22分33秒\

///函数

//******************延时子程序 *******************************

//这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时

//************************************************************ void delay(unsigned char i) {

for(i;i>0;i--); }

//*********************************************************** // 延时子程序

//************************************************************ void delay1ms(uchar j) {

while(j!=0) {uchar i;

for(i=124;i>0;i--); //延时124*8+10=1002us j--; } }

/**************************12864部分*************************************/ /**************************12864部分*************************************/ /*写指令数据到LCD RS=L——表示DB0-DB7为显示指令数据 RW=L——表示DB0-DB7数据被write(当E=“H-L”,指令数据被写到IR或DR) E=高脉冲 此时DB0-DB7=指令码 */ void write_cmd(uchar cmd) { LCD_RS=0;

}

LCD_RW=0; LCD_EN=0; P0=cmd; delay1ms(5); LCD_EN=1; delay1ms(5); LCD_EN=0;

/*设定显示位置*/

void lcd_pos(uchar X, uchar Y) { uchar pos; if(X == 0) { X = 0x80; } else if(X == 1) { X = 0x90; } else if(X == 2) { X = 0x88; } else if(X == 3) { X = 0x98; } pos = X + Y; write_cmd(pos);

}

数据 RW=L,E='H-L',DB0-DB7数据被写到IR或DR void write_dat(uchar dat) { LCD_RS=1;

//显示地址

/*写显示数据到LCD*/ /* RS=H ——表示DB0-DB7为显示 RW=L

E=高脉冲

DB0-DB7=显示数据

*/

}

LCD_RW=0; LCD_EN=0; P0=dat;

delay1ms(5); LCD_EN=1; delay1ms(5); LCD_EN=0;

/*LCD初始化*/

void lcd_init() { uint i;

LCD_PSB=1; write_cmd(0x30); delay1ms(5);

write_cmd(0x0c); delay1ms(5);

//并口方式 //基本操作指令 //打开显示,光标关闭

write_cmd(0x01); //清除LCD显示类容 delay1ms(5); lcd_pos(3,0); i=0; while(dis4[i]!='\\0') { delay1ms(1); write_dat(dis4[i]); delay1ms(1); i++; } }

/**********************************18b20************************************************/

/**********************************18b20************************************************/

void Init_DS18B20(void) //初始化 {

uchar x=0;

DQ=1; //DQ先置高 delay(8); //稍延时

DQ=0; //发送复位脉冲

delay(80); //延时(>480us) DQ=1; //拉高数据线

delay(5); //等待(15~60us)

x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 delay(20); }

//**********读一个字节************//

ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号 {

unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

unsigned char dat=0;

for (i=8;i>0;i--) //一个字节有8位 {

DQ=1; delay(1); DQ=0; dat>>=1; DQ=1; if(DQ)

dat|=0x80; delay(4); }

return(dat); }

//*********************** **写一个字节**************************//

void WriteOneChar(unsigned char dat) {

unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 {

DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=dat&0x01; delay(5); DQ=1; dat>>=1; }

delay(4); }