历史上的今天
今天是:2025年02月10日(星期一)
2020年02月10日 | DS18B20多点测温源程序+proteus仿真工程
2020-02-10 来源:51hei
多点测温 + 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);
史海拾趣
|
概述: CN3063是可以用太阳能电池供电的单节锂电池充电管理芯片.该器件 内部包括功率晶体管,应用时不需要外部的电流检测电阻和阻流二极管. 内 ...… 查看全部问答> |
|
摩托罗拉的MC9S08AC16的I/O口带负载能力是多少呀? 如题。 刚刚用这个东西,翻了规格书也不知道。 MC9S08AC16的I/O究竟可以驱动多大的电流,希望各位可以给出一个精确的数据。 谢谢啦。… 查看全部问答> |
|
一、概述 对于一般控制,设备间连锁可以通过串行网络完成。因此,BOSCH公司开发了CAN总线(Controller Area Network),并已取得国际标准化组织认证(ISO11898),其总线结构可参照I SO/OSI参考模型。同时,国际上一些大的半导体 ...… 查看全部问答> |
|
Directory(\"\\123\"):-Directory(\"war3 \") 可以在mycomputer目录下创建一个文件夹,请问这个文件夹的属性要怎么设置 ?… 查看全部问答> |
|
编译embedded flash出现了impossible constraint in `asm\'错误,不知道怎么解决,是修改makefile文件么?… 查看全部问答> |
|
本人最近在做T-DMB项目,想问问AAC++方面的! 我现在把SL包解析后获得SL包负载数据是如何组织的?我要对AAC++解码,该如何处理SL包的负载? 有搞过这方面的大侠吗?给点提示,定重谢! 我最想知道到底解析音频SL包后的数据是啥格 ...… 查看全部问答> |




