52单片机DS18B20温度计(1602显示) - 图文

2020-05-19 08:51

//按下K1显示序列码,按下K2显示实时温度(本实验适合初学者调试理解18B20用, ) #include //52单片机 #define uchar unsigned char

#define uint unsigned int //uint 无符号整数

sbit DQ=P2^2; //单总线(与自己的开发板相匹配) uint temp; //温度 uchar flag1; //符号

sbit rs = P1^0; // 控制LCD (与自己的开发板相匹配) sbit rw = P1^1; // 控制LCD (与自己的开发板相匹配) sbit lcden = P2^5; //led使能端 (与自己的开发板相匹配) sbit K1=P3^4; //独立按键k1(与自己的开发板相匹配)

sbit K2=P3^5; //独立按键k2 (与自己的开发板相匹配) sbit du=P2^6; //位选(防LED灯乱闪)(与自己的开发板相匹配) sbit we=P2^7; //段选(防LED灯乱闪) (与自己的开发板相匹配)

uchar a,b,c,d,e,f,g,h,A1,A2,A2t,A3,A4,A5;//写在LCD上的字符,具体在程序中看 void delay(uint count) //延迟程序 (200*count)/8 毫秒 {

uint i;

while(count) {

i=200; while(i>0) i--; count--; } }

void DQreset(void) //初始化,主机将DQ拉高 (上升沿) (从机检测到上升沿后延时15到60毫秒,从机拉低总线60到240毫秒表示“我”在线) { //从机的工作是自动完成的 uint i; DQ=0; i=103; while(i>0)i--; DQ=1; i=4; while(i>0)i--; }

bit tmpreadbit() //从18b20读1位 {

uint i; bit dat; DQ=0;i++; DQ=1;i++;i++; dat=DQ;

i=8;while(i>0)i--;

return (dat); //返回dat }

uchar tmpread() //从18b20读1字节 {

uchar i,j,dat; dat=0;

for(i=1;i<=8;i++) {

j=tmpreadbit();

dat=(j<<7)|(dat>>1); }

return(dat); }

void tmpwritebyte(uchar dat) //18b20写1bit (只能用于写命令) {

uint i; uchar j; bit testb;

for(j=1;j<=8;j++) //一位一位地传 {

testb=dat&0x01; dat=dat>>1; if(testb) {

DQ=0; i++;i++; DQ=1;

i=8;while(i>0)i--; } else {

DQ=0; i=8;while(i>0)i--; DQ=1; i++;i++; } } }

void tmpchange(void) //温度转换子程序 {

DQreset(); delay(1);

tmpwritebyte(0xcc); //CCH跳过ROM tmpwritebyte(0x44); //44H温度转换 }

uint tmp() //读取温度子程序 {

float tt; uchar a,b;

DQreset(); //无论什么命令, 首先都要发起初始化 delay(1);

tmpwritebyte(0xcc); //跳过ROM(本实验中实验板上只连接一块18B20) tmpwritebyte(0xbe); //读便签存储器(温度以二进制储存于BEH) a=tmpread(); //a为低八位 b=tmpread(); //b为高八位 temp=b;

temp<<=8; temp=temp|a;

tt=temp*0.0625; //二进制乘0.0625为十进制 temp=tt*1000; //精度为0.001 return temp; }

void LCD_WriteCom(uchar com)//LCD写入命令 {

rs = 0; rw = 0; P0 = com; delay(5); lcden = 0; delay(5); lcden = 1; delay(5); lcden = 0; } void LCD_WriteData(uchar dat)//LCD写入数据 {

rs = 1; rw = 0; lcden = 0; P0 = dat; delay(5);

lcden = 1; delay(5); lcden = 0; delay(5); }

void LCD_Init() //LCD初始化 {

LCD_WriteCom(0x38); delay(15);

LCD_WriteCom(0x08); delay(3);

LCD_WriteCom(0x01); delay(3);

LCD_WriteCom(0x06); delay(3);

LCD_WriteCom(0x0c); }

void Display18B20Rom(char Rom) //display rom {

uchar h,l;

l = Rom & 0x0f;

h = Rom & 0xf0; h >>= 4;

if( ( h >= 0x00 )&&( h <= 0x09 ) )

LCD_WriteData(h+0x30); else

LCD_WriteData(h+0x37);

if( ( l >= 0x00 )&&( l <= 0x09 ) ) LCD_WriteData(l+0x30); else

LCD_WriteData(l+0x37); }

void temshow() //温度显示 {

//LCD_WriteCom(0x01); 写命令不能放在此位置

DQreset(); //无论什么命令, 首先都要发起初始化 tmpchange(); //温度转换(相当于读温度前的初始化) temp=tmp(); //读温度 A1=temp/10000; A2=(temp000)/1000; A3=((temp000)00)/100;

A4=(((temp000)00)0)/10; A5=(((temp000)00)0); LCD_WriteCom(0x80) ; LCD_WriteData('t') ; LCD_WriteData('e'); LCD_WriteData('m') ; LCD_WriteData('p') ; LCD_WriteData(':') ;


52单片机DS18B20温度计(1602显示) - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《校企合作人才培养模式的实践与研究》课题结题报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: