📄 110500618_3.c
字号:
#include <REG51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
sbit DQ = P3^7;
uint temp_value; //温度值
uchar t; //正负号
uint k; //小数点后一位
uchar TempBuffer[9];
void display();
/***********1602液晶显示子程序**************/
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sfr DBPort = 0x90; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
/*********lcd忙测试************/
uchar LCD_Busytext(void)
{
RS=0;
RW=1;
_nop_();
EN=1;
_nop_();
EN=0;
return DBPort;
}
/************向LCD写入命令或数据*************/
void LCD_Write(bit style, uchar input)
{
EN = 0;
RS = style;
RW = 0;
_nop_();
DBPort=input;
_nop_();
EN = 1;
_nop_();
EN = 0;
_nop_();
LCD_Busytext();
}
/****************设置显示模式******************/
void LCD_SetDisplay(uchar DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
/************设置输入模式***********/
void LCD_SetInput(uchar InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
/***************初始化LCD***************/
void LCD_Initial()
{
EN=0;
LCD_Write(LCD_COMMAND,0x38); //显示模式
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
/************液晶字符输入的位置**************/
void GotoXY(uchar x, uchar y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x+0x40));
}
/***********液晶显示*************/
void Print(uchar *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/***********ds18b20子程序*************************/
/***********ds18b20延迟子函数*******/
void delay_18B20(uint i)
{
while(i--);
}
/**********ds18b20初始化******************/
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar(void)
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20温度************/
void ReadTemp(void)
{
uchar a = 0;
uchar b = 0;
Init_DS18B20();
WriteOneChar(0xCC); // 没读序列号
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC); //没读序列号
WriteOneChar(0xBE);
delay_18B20(100);
a = ReadOneChar(); //读取温度值低位
b = ReadOneChar(); //读取温度值高位
temp_value = b;
temp_value<<=8;
temp_value = temp_value|a;
if(temp_value<0x0fff)
t=0; //正
else
{
t=1; //负
temp_value = ~temp_value+1;
}
k = temp_value*0.0625;
temp_value = k*10+0.5;
}
/***********温度数据转换成液晶显示字符**************/
void DispTemp()
{
uchar m=0;
if(t==0) //正
{
TempBuffer[0]='+';
TempBuffer[1]=temp_value/1000+'0'; //百位
TempBuffer[2]=(temp_value%1000)/100+'0'; //十位
TempBuffer[3]=temp_value%100/10+'0'; //个位
TempBuffer[4]='.';
TempBuffer[5]=temp_value%10+'0'; //小数点
}
else //负值
{
TempBuffer[0]='-';
TempBuffer[1]=temp_value/1000+'0'; //百位
TempBuffer[2]=temp_value%1000/100+'0'; //十位
TempBuffer[3]=temp_value%100/10+'0'; //个位
TempBuffer[4]='.';
TempBuffer[5]=temp_value/10%10+'0'; //小数点
}
TempBuffer[6]=0xdf; //温度符号
TempBuffer[7]='C';
TempBuffer[8]='\0';
for(m=0;m<2;m++)
{
if(TempBuffer[m]=='0')
{
TempBuffer[m]=' ';
}
}
}
void Delay1ms(uint count) //毫秒延时
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
/************液晶显示程序***************/
void display()
{
ReadTemp(); //开启温度采集
DispTemp(); //温度数据转换成液晶字符
GotoXY(8,1); //液晶字符显示位置
Print(TempBuffer); //显示温度
GotoXY(0,0);
Print("THE TEMPERATURE ");
GotoXY(0,1);
Print("IS NOW:");
Delay1ms(400); //扫描延时
}
main()
{
LCD_Initial(); //液晶初始化
Init_DS18B20( ) ; //DS18B20初始化
Delay1ms(5);
while(1)
display(); //液晶显示数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -