unsigned char x=0; DS = 1; //DQ复位
/头文件 ds18b20_delay(8); //稍做延时 #include
dat|=0x80; #define lcd1602_Bus P0 //lcd1602定
ds18b20_delay(4); 义
sbit lcd1602_en=P2^5; } sbit lcd1602_rs=P2^6; return(dat); //***************************************} ************************************* //***************************************
*************************************** sbitDS= P2 ^0; //ds18B20定义
//***************************ds18b20*****void Writechar(unsigned char dat) //写一个字************************************** 节 void ds18b20_delay(unsigned int nus) { { unsigned char i=0; while(nus--); for (i=8; i>0; i--)
{ //延时微秒
} DS = 0; //*************************************** DS = dat&0x01; ************************************* ds18b20_delay(5);
DS = 1; void DS18B20_initial(void) //初始化
ds1820 dat>>=1; { }
附录:
1
}
//******************************************************************************* unsigned int readtemp(void) //读取温度 {
unsigned char a=0; unsigned char b=0; unsigned int t_value=0; float tt_value=0; DS18B20_initial(); Writechar(0xCC); // 跳过读序号列号的操作 Writechar(0x44); // 启动温度转换 DS18B20_initial(); Writechar(0xCC); //跳过读序号列号的操作 Writechar(0xBE); //读取温度寄存器 a=Readchar(); //读低8位 b=Readchar(); //读高8位 t_value=b; t_value<<=8; t_value=t_value|a; tt_value=t_value*0.0625; //读取真实值 t_value= tt_value*10+0.5; //放大10倍输出并四舍五入 return(t_value); }
//**********************************************************************************
//*************************lcd1602**************************************************
void delayms(uint xms) {
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--); }
//**********************************************************************************
void write_lcd1602_com(uchar com) //写地址 {
lcd1602_Bus=com; delayms(5); lcd1602_rs=0; lcd1602_en=1; delayms(5); lcd1602_en=0; }
void write_lcd1602_dat(uchar dat) //写数据 {
lcd1602_Bus=dat; delayms(5); lcd1602_rs=1; lcd1602_en=1; delayms(5); lcd1602_en=0; }
//****************************************************************************************
void lcd1602_initial(void) //液晶初始化 {
//lcd1602_wr=0; lcd1602_en=0;
write_lcd1602_com(0x01);//清屏
write_lcd1602_com(0x06);//指针加减与移动 write_lcd1602_com(0x0c);//光标
write_lcd1602_com(0x38);//液晶初始化命令 write_lcd1602_com(0x01);//清屏 }
//***************************************************************************************
/********************************************************* 名称:lcd_string(uchar row,uchar cloum,uchar *p) 功能:从第row行 ,第cloum列,把一串字符写入lcd
输入:row cloum p
****************************************
2
******************/
void lcd1602_string(uchar row,uchar cloum, uchar *p) {
uchar row_flag;
if(row==1) row_flag=0x80; if(row==2) row_flag=0xc0; row_flag=row_flag+cloum; write_lcd1602_com(row_flag); while(1) {
if(*p=='\\0') break;
write_lcd1602_dat(*p); p++; } }
/*********************************************** 名称:lcd_char(uchar row ,uchar cloum,uchar dat) *功能:在lcd的第row行,第cloum列,写入数据dat
*输入:row cloum dat
*************************************************/
void lcd1602_char(uchar row ,uchar cloum,uchar dat) {
uchar row_flag; if(row==1) {
row_flag=0x80;
write_lcd1602_com(row_flag+cloum); write_lcd1602_dat(dat); }
if(row==2) { row_flag=0xc0;
write_lcd1602_com(row_flag+cloum); write_lcd1602_dat(dat); } }
//********************************************** **********
3
void display(void) {
uchar flagdat;
disdata[0]=t_value/1000+0x30;//百位数 disdata[1]=t_value00/100+0x30;//十位数
disdata[2]=t_value0/10+0x30;//个位数 disdata[3]=t_value+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号 else
flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
disdata[1]=0x20;//如果百位为0,十位为0也不显示 } write_lcd1602_com(0x80); if((mode==1)&&(keep%2==1)) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[5]); write_lcd1602_dat(disdata[4]); }
write_lcd1602_dat('/'); if((mode==2)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[7]); write_lcd1602_dat(disdata[6]); } write_lcd1602_com(0x80+6);
if((mode==3)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[9]); write_lcd1602_dat(disdata[8]); } write_lcd1602_dat(':'); if((mode==4)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[11]); write_lcd1602_dat(disdata[10]); } write_lcd1602_dat(':'); if((mode==5)&&((keep%2==1))) { write_lcd1602_dat(' '); write_lcd1602_dat(' '); } else { write_lcd1602_dat(disdata[13]); write_lcd1602_dat(disdata[12]); }
lcd1602_char(2,0,flagdat);//显示符号位 lcd1602_char(2,1,disdata[0]);//显示百位 lcd1602_char(2,2,disdata[1]);//显示十位 lcd1602_char(2,3,disdata[2]);//显示个位 lcd1602_char(2,4,0x2e);//显示小数点 lcd1602_char(2,5,disdata[3]);//显示小数位 lcd1602_char(2,6,0xdf); lcd1602_char(2,7,'C'); }
//*********************************************************
void IO_initial(void) //引脚初始化 {
P0 = 0XFF; P1 = 0XFF; P2 = 0XFF; P3 = 0XFF; }
//************************************************************
void Time_initial(void) //定时计数器初始化 {
ET0 = 1;
TMOD = 0X01; //0000 0001B TL0 = -50000;
TH0 = (-50000)>>8; TR0 = 1; }
//************************************************************** void tiaozheng(void) //时间加减调整 {
if(timebuf[4]==60) timebuf[4]=0; if(timebuf[4]==-1) timebuf[4]=59; if(timebuf[3]==60) timebuf[3]=0; if(timebuf[3]==-1) timebuf[3]=59; if(timebuf[2]==24) timebuf[2]=0; if(timebuf[2]==-1) timebuf[2]=23; if(timebuf[1]==31) timebuf[1]=1; if(timebuf[1]==0) timebuf[1]=30; if(timebuf[0]==13) timebuf[0]=1; if(timebuf[0]==0) timebuf[0]=12; }
4