|
1. main.c
#include <reg52.h> //调用头文件
#include <stdio.h>
#include "18b20.h" //调用初始化函数
#include "1602.h"
#include "delay.h"
bitReadTempFlag; //温度显示
voidInit_Timer0(void);//中断函数
void main (void)
{
int temp;
float temperature;
char displaytemp[16];//
LCD_Init(); //调用初始化函数
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) //无限循环
{
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); //让硬件反应
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 //数据寄存器
#define RW_CLR RW=0 //进行写操作
#define RW_SET RW=1 //进行读操作
#define EN_CLR EN=0 //执行命令
#define EN_SET EN=1 //读取信息
#define DataPort P0 //宏定义显示数据端口P0(1602的7-14脚)
/*------------------------------------------------
LCD1602初始化函数与显示函数
------------------------------------------------*/
void LCD1602_checkbusy() //液晶读忙状态
{
unsignedchar state;
DataPort=0xff; //数据口端口全电平
RS_CLR; //选择1602指令寄存器
RW_SET; //进行写操作
do
{
EN_SET; //读取信息
state=DataPort; //变量state读取数据
EN_CLR; //执行命令
}while(state&0x80); //给硬件反应时间
}
void LCD_Write_Com(unsigned char com) //设置模式或地址
{
LCD1602_checkbusy();//忙则等待
RS_CLR; //选择1602指令寄存器
RW_CLR; //进行写操作
EN_SET; //读取信息
DataPort=com; //数据端口读取com口
_nop_(); //空操作一个周期,给硬件反应时间
EN_CLR; //当EN有高电平跳变成低电平时,液晶模块开始执行命令
}
void LCD_Write_Data(unsigned char Data) //向LCD1602写数据
{
LCD1602_checkbusy();// while(LCD_Check_Busy()); //忙则等待
RS_SET; //数据寄存器
RW_CLR; //进行写操作
EN_SET; //读取信息
DataPort=Data; //数据端口读取Data的数据
_nop_(); //空操作
EN_CLR; //当EN有高电平跳变成低电平时,液晶模块开始执行命令
}
void LCD_Clear(void) //请屏指令
{
LCD_Write_Com(0x01); //将以前的显示内容清处
DelayMs(5);
}
void LCD_Write_String(unsigned char x,unsigned chary,unsigned char *s) //设置实际显示的地址
{
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); //显示模式设置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); //开显示,关光标
LCD_Write_Com(0x01); //清屏
LCD_Write_Com(0x06); //字符进入模式:屏不动,字符后移
DelayMs(5);
LCD_Write_Com(0x0C); //开显示,开光标
}
2.delay.c
#include "delay.h" //调用.h初始化
void DelayUs2x(unsigned char t) //us秒级延时
{
while(--t);
}
void DelayMs(unsigned char t) //s秒级延时
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
|
|