多点测温 + 1602显示仿真原理图如下
单片机源程序如下:
#include #include #define uint unsigned int #define uchar unsigned char #define lcddata P0 sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit DQ=P2^3; sbit key=P3^7; uchar temp1[]={"T : "}; uchar temp2[]={"T : "}; /*uchar temp3[9]={"T3: "}; uchar temp4[9]={"T4: "}; uchar temp5[9]={"T5: "}; uchar temp6[9]={"Ta: "};*/ uchar code ds_rom1[]={0x28,0x22,0x22,0x22,0x00,0x00,0x00,0xca};//U2ROM uchar code ds_rom2[]={0x28,0x33,0x33,0x33,0x00,0x00,0x00,0xa0};//U3ROM uchar code ds_rom3[]={0x28,0x44,0x44,0x44,0x00,0x00,0x00,0xAF};//U4ROM uchar code ds_rom4[]={0x28,0x55,0x55,0x55,0x00,0x00,0x00,0xC5};//U5ROM uchar code ds_rom5[]={0x28,0x66,0x66,0x66,0x00,0x00,0x00,0x7B};//U6ROM int temp;//温度 bit temp_flag,value_flag;//正负标志位 int t1,t2,t3,t4,t5,num=1; /*1602LCD函数*/ void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void writelcd(uchar dat,bit x)//写0指令,1数据 { e=0; lcddata=dat; rs=x; rw=0; e=1; delay(1); e=0; } void initlcd() { writelcd(0x38,0); writelcd(0x0c,0); writelcd(0x06,0); writelcd(0x01,0); } /*DS18B20*/ void delayus(uchar x)// 延时1us { while(--x); } bit init_DS18B20()//初始化函数 { bit Status_DS18B20; DQ=1; DQ=0; delayus(250); DQ=1; delayus(20); if(!DQ) Status_DS18B20=0; else Status_DS18B20=1; delayus(250); DQ=1; return Status_DS18B20; } uchar read_DS18B20()//读数据 { uchar i=0,dat=0; for(i=0;i<8;i++) { DQ=1; DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; DQ=1; delayus(25); } return(dat); } void write_DS18B20(uchar dat)//写数据 { uchar i; for(i=0;i<8;i++) { DQ=1; dat>>=1; DQ=0; DQ=CY; delayus(25); DQ=1; } } void Match_rom(uchar a) //匹配ROM { uchar j; write_DS18B20(0x55); //发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) write_DS18B20(ds_rom1[j]); //发送18B20的序列号,先发送低字节 } if(a==2) { for(j=0;j<8;j++) write_DS18B20(ds_rom2[j]); //发送18B20的序列号,先发送低字节 } if(a==3) { for(j=0;j<8;j++) write_DS18B20(ds_rom3[j]); //发送18B20的序列号,先发送低字节 } if(a==4) { for(j=0;j<8;j++) write_DS18B20(ds_rom4[j]); //发送18B20的序列号,先发送低字节 } if(a==5) { for(j=0;j<8;j++) write_DS18B20(ds_rom5[j]); //发送18B20的序列号,先发送低字节 } } void gettemp(uchar z)/*读取温度值并转换*/ { uchar a,b; while(init_DS18B20()); if(z==1) { Match_rom(1); //匹配ROM 1 } if(z==2) { Match_rom(2); //匹配ROM 2 } if(z==3) { Match_rom(3); //匹配ROM 3 } if(z==4) { Match_rom(4); //匹配ROM 4 } if(z==5) { Match_rom(5); //匹配ROM 5 } write_DS18B20(0x44);//*启动温度转换*/ while(init_DS18B20()); if(z==1) { Match_rom(1); //匹配ROM 1 } if(z==2) { Match_rom(2); //匹配ROM 2 } if(z==3) { Match_rom(3); //匹配ROM 3 } if(z==4) { Match_rom(4); //匹配ROM 4 } if(z==5) { Match_rom(5); //匹配ROM 5 } write_DS18B20(0xbe);//*读取温度*/ a=read_DS18B20(); b=read_DS18B20(); temp=b; temp<<=8; temp=temp|a; if(b>=8) { temp=~temp+1; temp_flag=1; } else { temp_flag=0; } if(temp_flag==1) temp=temp*0.625*-1; if(temp_flag==0) temp=temp*0.625; if(z==1) t1=temp; if(z==2) t2=temp; if(z==3) t3=temp; if(z==4) t4=temp; if(z==5) t5=temp; } void display(uchar i)//显示函数 { char y,value; temp=abs(temp);
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC1159CG-5 的参考设计
- EVALSTPM3X-3PH,多相电能计量演示板,带有基于 STPM33、STPM34 和 STM8S903 的电流互感器
- 21W、3.3V、5V、7.5V、12V、22V、30V交流转直流多路输出电源
- 不HIFI的桌面D类小功放
- LT1172IN8、5V/1.25A 正电流升压降压转换器的典型应用
- LT6108-2 演示板、具有基准和比较器的高侧电流检测放大器
- OM7895: BGU8020 GNSS LNA评估板
- LT3467AES6 ±15V 双路输出升压转换器的典型应用,具有输出断开连接
- MIC2571,便携式 12V DC 至 DC 单输出电源的演示板
- nrf905射频发送电路图和C程序源代码(基于单片机)