/**************************************************************************
程 序 名:DS18B20程序
編 寫 者:
指導(dǎo)老師:
時(shí) 間 :2013.8.18
班 級(jí) :電氣本1101班
功 能 :DS18B20顯示溫度
使用說明:將單片機(jī)的P2口用杜邦線線連于液晶的數(shù)據(jù)總線(P20--D0...P27--D7),
點(diǎn)陣E連至P37,點(diǎn)陣RW連至P36,點(diǎn)陣RS連至P35,DS18B20接于P3^3
型 號(hào) :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處理后數(shù)據(jù)存放數(shù)組
/*************** 以下為主函數(shù) *****************/
void main()
{
lcd12864_init();
Delay_ms(1);
lcd12864_display(1,1,"現(xiàn)在室內(nèi)溫度");
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
/********************************************************
*函數(shù)名: void Delay_ms(uint xms)
*功能: 延時(shí)時(shí)間為1ms
*調(diào)用函數(shù):無
*輸入?yún)?shù):xms,1ms計(jì)數(shù)
*輸出參數(shù):無
*說明:總共延時(shí)時(shí)間為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處理后數(shù)據(jù)存放數(shù)組
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];
/********************************************************
*函數(shù)名: void delay_us(uint xus)
*功能: 延時(shí)時(shí)間為6us
*調(diào)用函數(shù):無
*輸入?yún)?shù):xms,6us計(jì)數(shù)
*輸出參數(shù):無
*說明:總共延時(shí)時(shí)間為6us乘以xms,crystal=12Mhz
********************************************************/
void delay_us(uint xus)
{
while(xus--);
}
/********************************************************
*函數(shù)名: DS18B20_init(void)
*功能: DS18B20初始化
*調(diào)用函數(shù): void delay_us(uint xus);
*輸入?yún)?shù): 無
*輸出參數(shù): yes0
********************************************************/
DS18B20_init(void)
{
uchar yes0;
DQ=1; //復(fù)位
delay_us(8); //延時(shí)
DQ=0; //單片機(jī)將DQ拉低
delay_us(90); //精確延時(shí)大于480us
DQ=1; //拉高總線
delay_us(8);
yes0=DQ; //如果yse0=0;則初始化成功,否則失敗
delay_us(100);
DQ=1;
return(yes0); //返回信號(hào)
}
/********************************************************
*函數(shù)名: void Write_onebyte(uchar dat)
*功能: 寫入數(shù)據(jù)
*調(diào)用函數(shù): void delay_us(uint xus);
*輸入?yún)?shù): uchar dat
*輸出參數(shù): 無
********************************************************/
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);
}
/********************************************************
*函數(shù)名: Read_onebyte(void)
*功能: 讀取數(shù)據(jù)
*調(diào)用函數(shù): void delay_us(uint xus);
*輸入?yún)?shù): 無
*輸出參數(shù): 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);
}
/********************************************************
*函數(shù)名: void get_temperature()
*功能: 讀取溫度值,處理溫度數(shù)據(jù)
*調(diào)用函數(shù): Read_onebyte(void);void Write_onebyte(uchar dat);
void delay_us(uint xus);
*輸入?yún)?shù): 無
*輸出參數(shù): 無
********************************************************/
void get_temperature()
{
uchar sign=0; //定義符號(hào)標(biāo)志位
uint temp; //定義溫度數(shù)據(jù)暫存
uchar temp_comp; //用來存放測(cè)量溫度的整數(shù)部分
while(DS18B20_init()); //等待18B20初始化
Write_onebyte(0xcc); // 跳過rom
Write_onebyte(0x44); //啟動(dòng)溫度檢測(cè)
delay_us(300); //延時(shí)等待轉(zhuǎn)換結(jié)束
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); //取溫度整數(shù)部分
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
編 寫 者
指導(dǎo)老師:
時(shí) 間 :2013.8.8
班 級(jí) :電氣本1101班
功 能 :LCD 12864模塊化程序設(shè)計(jì)
********************************************************************************/
#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;
/********************************************************
*函數(shù)名: void Delay_ms(uint xms)
*功能: 延時(shí)時(shí)間為1ms
*調(diào)用函數(shù):無
*輸入?yún)?shù):xms,1ms計(jì)數(shù)
*輸出參數(shù):無
*說明:總共延時(shí)時(shí)間為1ms乘以xms,crystal=12Mhz
********************************************************/
void Delay(uint xms)
{
uchar i;
while(xms--)
for(i=0;i<120;i++);
}
/********************************************************
*函數(shù)名: void lcd12864_write_command(uchar dictate)
*功能: 將模式設(shè)置指令或顯示地址寫入液晶模塊
*調(diào)用函數(shù): void Delay_ms(uint xms)
*輸入?yún)?shù): dictate
*輸出參數(shù): 無
********************************************************/
void lcd12864_write_command(uchar dictate)
{
Delay(1); //延時(shí)1ms,給硬件反應(yīng)時(shí)間
RS=0; //rs設(shè)置為低電平接收指令寄存器
RW=0; //rw設(shè)置為低電平進(jìn)行寫操作
EN=1; //en拉低電平,lcd12864液晶執(zhí)行命令
lcd_12864=dictate; //將數(shù)據(jù)寫入12864中,即寫入指令或地址
EN=0; //en置高,液晶開始工作
}
/********************************************************
*函數(shù)名: void lcd12864_write_data(uchar dt)
*功能: 將數(shù)據(jù)(字符的標(biāo)準(zhǔn)ASCII碼)寫入液晶模塊
*調(diào)用函數(shù): void Delay_ms(uint xms)
*輸入?yún)?shù): dt
*輸出參數(shù): 無
********************************************************/
void lcd12864_write_data(uchar dt)
{
Delay(1); //延時(shí)1ms,給硬件反應(yīng)時(shí)間
RS=1; //rs置高,為數(shù)據(jù)寄存器
RW=0; //rw置低,進(jìn)行寫操作
EN=1; //en置高
lcd_12864=dt; //將數(shù)據(jù)送入P2口,即將數(shù)據(jù)寫入液晶模塊
EN=0; //當(dāng)en由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令
}
/********************************************************
*函數(shù)名 : void lcd12864_init()
*功 能 : 對(duì)LCD12864的顯示模式進(jìn)行初始化設(shè)置
*調(diào)用函數(shù): void lcd12864_write_command();void Delay_ms(uint xms)
*輸入?yún)?shù): 無
*輸出參數(shù): 無
********************************************************/
void lcd12864_init()
{
Delay(5);
lcd12864_write_command(0x30); //功能設(shè)定,設(shè)置為基本指令
Delay(5);
lcd12864_write_command(0x0c); //顯示開,光標(biāo)關(guān),反白關(guān)
Delay(5);
lcd12864_write_command(0x06); //進(jìn)入點(diǎn)設(shè)定,光標(biāo)左移。
Delay(5);
lcd12864_write_command(0x01); //清屏指令,清除LCD的顯示內(nèi)容
Delay(5);
}
/********************************************************
函數(shù)名: lcd12864_display(uchar y,uchar x, uchar *P)
功能: 液晶字符顯示
調(diào)用函數(shù): lcd12864_write_data();void lcd12864_write_command();
輸入?yún)?shù): x,y,*p
輸出參數(shù): 無
********************************************************/
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++);
}
}
|