/**************************************************************************
程 序 名:DS18B20程序
编 写 者:
指导老师:
时 间 :2013.8.18
班 级 :电气本1101班
功 能 :DS18B20显示温度
使用说明:将单片机的P2口用杜邦线线连于液晶的数据总线(P20--D0...P27--D7),
点阵E连至P37,点阵RW连至P36,点阵RS连至P35,DS18B20接于P3^3
型 号 :AT89S52 使用晶振为12MHz
********************************************************************************/
#include<reg52.h>
#include"lcd12864.h"
#include"delay.h"
#include<intrins.h>
#include"ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp_temp[9]; //DS18B20处理后数据存放数组
/*************** 以下为主函数 *****************/
void main()
{
lcd12864_init();
Delay_ms(1);
lcd12864_display(1,1,"现在室内温度");
lcd12864_display(3,5,"℃");
while(1)
{
get_temperature();
lcd12864_display(3,1,disp_temp);
}
}
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
/********************************************************
*函数名: void Delay_ms(uint xms)
*功能: 延时时间为1ms
*调用函数:无
*输入参数:xms,1ms计数
*输出参数:无
*说明:总共延时时间为1ms乘以xms,crystal=12Mhz
********************************************************/
void Delay_ms(uint xms)
{
uchar i;
while(xms--)
for(i=0;i<120;i++);
}
#ifndef __DS18B20_H__
#define __DS18B20_H__
#define uchar unsigned char
#define uint unsigned int
extern uchar disp_temp[9]; //DS18B20处理后数据存放数组
void delay_us(uint xus);
DS18B20_init(void);
void Write_onebyte(uchar dat);
Read_onebyte(void);
void get_temperature();
#include<reg52.h>
#include"ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3;
uchar temp_data[4];
/********************************************************
*函数名: void delay_us(uint xus)
*功能: 延时时间为6us
*调用函数:无
*输入参数:xms,6us计数
*输出参数:无
*说明:总共延时时间为6us乘以xms,crystal=12Mhz
********************************************************/
void delay_us(uint xus)
{
while(xus--);
}
/********************************************************
*函数名: DS18B20_init(void)
*功能: DS18B20初始化
*调用函数: void delay_us(uint xus);
*输入参数: 无
*输出参数: yes0
********************************************************/
DS18B20_init(void)
{
uchar yes0;
DQ=1; //复位
delay_us(8); //延时
DQ=0; //单片机将DQ拉低
delay_us(90); //精确延时大于480us
DQ=1; //拉高总线
delay_us(8);
yes0=DQ; //如果yse0=0;则初始化成功,否则失败
delay_us(100);
DQ=1;
return(yes0); //返回信号
}
/********************************************************
*函数名: void Write_onebyte(uchar dat)
*功能: 写入数据
*调用函数: void delay_us(uint xus);
*输入参数: uchar dat
*输出参数: 无
********************************************************/
void Write_onebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay_us(4);
DQ=1;
dat>>=1;
}
delay_us(4);
}
/********************************************************
*函数名: Read_onebyte(void)
*功能: 读取数据
*调用函数: void delay_us(uint xus);
*输入参数: 无
*输出参数: dat
********************************************************/
Read_onebyte(void)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_us(4);
}
return(dat);
}
/********************************************************
*函数名: void get_temperature()
*功能: 读取温度值,处理温度数据
*调用函数: Read_onebyte(void);void Write_onebyte(uchar dat);
void delay_us(uint xus);
*输入参数: 无
*输出参数: 无
********************************************************/
void get_temperature()
{
uchar sign=0; //定义符号标志位
uint temp; //定义温度数据暂存
uchar temp_comp; //用来存放测量温度的整数部分
while(DS18B20_init()); //等待18B20初始化
Write_onebyte(0xcc); // 跳过rom
Write_onebyte(0x44); //启动温度检测
delay_us(300); //延时等待转换结束
while(DS18B20_init());
Write_onebyte(0xcc);
Write_onebyte(0xbe);
temp_data[0]=Read_onebyte(); //温度低8位
temp_data[1]=Read_onebyte(); //温度高8位
if(temp_data[1]>127)
{
temp_data[0]=(~temp_data[0])+1;
if((~temp_data[0])>=0xff)
{
temp_data[1]=(~temp_data[1])+1;
}
else
{
temp_data[1]=~temp_data[1];
sign=1;
}
}
temp=(temp_data[0]&0x0f)*625;
temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //取温度整数部分
disp_temp[0]=temp_comp/100+'0';
disp_temp[1]=temp_comp/10%10+'0';
disp_temp[2]=temp_comp%10+'0';
disp_temp[3]='.';
disp_temp[4]=temp/1000+'0';
disp_temp[5]=temp/100%10+'0';
disp_temp[6]=temp/10%10+'0';
disp_temp[7]=temp%10+'0';
disp_temp[8]='\0';
if(disp_temp[0]=='0')
{
disp_temp[0]=0x20;
if(disp_temp[1]=='0')
{
disp_temp[1]=0x20;
}
}
}
/**************************************************************************
头文件名:lcd12864
编 写 者
指导老师:
时 间 :2013.8.8
班 级 :电气本1101班
功 能 :LCD 12864模块化程序设计
********************************************************************************/
#include<reg52.h>
#include"lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
#define lcd_12864 P2
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^7;
/********************************************************
*函数名: void Delay_ms(uint xms)
*功能: 延时时间为1ms
*调用函数:无
*输入参数:xms,1ms计数
*输出参数:无
*说明:总共延时时间为1ms乘以xms,crystal=12Mhz
********************************************************/
void Delay(uint xms)
{
uchar i;
while(xms--)
for(i=0;i<120;i++);
}
/********************************************************
*函数名: void lcd12864_write_command(uchar dictate)
*功能: 将模式设置指令或显示地址写入液晶模块
*调用函数: void Delay_ms(uint xms)
*输入参数: dictate
*输出参数: 无
********************************************************/
void lcd12864_write_command(uchar dictate)
{
Delay(1); //延时1ms,给硬件反应时间
RS=0; //rs设置为低电平接收指令寄存器
RW=0; //rw设置为低电平进行写操作
EN=1; //en拉低电平,lcd12864液晶执行命令
lcd_12864=dictate; //将数据写入12864中,即写入指令或地址
EN=0; //en置高,液晶开始工作
}
/********************************************************
*函数名: void lcd12864_write_data(uchar dt)
*功能: 将数据(字符的标准ASCII码)写入液晶模块
*调用函数: void Delay_ms(uint xms)
*输入参数: dt
*输出参数: 无
********************************************************/
void lcd12864_write_data(uchar dt)
{
Delay(1); //延时1ms,给硬件反应时间
RS=1; //rs置高,为数据寄存器
RW=0; //rw置低,进行写操作
EN=1; //en置高
lcd_12864=dt; //将数据送入P2口,即将数据写入液晶模块
EN=0; //当en由高电平跳变成低电平时,液晶模块开始执行命令
}
/********************************************************
*函数名 : void lcd12864_init()
*功 能 : 对LCD12864的显示模式进行初始化设置
*调用函数: void lcd12864_write_command();void Delay_ms(uint xms)
*输入参数: 无
*输出参数: 无
********************************************************/
void lcd12864_init()
{
Delay(5);
lcd12864_write_command(0x30); //功能设定,设置为基本指令
Delay(5);
lcd12864_write_command(0x0c); //显示开,光标关,反白关
Delay(5);
lcd12864_write_command(0x06); //进入点设定,光标左移。
Delay(5);
lcd12864_write_command(0x01); //清屏指令,清除LCD的显示内容
Delay(5);
}
/********************************************************
函数名: lcd12864_display(uchar y,uchar x, uchar *P)
功能: 液晶字符显示
调用函数: lcd12864_write_data();void lcd12864_write_command();
输入参数: x,y,*p
输出参数: 无
********************************************************/
void lcd12864_display(uchar y,uchar x, uchar *P)
{
switch(y)
{
case 1:lcd12864_write_command(0x7f+x);break; //显示在第一行第X列
case 2:lcd12864_write_command(0x8f+x);break; //显示在第二行第X列
case 3:lcd12864_write_command(0x87+x);break; //显示在第三行第X列
case 4:lcd12864_write_command(0x97+x);break; //显示在第四行第X列
}
while(*P)
{
lcd12864_write_data(*P++);
}
}
|