|
1. main.c
#include <reg52.h> //調(diào)用頭文件
#include <stdio.h>
#include "18b20.h" //調(diào)用初始化函數(shù)
#include "1602.h"
#include "delay.h"
bitReadTempFlag; //溫度顯示
voidInit_Timer0(void);//中斷函數(shù)
void main (void)
{
int temp;
float temperature;
char displaytemp[16];//
LCD_Init(); //調(diào)用初始化函數(shù)
DelayMs(20); //延時20ms
LCD_Clear(); //清屏操作
Init_Timer0();
LCD_Write_String(0,0," wwwH2LWHcom ");
LCD_Write_Char(13,1,0x01);//顯示temp
LCD_Write_Char(14,1,'C'); //顯示C
while (1) //無限循環(huán)
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();
temperature=(float)temp*0.0625;
sprintf(displaytemp,"Temp %7.3f",temperature);//輸出溫度顯示值
LCD_Write_String(0,1,displaytemp);//把溫度寫入LCD
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //
EA=1; //接受中斷
ET0=1; //
TR0=1; //
}
void Timer0_isr(void) interrupt 1
{
static unsignedint num;
TH0=(65536-2000)/256; //重新賦值 2ms
TL0=(65536-2000)%256;
num++;
if(num==300) //
{
num=0;
ReadTempFlag=1; //
}
}
2.18b20.c
#include"delay.h"
#include "18b20.h"
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //釋放總線,等待18b20的存在脈沖
DelayUs2x(5); //讓硬件反應(yīng)
DQ = 0; //RESET 拉低18b20單總線
DelayUs2x(200); //拉低400us
DelayUs2x(200);
DQ = 1;
DelayUs2x(50); //等待50us
dat=DQ;
DelayUs2x(25);
return dat;
}
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0;i--)
{
DQ = 0;
DQ =dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); //
WriteOneChar(0x44); //
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE); //
a=ReadOneChar(); //
b=ReadOneChar(); //
b<<=8;
t=a+b;
return(t);
}
1.1602.c
#include"1602.h"
#include "delay.h"
sbit RS = P1^0; //定義1602寄存器選擇端口為P2.4
sbit RW = P1^1; //定義讀寫信號端口
sbit EN = P1^2; //定義使能端口
#define RS_CLR RS=0 //宏定義選擇1602指令寄存器
#define RS_SET RS=1 //數(shù)據(jù)寄存器
#define RW_CLR RW=0 //進(jìn)行寫操作
#define RW_SET RW=1 //進(jìn)行讀操作
#define EN_CLR EN=0 //執(zhí)行命令
#define EN_SET EN=1 //讀取信息
#define DataPort P0 //宏定義顯示數(shù)據(jù)端口P0(1602的7-14腳)
/*------------------------------------------------
LCD1602初始化函數(shù)與顯示函數(shù)
------------------------------------------------*/
void LCD1602_checkbusy() //液晶讀忙狀態(tài)
{
unsignedchar state;
DataPort=0xff; //數(shù)據(jù)口端口全電平
RS_CLR; //選擇1602指令寄存器
RW_SET; //進(jìn)行寫操作
do
{
EN_SET; //讀取信息
state=DataPort; //變量state讀取數(shù)據(jù)
EN_CLR; //執(zhí)行命令
}while(state&0x80); //給硬件反應(yīng)時間
}
void LCD_Write_Com(unsigned char com) //設(shè)置模式或地址
{
LCD1602_checkbusy();//忙則等待
RS_CLR; //選擇1602指令寄存器
RW_CLR; //進(jìn)行寫操作
EN_SET; //讀取信息
DataPort=com; //數(shù)據(jù)端口讀取com口
_nop_(); //空操作一個周期,給硬件反應(yīng)時間
EN_CLR; //當(dāng)EN有高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
}
void LCD_Write_Data(unsigned char Data) //向LCD1602寫數(shù)據(jù)
{
LCD1602_checkbusy();// while(LCD_Check_Busy()); //忙則等待
RS_SET; //數(shù)據(jù)寄存器
RW_CLR; //進(jìn)行寫操作
EN_SET; //讀取信息
DataPort=Data; //數(shù)據(jù)端口讀取Data的數(shù)據(jù)
_nop_(); //空操作
EN_CLR; //當(dāng)EN有高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
}
void LCD_Clear(void) //請屏指令
{
LCD_Write_Com(0x01); //將以前的顯示內(nèi)容清處
DelayMs(5);
}
void LCD_Write_String(unsigned char x,unsigned chary,unsigned char *s) //設(shè)置實(shí)際顯示的地址
{
if (y == 0)
{ LCD_Write_Com(0x80 + x); //顯示第一行}
else
{ LCD_Write_Com(0xC0+ x); //顯示第二行}
while (*s)
{
LCD_Write_Data(*s);
s ++;
}
}
void LCD_Write_Char(unsigned char x,unsigned chary,unsigned char Data)
{
if (y == 0)
{ LCD_Write_Com(0x80+ x); }
else
{ LCD_Write_Com(0xC0+ x); }
LCD_Write_Data(Data);
}
void LCD_Init(void) //初始化操作
{
LCD_Write_Com(0x38); //顯示模式設(shè)置16*2,5*7,8位
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); //開顯示,關(guān)光標(biāo)
LCD_Write_Com(0x01); //清屏
LCD_Write_Com(0x06); //字符進(jìn)入模式:屏不動,字符后移
DelayMs(5);
LCD_Write_Com(0x0C); //開顯示,開光標(biāo)
}
2.delay.c
#include "delay.h" //調(diào)用.h初始化
void DelayUs2x(unsigned char t) //us秒級延時
{
while(--t);
}
void DelayMs(unsigned char t) //s秒級延時
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
|
-
-
溫度監(jiān)測仿真.zip
2020-5-13 11:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
131.68 KB, 下載次數(shù): 31, 下載積分: 黑幣 -5
|