完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
/*********ds18b20.c******/ #include #include"ds18b20.h" #include"12864.h" void Init_Com()//串口初始化 { TMOD=0x20; PCON=0x00; SCON=0x50; TH1=0xfd; TL1=0xfd; TR1=1; } void Init_DS18B20()//ds18b20初始化函数 { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); } ReadOneChar(void)//读一个字节 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); } void WriteOneChar(unsigned char dat)//写一个字节 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(4); } ReadTemperature(void) //测量温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b<<8; tt=t|a;//2个8位寄存器温度合并为1个16位的 t=tt*0.625; //对结果保留小数点后一位 return(t); } void tmpchange(void)//温度转换 { Init_DS18B20(); delay(20); WriteOneChar(0xcc); WriteOneChar(0x44); } void init1()//总的初始化函数 { Init_Com();//串口初始化 init();//lcd12864初始化 } /******12864.c******/ #include #include"12864.h" uchar code dis1[] = {"当前温度"}; uchar code dis2[] = {"设定温度"}; uchar code table[]="0123456789"; bit lcd_busy() //液晶忙操作 { bit result; rs = 0; rw= 1; en= 1; delayNOP(); result = (bit)(P0&0x80); en = 0; return(result); } void lcd_wcom(uchar com ) //写指令 { while(lcd_busy()); rs=0; rw=0; en=0; _nop_(); _nop_(); P0 = com; delayNOP(); en = 1; delayNOP(); en = 0; } void lcd_wdat(uchar dat) //写数据 { while(lcd_busy()); rs= 1; rw= 0; en= 0; P0 = dat; delayNOP(); en= 1; delayNOP(); en= 0; } void init (void) //12864初始化 { delay(50); p***=1; //并口输入 delay(100); lcd_wcom(0x34);//扩充指令操作 delay(5); lcd_wcom (0x30);//基本指令操作 delay(5); lcd_wcom(0x0c);//开显示,关光标 delay(5); lcd_wcom(0x01);//清屏 delay(5); lcd_wcom(0x06); delay(10); } 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 ; lcd_wcom(pos); //显示地址 } void lcd_display() //LCD12864显示程序 (显示固定不变的) { uint i; lcd_pos(0,0); //设置显示位置为第一行的第1个字符 i=0; while(dis1[i] != ' |