📄 程序.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*******************************DS18B20模块****************************************/
sbit DQ=P3^7;
/***********ds18b20延迟子函数(晶振12MHz )*******/
void delay_18B20(unsigned int i){
while(i--);
}
/**********ds18b20初始化函数**********************/
void reset() {
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读一个字节**************/
unsigned char rbyte(){
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 wbyte(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 rTempetuare(uchar tmp[]){
uchar a=0,b=0,temp;
reset();
wbyte(0xCC); //跳过读序号列号的操作
wbyte(0x44); //启动温度转?
reset();
wbyte(0xCC); //跳过读序号列号的操作
wbyte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=rbyte(); //读取温度值低位
b=rbyte(); //读取温度值高位
temp=b;
temp&=0xf0;
if(temp){ //负温
if(a==0){
a=~a+1; //bit7向bit8位产生进位
b=~b+1;
}
else{
a=~a+1;
b=~b;
}
tmp[0]='-';
}
else
tmp[0]=' ';
temp=(b<<4)|(a>>4); //组合
//tmp[0]=temp/100 | 0x30; //取百位
tmp[1]=temp%100/10 | 0x30; //取十位
tmp[2]=temp%100%10 | 0x30; //取个位
tmp[3]=0x01; //字符℃
tmp[4]='\0';
}
/************************************LCD1602模块**********************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
void delay_ms(uchar ms){
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
void lcd_wcmd(uchar cmd){ //写指令
rs=0;rw=0;
e=0;
P0=cmd;
e=1;
e=0;
delay_ms(5);
}
void lcd_wdat(uchar dat){ //写数据
rs=1;rw=0;
e=0;
P0=dat;
e=1;
e=0;
delay_ms(5);
}
void lcd_dis(uchar post,uchar *p){
lcd_wcmd(0x80 | post); //设置数据地址指针
while(*p!='\0'){
lcd_wdat(*p++);
}
}
uchar code def_char0[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //字符℃
void lcd_wcgram(uchar adress,uchar tmp[]){
uchar i;
for(i=0;i<8;i++){
lcd_wcmd(adress+i);
lcd_wdat(tmp[i]);
}
}
void lcd_inti(){
delay_ms(15);
lcd_wcmd(0x38); //16X2字符,5X7点阵,8位数据接口
lcd_wcmd(0x38);
lcd_wcmd(0x08); //关闭显示
lcd_wcmd(0x01); //清屏
lcd_wcmd(0x06); //设置光标工作方式
lcd_wcmd(0x0c); //开显示,设置光标显示方式
lcd_wcgram(0x48,def_char0); //载入用户自定义字符
}
/*******************************************************************************************/
void main(){
uchar tmp[5];
lcd_inti();
while(1){
rTempetuare(tmp);
lcd_dis(0x00,tmp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -