//按下K1显示序列码,按下K2显示实时温度(本实验适合初学者调试理解18B20用, ) #include
#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(':') ;