https://static.assets-stash.eet-china.com/album/old-resources/2008/10/28/c5aeb1bc-d05d-423b-84f9-ec26df0a062d.rar
//主函数
/*-----------------------------------------*/
#include<REG52.H>
#include"LCD1602_8.H"
#include"DS18B20_A.H"
/*-----------------------------------------*/
void main(void)
{
lcd_init();
lcd_pos(0,0);
prints("DS18B20-Test:OK");
lcd_pos(0,1);
prints("Meter:");
while(1)
{
Temp_To_String();
lcd_pos(7,1);
prints(TempBuffer);
delay(244,7,29);
}
}
//DS18B20的驱动程序
/*--------------------------------------------*/
//File: DS18B20_A.H
//Date: 2008/10/17
//Time: 16:42
//Note: DS18B20的驱动程序 ★12Bits数据
//Ver : 0.3
/*--------------------------------------------*/
#ifndef __DS18B20_A_H__
#define __DS18B20_A_H__
sbit DQ = P2^3; //数据接口定义
unsigned char TempBuffer[6]; //温度数据字符
bit symbol = 0; //温度数据正负号
/*--------------------------------------------*/
//函数声明
bit Init_DS18B20(void); //DS18B20初始化函数,如果bit=0则初始化成功,bit=1则初始化失败
unsigned char ReadOneChar(void); //DS18B20读出一个字节
void WriteOneChar(unsigned char dat);//DS18B20写入一个字节
unsigned char ReadTemp(void); //读出DS18B20当前的温度
void Temp_To_String(void); //温度数据转化成液晶字符显示//函数返回值为TempBuffer
/*--------------------------------------------*/
//延迟时间函数
void delay(unsigned char x, unsigned char y, unsigned char z)
{
unsigned char tempx,tempy,tempz=z;
do{tempy=y;do{tempx=x;while(--tempx);}while(--tempy);}while(--tempz);
}
/*--------------------------------------------*/
//DS18B20初始化函数
bit Init_DS18B20(void)
{
bit Status="0";
DQ=1; //DS18B20复位
//delay(1,1,1); //17us
DQ=0; //低电平复位
delay(9,1,19); //500us //保持低电平大于480us
DQ=1; //释放总线
delay(2,1,2); //30us //延时15us~60us 准备接收数据
Status=DQ; //如果Status=0则初始化成功,Status=1则初始化失败
delay(10,5,1); //130us //必要延迟时间
return (Status);
}
/*--------------------------------------------*/
//DS18B20读出一个字节
unsigned char ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat="0";
for(i=8;i>0;i--)
{
DQ=0; //读出数据开始//_nop_();
dat>>=1; //由低到高位依次读出
DQ=1; //释放总线
if(DQ)
dat|=0x80; //15us内必须完成读数据
delay(4,5,1); //70us //60us~120us释放总线
}
return (dat);
}
/*--------------------------------------------*/
//DS18B20写入一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i="0";
for(i=8;i>0;i--)
{
DQ=0; //写开始
DQ=dat&0x01; //由低到高依次写入
delay(3,5,1); //60us //写入数据时间间隙为:至少60us连续写2位间的间隙应大于1us
DQ=1; //释放总线
dat>>=1;
}
}
/*--------------------------------------------*/
//读出DS18B20当前的温度
unsigned char ReadTemp(void)
{
unsigned char TempL="0";
unsigned char TempH="0";
unsigned char Temp_Value;
Init_DS18B20(); //先复位,再写ROM,最后写RAM
WriteOneChar(0xcc); //跳过读出序列号的操作
WriteOneChar(0x44); //启动温度转换,默认的【12Bits】转化
delay(217,94,17); //700ms //12Bits转换时间750ms
Init_DS18B20(); //先复位,再写ROM,最后写RAM
WriteOneChar(0xcc); //跳过读出序列号的操作
WriteOneChar(0xbe); //读出温度寄存器
//delay(1,1,1); //17us
TempL=ReadOneChar(); //读出温度值低8位/低四位为小数位
TempH=ReadOneChar(); //读出温度值高8位/高四位和第四位为符号位
if((TempH>>4)==0x0f) //1111=负数 0000=正数
symbol = 1;
else
symbol = 0;
Temp_Value=TempH<<4 | TempL>>4;
return (Temp_Value);
}
/*--------------------------------------------*/
//温度数据转化成液晶字符显示
void Temp_To_String(void)
{
unsigned char Temp_Value;
Temp_Value = ReadTemp();
if(symbol==1)
{
Temp_Value = 256 - Temp_Value;
TempBuffer[0]=Temp_Value/100+'-'; //符号位
}
else
TempBuffer[0]=Temp_Value/100+'0'; //百位
TempBuffer[1]=Temp_Value/10%10+'0'; //十位
TempBuffer[2]=Temp_Value%10+'0'; //个位
TempBuffer[3]=0xdf; //温度符号
TempBuffer[4]='C';
TempBuffer[5]='\0'; //字符串结束标志符
}
/*--------------------------------------------*/
#endif
//LCD1602液晶显示驱动(mini)
/*------------------------------------------------------------------------------*/
//File: LCD1602_8.H
//Date: 08-7-29
//Time: 16:09
//Note: LCD1602 Mini Driver.
/*------------------------------------------------------------------------------*/
#ifndef __LCD1602_8_H__
#define __LCD1602_8_H__
#include<intrins.h>
/*------------------------------------------------------------------------------*/
//LCD接口定义
sfr io = 0x80; //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;
sbit rs = P2^0; //LCD数据/命令选择端(H/L)
sbit rw = P2^1; //LCD读/写选择端(H/L)
sbit ep = P2^2; //LCD使能控制
sbit bz = io^7; //LCD忙标志位
/*------------------------------------------------------------------------------*/
//函数声明
void lcd_busy(void); //测试LCD忙碌状态程序
void lcd_wcmd(unsigned char cmd); //写入指令到LCD程序
void lcd_wdat(unsigned char dat); //写入数据到LCD程序
void lcd_pos (unsigned char x, bit y); //LCD数据指针位置程序
//void printc(unsigned char CHAR); //显示字符
void prints(unsigned char *string); //显示字符串
void lcd_init(void); //LCD初始化设定程序
/*------------------------------------------------------------------------------*/
//测试LCD忙碌状态
void lcd_busy(void)
{
do{
ep = 0;
rs = 0; //指令
rw = 1; //读出
io = 0xff;
ep = 1;
_nop_(); //高电平读出 1us
}while(bz); //bz=1表示忙,bz=0表示空闲
ep = 0;
}
/*------------------------------------------------------------------------------*/
//写入指令到LCD
void lcd_wcmd(unsigned char cmd)
{
lcd_busy(); //检测忙
rs = 0; //指令
rw = 0; //写入
ep = 1;
io = cmd; //指令
ep = 0; //下降沿有效
}
/*------------------------------------------------------------------------------*/
//写入数据函数
void lcd_wdat(unsigned char Data)
{
lcd_busy(); //检测忙
rs = 1; //数据
rw = 0; //写入
ep = 1;
io = Data; //数据
ep = 0; //下降沿有效
}
/*------------------------------------------------------------------------------*/
//LCD数据指针位置程序
void lcd_pos(unsigned char x, bit y)
{
if(y)lcd_wcmd(x|0xc0); //y=1,第二行显示;y=0,第一行显示 0<=x<16
else lcd_wcmd(x|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}
/*------------------------------------------------------------------------------*/
//显示字符
/*
void printc(unsigned char CHAR)
{
lcd_wdat(CHAR);
}
*/
/*------------------------------------------------------------------------------*/
//显示字符串
void prints(unsigned char *string)
{
unsigned char i;
//do{lcd_wdat(string);i++;}while(string!='\0');//生成代码比for循环大
for(i=0;string!='\0';i++)lcd_wdat(string); //有时用for循环也好哈
}
/*------------------------------------------------------------------------------*/
//LCD初始化设定
void lcd_init()
{
lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口
lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"_")
lcd_wcmd(0x01); //清除LCD的显示内容
}
#endif
用户146428 2009-6-9 09:27