单片机源程序如下:
Wendu.h (头文件)
#define jump_ROM 0xCC//ds18B20定义
#define start 0x44
#define read_EEROM 0xBE
void delay(unsigned int N);
void delay_1();
unsigned char Reset(void);//复位DS18B20
unsigned char read_bit(void);//从DS18B20读一个位值
void write_bit(unsigned char bitval);//向DS18B20写一位
unsigned char read_byte(void);//从DS18B20读一个字节
void write_byte(unsigned char val);// 向DS18B20写一个字节
Wendu.c (Wendu.h 的实现)
#include
#include"wendu.h"
sbit DQ = P2^3; //DS18B20数据口
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++);
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(unsigned int N)
{
int i;
for(i=0; i
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
unsigned char Reset(void)
{
unsigned char deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(unsigned char bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
unsigned char read_byte(void)
{
unsigned char i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(unsigned char val)
{
unsigned char i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}
主函数的实现
#include
#include"wendu.h"
sbit key1=P1^4; //矩阵键盘定义
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
sbit S1=P3^2; //按键定义
sbit S2=P3^3;
sbit S3=P3^4;
sbit RS=P2^5; //12864定义
sbit RW=P2^6;
sbit E=P2^7;
sbit BEEP = P2^0; //蜂鸣器定义
sbit Hot=P2^1;
unsigned char TMPH,TMPL,key41=1,Temp,T; //温度常量
unsigned int count1,count2,count3; //时间常量
unsigned int countor,m,s; //计时常量
unsigned char button,sound; //其他常量
unsigned char code table[]={"0123456789"};
/******************子程序说明********************/
void delay_1ms(unsigned int i); //1ms延时
void delay(); //延时子程序
void beep(); //响铃程序
void set(char n); //12864写指令子程序
void weizhi(int hang,int lie); //12864字符显示位置
void wdata(unsigned char d); //往12864写数据,单个字符
void wsdata(char tab[]); //往12864写数据,字符串
void scan(); //矩阵键盘第一列扫描,确定所输入的时间
void setTemp(); //温度设定,采用扫描独立键盘来确定输入
void setTime(); //时间设定
void showTime(); //显示时间
void chu12864(); //初始化12864
void chuDS(); //初始化DS18B20
/********************主程序*************************/
void main() //主函数
{
chu12864();//12864的初始化
setTemp();
setTime();
while(1)
{
chuDS();
if(Temp==T)
TR0=1;
showTemp();
showTime();
if(sound==1)
beep();
}
}
/******************************************/
void time0(void) interrupt 1 using 1 //定时中断程序
{
countor++;
if(countor==20)
{
if(m==0&&s==0) //倒计时
{
m=0;
s=0;
sound=1;
Hot=0;
TR0=0;
}
else
if(s==0)
{ m--;s=59;}
else
s--;
countor=0;
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
/************************************************/
void delay_1ms(unsigned int i) //1ms延时
{
unsigned char x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/************************************************/
void delay() //延时子程序
{
int a,b;
for(a=0;a<100;a++)
for(b=0;b<10;b++);
}/************************************************/
void beep() //响铃程序
{
unsigned char i;
for (i=0;i<100;i++)
{
delay_1ms(1);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
/************************************************/
void set(char n) //12864写指令子程序
{
P0=n;
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
/******************************************/
void weizhi(int hang,int lie) //12864字符显示位置
{
char a;
if(hang
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』