本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCDRS=P3^5;
sbit LCDWE=P3^6;
sbit LCDEN=P3^4;
sbit LCDPSB=P3^7;
sbit delu=P2^6; //P0口锁存器
sbit wala=P2^7; //P0 口锁存器
sbit DQ=P3^2; //温度传感器数据
uchar temp=80,temp_L,temp_H;
uchar stying[12]={"当前温度:"};
void LCD_XIANS()
{
stying[10]=temp/10+0x30;
stying[11]=temp%10+0x30;
}
void delay_us(uchar i)//延时函数,计算公式:延时时间T=5+2*i;
{
while(--i);
}
void delay_ms(uint mao)//延时
{
uint a,b;
for(a=0;a<mao;a++)
for(b=0;b<120;b++);
}
void Write_com(uchar com)//液晶写命令
{
LCDRS=0;
LCDWE=0;
LCDEN=0;
P0=com;
delay_ms(5);
LCDEN=1;
delay_ms(5);
LCDEN=0;
}
void Write_data(uchar date)//液晶写数据
{
LCDRS=1;
LCDWE=0;
LCDEN=0;
P0=date;
delay_ms(5);
LCDEN=1;
delay_ms(5);
LCDEN=0;
}
void LCD_INIT() //初始化
{
LCDPSB=1;
delay_ms(5);
Write_com(0x30);
delay_ms(5);
Write_com(0x30);
delay_ms(5);
Write_com(0x0c);
delay_ms(5);
Write_com(0x01);
delay_ms(20);
}
bit Reset_DS18B20(void)//DS18B20复位函数
{
bit DS18B20_exist;
DQ=1;
DQ=0;
delay_us(250); //将DQ拉低480 ~ 960us,产生复位信号
DQ=1;//将总线释放,进入接收状态
delay_us(30);//等待15-60us,DS18b20发出存在信号,将总线拉低60-240us
DS18B20_exist=DQ;
delay_us(200);//存在信号持续60 ~ 240us
if(DS18B20_exist)
return 1;//返回1,DS18B20复位失败,总线上无DS18B20
else
return 0;//返回0,DS18B20复位成功,总线上存在DS18b20
}
void Write_DS18B20(unsigned char value)//写数据--线低后高
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;//将总线拉低,数据送入总线
_nop_();
DQ=value&0x01;
delay_us(20);//DS18b20在之后的15-60us的时间对总线数据采样
DQ=1; //连续写入将须将总线释放至少1us
value=value>>1;
}
}
unsigned char Read_DS18B20(void)//读数据--先低后高
{
unsigned char value,i;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
delay_us(1); //主机将总线拉低7us,!!!!时间不能过长
DQ=1;//之后释放总线,告诉DS18B20“读”数据
_nop_();
_nop_();
value=value>>1;
if(DQ)
value|=0x80;//数据读取
delay_us(20);
}
return value;
}
void Read_temp()
{
Reset_DS18B20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Reset_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xBE);
temp_L=Read_DS18B20();
temp_H=Read_DS18B20();
temp=(temp_H*256+temp_L)/16;
}
void main()
{
uchar i;
delu=0;
wala=0;
delay_ms(10);
LCD_INIT();
LCD_XIANS();
Write_com(0x88);
for(i=0;i<12;i++)
{
Write_data(stying);
}
while(1)
{
Read_temp();
}
}程序下载带12864液晶,一直显示80,温度不变化,不知道是哪里出现问题了,我在这里先谢谢大家! |