资源描述:
《串口发送温度给上位机》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、/*====DS18B20实现温度转换。当MCU接收到上位机发送的01时,将当前温度返回上位机============*/#include#include#defineucharunsignedchar#defineuintunsignedintsbitDS=P2^2;//温度传感器信号线uinttemp,n;uchara,signal,t,time0_1s,b,flag,flag_on;sbitdula=P2^6;sbitwela=P2^7;sbitbeep=P2
2、^3;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数的0~9编码0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数的0~9编码voiddelay(uintcount)//delay{uinti,j;for(i=count;i>0;i--)for(j=110;j>0;j--);}voiddsreset(void)//DS18B20初始化{//
3、1,先将数据线置高电平uinti;//2,延时要求不严格但尽可能短些DS=0;//3,将数据线置低电平i=103;//4,延时(480~960微秒)while(i>0)i--;//5,将数据线置高电平DS=1;//6,延时(15~60微秒)DS18B20返回低电平确定它的存在i=4;//7,CPU读到低电平并延时最少480微秒while(i>0)i--;//8,将数据线置高电平}bittmpreadbit(void)//读一位数据{//1,将数据线拉高uinti;//2,延时2微秒bitdat;//3
4、,将数据线拉低DS=0;i++;//i++起延时作用DS=1;i++;i++;//4,延时6微秒dat=DS;//5,将数据线拉高i=8;while(i>0)i--;//6,延时4微秒return(dat);//7,读一位数据}//8,延时30微秒,重复1~7步读完一个字节uchartmpread(void)//读一个字节{uchari,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)
5、(dat>>1);//读出的数据最低位在最前面,这样刚
6、好一个字节在DAT里}return(dat);}voidtmpwritebyte(uchardat)//writeabytetods18b20{//1,数据线拉低uinti;//2,延时确定的时间15微秒ucharj;//3,按从低位到高位的顺序发送数据(一次只发送一位)bittestb;//4,延时45微秒for(j=1;j<=8;j++)//5,数据线拉高{//6,重复1~5,直到发送完一个字节testb=dat&0x01;//7,数据线拉高dat=dat>>1;if(testb)//write1
7、{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;//write0i=8;while(i>0)i--;DS=1;i++;i++;}}}voidtmpchange(void)//DS18B20beginchange{dsreset();delay(1);tmpwritebyte(0xcc);//忽略ROM地址(一个从机工作时)tmpwritebyte(0x44);//温度转换}uinttmp()//读取寄存器中存储的温度数据{floattt;uchara,b
8、;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);//读内部RAM中9字节的温度数据a=tmpread();//读低8位b=tmpread();//读高8位temp=b;temp<<=8;//两个字节组成一个字节temp=temp
9、a;tt=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625temp=tt*10+0.5;//乘以10表示小数点后只取一位,加0.5是四舍五入returntemp;}voiddispla
10、y(ucharnum,ucharinformation)//显示程序{uchark;dula=1;P0=table[information];dula=0;P0=0xff;wela=1;k=~((0x01)<