#include <AT89X51.H>
#include<stdio.h>
#include "ds18b20.h"
#define u8 unsigned char
#define u16 unsigned int
#define ds18b20 unsigned char
#define line01 0x80
#define line02 0xc0
#define DATA_BUS P0
sbit DQ=P3^4; // ds18b20与单片机连接口
sbit EN=P1^2; // lcd1602控制
sbit RS=P1^0; // lcd1602与单片机控制接口
sbit RW=P1^1; // lcd1602控制
sbit fengming=P1^6; //蜂鸣器控制端
sbit MOTOR1=P3^3; // 电机1控制端
sbit Set_Clock=P1^3; // 调定时控制
sbit Key_up=P1^4; // +1操作键
sbit Key_dn=P1^5; // -1操作键
u8 code str1[]={"wendu"};
u8 code str2[]={"shidu"};
u8 disdata[5];
u16 Temperature; // 检测到的温度(扩大了10倍)
u16 Temperature_H=100; // 预设的高温控制温度(扩大了10倍)
u16 Temperature_L=000;
/*************************lcd1602程序**************************/
void delay1ms(u16 ms) // 非精确延时1毫秒
{
u8 i,j;
for(;ms>0;ms--)
for(i=2;i>0;i--)
for(j=250;j>0;j--);
}
void wr_com(u8 com) // LCD1602写指令//
{
delay1ms(1);
EN=0;
RS=0;
RW=0;
DATA_BUS=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(u8 dat) // LCD1602写数据//
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
DATA_BUS=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init() // 初始化设置 //
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void Display_String(u8 *p) // 写字符串函数
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(10);
}
}
void Init_Display_String() //初始化显示
{
lcd_init();
wr_com(0x80);
Display_String("Wlcome to !");
wr_com(0xc0);
Display_String(" 2015-06-06 ");
}
/******************************ds1820程序***************************************/
void delay_1820(u8 i) // 延时i微秒
{
for(;i>0;i--);
}
ds1820 rst() //*ds1820复位*/ (就是这一行出错)
****************************************************************
(这是后面的程序)
{
u8 x=0;
DQ = 1; // DQ复位
delay_18B20(4); // 延时
DQ = 0; // DQ拉低
delay_18B20(100); // 精确延时大于480us
DQ = 1; // 拉高
delay_18B20(40);
}
u8 ds1820rd() //*读数据*/
{
u8 i=0;
u8 dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(u8 wdata) //*写数据*/
{
u8 i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
void Read_Temperature() //*读取温度值并转换*/
{
u8 a,b;
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
a=ds1820rd();
b=ds1820rd();
Temperature=a+b*256;
if(Temperature<=0x0fff)Temperature_flag=0;
else
{
Temperature=~Temperature+1;
Temperature_flag=1;
}
Temperature=Temperature*(0.625);//温度值扩大10倍,以精确到1位小数
}
/*******************************************************************/
void Display_Temperature()//温度值显示
{
disdata[0]=Temperature/1000+0x30; //百位数
disdata[1]=Temperature/100%10+0x30; //十位数
disdata[2]=Temperature/10%10+0x30; //个位数
disdata[3]=Temperature%10+0x30; //小数位
wr_com(0x80);
Display_String(str1);;
if(Temperature_flag==1)wr_dat(0x2d); //显示符号位
if(disdata[0]!=0x30)wr_dat(disdata[0]); //显示百位
wr_dat(disdata[1]); //显示十位
wr_dat(disdata[2]); //显示个位
wr_dat(0x2e); //显示小数点
wr_dat(disdata[3]); //显示小数位
wr_dat('C');
|