LCD1602.c
#include
/********************延时函数,延时一毫秒************************/
void LCD1602_Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
/**************************1602显示****************************/
void LCD1602_Write_Cmd(char cmd) //写指令函数
{
LCD1602_RS=0;//低电位送指令
P0=cmd;
LCD1602_Delay(1);
LCD1602_EN=1;
LCD1602_Delay(1);
LCD1602_EN=0;
}
void LCD1602_Write_data(uchar dat) //写数据函数
{
LCD1602_RS=1;//高电位送数据
P0=dat ;
LCD1602_Delay(1);
LCD1602_EN=1;
LCD1602_Delay(1);
LCD1602_EN=0;
}
void LCD1602_Write_str(uchar *str)//写字符串函数
{
while(*str!='\0')
{
LCD1602_Write_data(*str++);
LCD1602_Delay(60);
}
}
/*
函数名称:1602液晶显示屏显示函数
函数功能:指定位置显示字符串
函数参数:
x:显示行数(1或2)。1:表示第一行,2表示第二行
y:表示显示的起始位置(0-15)。
str:将要显示的字符串
*/
void LCD1602_Display(uchar x,uchar y, uchar *str)
{
if(x==1) x=0x80;
if(x==2) x=0x80+0x40;
x=x+y;
LCD1602_Write_Cmd(x);
LCD1602_Write_str(str);
}
/***************************1602液晶初始化******************************/
void LCD1602_Init()
{
LCD1602_RW=0;//先将RW拉低
LCD1602_EN=0;//再把EN拉低
LCD1602_Write_Cmd(0x38);//显示模式设置
LCD1602_Write_Cmd(0x0c);//开启显示屏,关光标,光标不闪烁
LCD1602_Write_Cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
LCD1602_Write_Cmd(0x01);//清除屏幕
LCD1602_Write_Cmd(0x80);//数据指针 把光标移到第一行第一个位置
}
LCD1602.h
#include
#define uchar unsigned char
#define uint unsigned int
/**************************I/O端口设置************************** */
sbit LCD1602_RS=P1^0; //LCD液晶显示器数据/命令选择端口
sbit LCD1602_RW=P1^1; //LCD液晶显示器读/写选择端口
sbit LCD1602_EN=P1^2; //LCD液晶显示器使能端口
void LCD1602_Delay(uint z);
void LCD1602_Write_Cmd(char cmd);
void LCD1602_Write_data(uchar dat);
void LCD1602_Write_str(uchar *str);
void LCD1602_Init();
void LCD1602_Display(uchar x,uchar y, uchar *str);
DS18B20.c
#include
unsigned int temp;
void delay(unsigned int m) //温度延时程序
{
while(m--);
}
void Init_DS18B20()
{
unsigned char x=0;
DS18B20_DQ = 1; //DQ复位 ds18b20通信端口
delay(8); //稍做延时
DS18B20_DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DS18B20_DQ = 1; //拉高总线
delay(4);
x=DS18B20_DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DS18B20_DQ = 0; // 高电平拉成低电平时读周期开始
dat>>=1;
DS18B20_DQ = 1; // 给脉冲信号
if(DS18B20_DQ)
dat|=0x80; //
delay(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DS18B20_DQ = 0; //从高电平拉至低电平时,写周期的开始
DS18B20_DQ = dat&0x01; //数据的最低位先写入
delay(5); //60us到120us延时
DS18B20_DQ = 1;
dat>>=1; //从最低位到最高位传入
}
}
/**************读取ds18b20当前温度************/
void ReadTemperature()
{
unsigned char tempL=0;
unsigned tempH=0;
unsigned t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(5); // this message is very important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度/
delay(5);
tempL=ReadOneChar(); //读取温度值低位 /
tempH=ReadOneChar(); //读取温度值高位 /
temp = (tempH*256+tempL)*0.625;
}
DS18B20.h
#include
#define uchar unsigned char
//端口配置
sbit DS18B20_DQ=P3^2; //温度数据口
//函数申明
void delay(unsigned int m); //温度延时程序
void Init_DS18B20();
uchar ReadOneChar();
void WriteOneChar(unsigned char dat);
void ReadTemperature();
主程序
#include
#include
sbit LED0 = P1^7;
uchar display[]={"0123456789"}; //定义数组,并赋初值
extern unsigned int temp; //外部调用温度变量
void _Delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
LCD1602_Init();
LCD1602_Display(1,5,"TX");
while(1)
{
_Delay_ms(600);
LED0=~LED0;
ReadTemperature();
LCD1602_Display(2,0,"Now Temp:");
LCD1602_Write_Cmd(0x80+0x40+10);
LCD1602_Write_data(display[temp/100]);
LCD1602_Write_data(display[temp%100/10]);
LCD1602_Display(2,12,".");
LCD1602_Write_data(display[temp%10]);
LCD1602_Display(2,15,"C");
}
}