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

//按下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() //读取温度子程序 {

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4