DS18B20与数码管温度显示C程序
一片DS18B20构成测温系统C程序
一片DS18B20构成测温系统C程序2008-10-2 14:20:00点击:41用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。
#i nclude <AT89X52.H>#i nclude <INTRINS.h>unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsigned char displaycount;unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};unsigned char timecount;unsigned char readdata[8];sbit DQ=P3^7;bit sflag;bit resetpulse(void){unsigned char i;DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i--);return(DQ);for(i=200;i>0;i--);}void writecommandtods18b20(unsigned char command) {unsigned char i;unsigned char j;for(i=0;i<8;i++){if((command & 0x01)==0)DQ=0;for(j=35;j>0;j--);DQ=1;}else{DQ=0;for(j=2;j>0;j--);DQ=1;for(j=33;j>0;j--);}command=_cror_(command,1); }}unsigned char readdatafromds18b20(void) {unsigned char i;unsigned char j;unsigned char temp;for(i=0;i<8;i++){temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j--);if(DQ==1){temp=temp | 0x80; }else{temp=temp | 0x00; }for(j=200;j>0;j--);}return(temp);}void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);TR0=1;while(1){;}}void t0(void) interrupt 1 using 0 {unsigned char x;unsigned int result;TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount==2){P0=displaycode[displaybuf[displaycount]] | 0x80; }else{P0=displaycode[displaybuf[displaycount]];}P2=displaybit[displaycount];displaycount++;if(displaycount==8){displaycount=0;}timecount++;if(timecount==150){timecount=0;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata[0]=readdatafromds18b20(); readdata[1]=readdatafromds18b20(); for(x=0;x<8;x++){displaybuf[x]=16;}sflag=0;if((readdata[1] & 0xf8)!=0x00){sflag=1;readdata[1]=~readdata[1];readdata[0]=~readdata[0];result=readdata[0]+1;readdata[0]=result;if(result>255){readdata[1]++;}}readdata[1]=readdata[1]<<4;readdata[1]=readdata[1] & 0x70; x=readdata[0];x=x>>4;x=x & 0x0f;readdata[1]=readdata[1] | x;x=2;result=readdata[1];。
18B20温度C语言程序
#include "reg52.h"# include<absacc.h>#include <intrins.h>#define delay_3us _nop_();_nop_();_nop_() //延时3us宏定义sbit DQ=P1^2; //ds18b20的数据端口sbit DE=P3^3; //灯L2sbit DF=P2^2; //K0sbit DM=P2^3; //K1sbit DN=P3^5; //灯L3# define PORTA XBYTE[0X7CFF]# define PORTB XBYTE[0X7DFF]# define PORTC XBYTE[0X7EFF]# define CONTROL XBYTE[0X7FFF]# define uchar unsigned char# define uint unsigned intsbit K0=P2^2;sbit K1=P2^3;sbit K2=P2^4;sbit K3=P2^5;uchar count=0;uchar idata temp[6]; //保存转换后的温度值uchar id[2][8];uchar code table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x080,0x00};//0-9,'.'消影uchar idata tm;bit flag=0;bit init_ds18b20(void){uchar j;DQ=1; //总线初始状态DQ=0; //启动总线j=250;while(--j); //延时500us ,初始化信号DQ=1; //释放总线,之后检测存在信号j=40;while(--j); //延时80usj=110; //检测低电平(存在信号),如220us 时间里检测不到则初始化失败返回0while(DQ!=0) //初始化失败{j--; //调整检测时间if(!j) //检测时间到return 0; //失败返回0}j=250; //延时500us,满足初始化时序while(--j);return 1; //返回1}bit rdbit_ds18b20(void){uchar j; //定义延时变量bit b; //返回变量暂存DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //释放总线delay_3us;delay_3us;delay_3us;if(DQ) //延时9US后采样b=1;elseb=0;j=30;while(--j); //延时满足时序return b; //返回采样值}uchar rdbyte_ds18b20(void){uchar i,dat;for(dat=0,i=0;i<8;i++){dat>>=1; //右移一位if(rdbit_ds18b20()) //如果读取的为1dat|=0x80; //则置位最高位}return dat; //返回接收数据}void wtbyte_ds18b20(uchar wdat){uchar i,j;for (i=0;i<8;i++){if(wdat&0x01) //如果最低位为1{ //则输出1DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //写1j=30;while(--j); //等待60us满足写时序}else //如果最低位为0{DQ=1;_nop_();DQ=0; //启动总线j=35;while(--j); //保持70us低电平,写0 满足时序要求DQ=1; //释放总线}wdat>>=1; //wdat右移一位,等待接收下一位}}void convter_t(uchar uct_l,uchar uct_h){uchar tm_dot; //存放小数部分tm_dot=(uct_l>>2)&0x03; //四位二进制小数部分只保留高两位uct_h=(uct_h<<4)&0xf0; //将高位数据左移到最高四位tm=uct_h|((uct_l>>4)&0x0f);//底四位右移到低四位,同高四位合并成一个字节temp[0]=tm/100; //tm除100取整数部分;得百位数据temp[1]=(tm-temp[0]*100)/10; //tm取十位一下数据除10取整数部分;得十位数据temp[2]=tm%10; //tm对10取余的个位数据temp[3]=10; //小数点位赋值10。
DS18B20温度采集和显示程序
这个是我自己制作的51单片机板上的DS18B20温度采集和显示程序,你如果有现成的51板稍微修改一下可以用,在我这里是可以用没问题的。
环境是KEIL。
我这个51板也完全符合你的要求。
#pragma db code#include<AT89X52.H>//#include "reg52.h"#include "INTRINS.H"// 此实验是使用18B20检测温度,然后在数码管上显示#define uchar unsigned char#define uint unsigned int#define BUSY1 (DQ1==0)sbit LED_0=P1^0;sbit LED_1=P1^1;sbit LED_2=P1^2;sbit LED_3=P1^3;sbit DQ1=P1^6;//void delay(uint x);void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);void ds_reset_1(void);void wr_ds18_1(char dat);void time_delay(unsigned char time);int get_temp_1(void);void delay(unsigned int x);void read_ROM(void);int get_temp_d(void);/*=====0-9=====A-G=====*/uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82}; unsigned char ResultSignal;int ResultTemperatureLH,ResultT emperatureLL,ResultTemperatureH; unsigned char ROM[8];unsigned char idata TMP;unsigned char idata TMP_d;unsigned char f;unsigned char rd_ds18_1();unsigned int TemH,TemL;void main(){unsigned int TemH,TemL,k=0;ds_reset_1();ds_reset_1(); //resetwr_ds18_1(0xcc); //skip rom_nop_();wr_ds18_1(0x7f);ds_reset_1();wr_ds18_1(0xcc);_nop_();wr_ds18_1(0x44);for(k=0;k<11000;k++)time_delay(255);ds_reset_1();while(1){wr_ds18_1(0xcc);wr_ds18_1(0xbe);TemH=get_temp_1();TemL=get_temp_d();TemH&=0x00ff;TemL&=0x00ff;display((TemH/10),(T emH%10),(TemL/10),(TemL%10));}}/***************延时程序,单位us,大于10us*************/ void time_delay(unsigned char time){time=time-10;time=time/6;while(time!=0)time--;}/*****************************************************//* reset ds18b20 */ /*****************************************************/void ds_reset_1(void){unsigned char idata count=0;DQ1=0;time_delay(240);time_delay(240);DQ1=1;return;}void check_pre_1(void){while(DQ1);while(~DQ1);time_delay(30);}void read_ROM(void){int n;check_pre_1();wr_ds18_1(0x33);for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}}/*****************************************************//* Read a bit from 1820 位读取*/ /*****************************************************/bit tmrbit_1(void){idata char i=0;bit dat;DQ1=0;_nop_();DQ1=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();dat = DQ1;time_delay(50);return dat;}/*****************************************************//* read a bety from ds18b20 字节读取*/ /*****************************************************/unsigned char rd_ds18_1(){unsigned char idata i,j,dat=0;for(i=1;i<=8;i++){j=tmrbit_1();dat=(j<<(i-1))|dat;}return dat;}/*****************************************************//* write a bety from ds18b20 写字节*/ /****************************************************/void wr_ds18_1(char dat){signed char idata i=0;unsigned char idata j;bit testb;for(j=1;j<=8;j++){testb=dat & 0x01;dat = dat>>1;if(testb){DQ1=0;_nop_();_nop_();DQ1=1;time_delay(60);}else{DQ1=0;time_delay(50);DQ1=1;_nop_();_nop_();}}}int get_temp_1(void){unsigned char idata a=0,b=0; unsigned char idata i;EA=0;ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0x44);while(BUSY1);ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0xbe);a=rd_ds18_1();b=rd_ds18_1();i=b; /*若b为1则为负温*/ i=(i>>4);if(i==0){f=0;TMP=((a>>4)|(b<<4));a=(a&0x0f);if (a>8){TMP=(TMP+1);}}else{f=1;a=a>>4;b=b<<4;TMP=(a|b);TMP=~TMP;TMP=(TMP+1);}EA=1;return(TMP);}int get_temp_d(void){unsigned char idata a=0,b=0; unsigned char idata i,m;EA=0;ds_reset_1();//复位check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0x44);while(BUSY1);ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0xbe);a=rd_ds18_1();b=rd_ds18_1();i=b; /*若b为1则为负温*/ i=(i>>4);if(i==0){f=0;TMP=((a>>4)|(b<<4)); a=(a&0x0f);TMP_d=a;}else{f=1;a=~a;a=(a+1);b=~b;b=(b+1);m=a;a=a>>4;b=b<<4;TMP=(a|b);m=(m&0x0f);TMP_d=m;}EA=1;return(TMP_d);}void delay(unsigned int x) {unsigned int i;for(i=0;i<x;i++);}void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4) {P2=a[d1];LED_0=0;delay(100);LED_0=1;P2=a[d2];LED_1=0;delay(100);LED_1=1;P2=a[d3];LED_2=0;delay(100);LED_2=1;P2=a[d4];LED_3=0;delay(100);LED_3=1;}。
DS18B20温度传感器设计原理图及c程序代码
/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。
单片机中使用DS18B20温度传感器C语言程序文件
单片机中使用DS18B20温度传感器C语言程序(参考1)/********************************************************************************DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i>0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存P0=0xfe;wela=1;wela=0;delay(1); //延时约2ms P0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。
转基于DS18B20数字温度计C语言程序设计
看了好多天单片机,找了好多资料想自己利用实验板上的DS18B20做个温度计(最近温度实在是太热了)。
在网上找了好多关于这个的程序,结果发现对我的板子来说就这个好用,温度三十度不算高,因为我把它放到风扇下面了,现在和大家分享一下吧,不过里面我自己也改了一点点。
希望高手不要见笑,红色的部分是我改的或者是后加上的。
如果还有什么更好的建议或意见请记得给我留言哦……#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit PS2=P2^6; //数码管十位,位选sbit PS1=P2^7; //数码管个位,段选sbit P_L=P1^0; //测量指示sbit DQ=P2^2; //DS18B20数据接口void delay(uint); //延时函数void DS18B20_init(void); //DS18B20初始化void get_temper(void); //读取温度程序void DS18B20_write(uchar in_data); //DS18B20写数据函数uchar DS18B20_read(void); ////读取数据程序uchar htd(uchar a); //进制转换函数void display(void); //显示函数uchar temp; //温度寄存器bit DS18B20; // 18B20存在标志,1---存在0---不存在uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //字段转换表void main(void){uint a;while(1){get_temper(); //测量温度for(a=0;a<200;a++) ;//显示,兼有延时的作用display();}}/****************************DS18B20读取温度函数**************************//*函数原型:void get_temper(void)/*函数功能:DS18B20读取温度/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2005/11/14/*作者:站长/**********************************************************************/void get_temper(void){uchar k,T_sign,T_L,T_H;DS18B20_init(); //DS18B20初始化if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回{DS18B20_write(0xcc); // 跳过ROM匹配DS18B20_write(0x44); //发出温度转换命令DS18B20_init(); //DS18B20初始化if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回{DS18B20_write(0xcc); //跳过ROM匹配DS18B20_write(0xbe); //发出读温度命令T_L=DS18B20_read(); //数据读出T_H=DS18B20_read();k=T_H&0xf8;if(k==0xf8)T_sign=1; //温度是负数elseT_sign=0; //温度是正数T_H=T_H&0x07;temp=(T_H*256+T_L)*0.0625; //温度转换常数}}}/****************************DS18B20写数据函数**************************//*函数原型:void DS18B20_write(uchar in_data)/*函数功能:DS18B20写数据/*输入参数:要发送写入的数据/*输出参数:无/*调用模块:_cror_()/*建立时间:2005/11/14/*作者:站长/**********************************************************************/void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求){uchar i,out_data,k;out_data=in_data;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();_nop_();k=out_data&0x01;if(k==0x01) //判断数据写1{DQ=1;}else //写0{DQ=0;}delay(4); //延时62usDQ=1;out_data=_cror_(out_data,1); //循环右移1位}}/**************************DS18B20读函数**************************/ /*函数原型:void DS18B20_read()/*函数功能:DS18B20读数据/*输入参数:无/*输出参数:读到的一字节内容/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/uchar DS18B20_read(){uchar i,in_data,k;in_data=0;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();_nop_();k=DQ; //读DQ端if(k==1) //读到的数据是1{in_data=in_data|0x01;}else{in_data=in_data|0x00;}delay(3); //延时51usDQ=1;in_data=_cror_(in_data,1); //循环左移1位}return(in_data);}/**************************DS18B20初始化函数**************************/ /*函数原型:void DS18B20_init(void)/*函数功能:DS18B20初始化/*输入参数:无/*输出参数:无/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/void DS18B20_init(void){uchar a;DQ=1; //主机发出复位低脉冲DQ=0;delay(44); //延时540USDQ=1;for(a=0;a<0x36&&DQ==1;a++){ //等待DS18B20回应a++;a--;}if(DQ)DS18B20=0; //18B20不存在else{DS18B20=1; // 18B20存在delay(120); //复位成功!延时240US}}/**************************数码管显示函数**************************//*函数原型:void display(void)/*函数功能:数码管显示/*输入参数:无/*输出参数:无/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/void display(void){PS1=1;P0=0x01;PS1=0;PS2=1;P0=tab[htd(temp)>>4]; //转换成十进制输出PS2=0;delay(200);PS1=1;P0=0x02;PS1=0;PS2=1;P0=tab[htd(temp)&0x0f]; //转换成十进制输出PS2=0;delay(200);P_L=~DS18B20;}/*********************原显示函数***********************************void display(void){P0=tab[htd(temp)>>4]; //转换成十进制输出PS2=1;PS1=0;delay(200);P0=tab[htd(temp)&0x0f]; //转换成十进制输出PS1=1;PS2=0;delay(200);P_L=~DS18B20;}*******************************************************//**************************十六进制转十进制函数**************************//*函数原型:uchar htd(uchar a)/*函数功能:十六进制转十进制/*输入参数:要转换的数据/*输出参数:转换后的数据/*调用模块:无/*建立时间:2005/11/14/*作者:站长/******************************************************************/uchar htd(uchar a){uchar b,c;b=a%10;c=b;a=a/10;b=a%10;c=c|b<<4;return c;}/*******************************延时函数*********************************/ /*函数原型:delay(unsigned int delay_time)/*函数功能:延时函数/*输入参数:delay_time (输入要延时的时间)/*输出参数:无/*调用模块:无/*建立时间:2005/10/21/*作者:站长/**********************************************************************/ void delay(unsigned int delay_time) //延时子程序{for(;delay_time>0;delay_time--){}}。
单片机DS18B20温度传感器C语言程序含CRC校验综述
单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
DS18B20的c读写程序
1.//这是关于DS18B20的c读写程序,数据脚P1.0,晶振12MHZ2.//采用的是启东单片机开发板AY-MPU89S51E3.//进行温度显示,这里我们考虑用四位数码管来显示温度4.//显示范围-55.0到+99.5度,显示精度为0.5度5.//关于程序中的延时请参考ds18b20的读写时序6.7.#include <reg52.h>8.#define uchar unsigned char9.10.uchar tempint,tempdf; //温度整数部分和小数部分11.12.sbit TMDAT = P1^0; //根据实实际情况设定13.sbit ld7=P1^7; //初始化成功标志led14.sbit ld6=P1^6; //负温度标志led15.sbit point=P0^7; //小数点显示16.uchar f; //负温度标志17.18.code unsigned char ledmap[]={19. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF};20. //7段数码管0~9数字的共阳显示代码和负号位代码(最后一位)21.22.void set_ds18b20(); //初始化DS18B20子程序23.void get_temperature(); //获得温度子程序24.void read_ds18b20(); //读DS18B20子程序25.void write_ds18b20(uchar command);//向DS18B20写1字节子程序26.void delayms(uchar count); //延时count毫秒子程序27.void disp_temp(); //显示温度子程序28.29.void main()30.{31.SP=0x60; //设置堆栈指针32.while(1)33.{34.get_temperature(); //获得温度35.if(tempdf>=8)36. { //0.5度精度显示37.tempdf=5;38. }39.else40. {41.tempdf=0;42. }43.disp_temp(); //显示温度44.}45.}46.47.void set_ds18b20()48.{49. while(1)50. {51. uchar delay,flag;52. flag=0;53. TMDAT=1;54. delay=1;55. while(--delay);56. TMDAT=0; //数据线置低电平57. delay=250;58. while(--delay); //低电平保持500us59. TMDAT=1; //数据线置高电平60. delay=30;61. while(--delay); //高电平保持60us62. while(TMDAT==0) //判断DS18B20是否发出低电平信号63. {64. delay=210; //DS18B20响应,延时420us65. while(--delay);66. if(TMDAT) //DS18B20发出高电平初始化成功,返回67. {68. flag=1; //DS18B20初始化成功标志69. ld7=0; //初始化成功LED标志70. break;71. }72. }73. if(flag) //初始化成功,再延时480us,时序要求74. {75. delay=240;76. while(--delay);77. break;78. }79. }80.}81.82.void get_temperature() //温度转换、获得温度子程序83.{84. set_ds18b20(); //初始化DS18B2085. write_ds18b20(0xcc); //发跳过ROM匹配命令86. write_ds18b20(0x44); //发温度转换命令87. disp_temp(); //显示温度,等待AD转换88. set_ds18b20();89. write_ds18b20(0xcc); //发跳过ROM匹配命令90. write_ds18b20(0xbe); //发出读温度命令91. read_ds18b20(); //将读出的温度数据保存到tempint和tempdf处92.93.}94.95.void read_ds18b20()96.{97. uchar delay,i,j,k,temp,temph,templ;98. j=2; //读2位字节数据99. do100. {101. for(i=8;i>0;i--) //一个字节分8位读取102. {103. temp>>=1; //读取1位右移1位104. TMDAT=0; //数据线置低电平105. delay=1;106. while(--delay);107. TMDAT=1; //数据线置高电平108. delay=4;109. while(--delay); //延时8us110. if(TMDAT) //读取1位数据111. temp|=0x80;112. delay=25; //读取1位数据后延时50us113. while(--delay);114. }115. if(j==2) //读取的第一字节存templ116. templ=temp;117. else118. temph=temp; //读取的第二字节存temph119. }while(--j);120. f=0;121. if((temph & 0xf8)!=0x00) //若温度为负的处理,对二进制补码的处理122. {123. f=1; //为负温度f置1124. ld6=0;125. temph=~temph;126. templ=~templ;127. k=templ+1;128. templ=k;129. if(k>255)130. {131.temph++;132. }133. }134. tempdf=templ & 0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf135. templ>>=4;136. temph<<=4;137. tempint=temph|templ;138.}139.140.void write_ds18b20(uchar command)141.{142. uchar delay,i;143. for(i=8;i>0;i--) //将一字节数据一位一位写入144. {145. TMDAT=0; //数据线置低电平146. delay=6; //延时12us147. while(--delay);148. TMDAT=command&0x01; //将数据放置在数据线上149. delay=25; //延时50us150. while(--delay);151. command=command>>1; //准备发送下一位数据152. TMDAT=1; //发送完一位数据,数据线置高电平153. }154.}155.156.void disp_temp()157.{158. uchar tempinth,tempintl,cnt;159.160. tempinth=tempint/10; //整数高半字节161. tempintl=tempint%10; //整数低半字节162. cnt=200; //循环显示200次163. while(--cnt)164. {165. while(f==1)166. {167. P0=ledmap[10];168. if(tempinth==0)169. {170.P2=0xef;171.delayms(1);172.173.goto loop;174. }175. else176. {P2=0xdf;}177. }178. delayms(1);179.180. P0=ledmap[tempinth];181. P2=0xef; //开十位182. delayms(1);183.184.loop:P0=ledmap[tempintl];185. P2=0xf7; //开个位186. point=0; //小数点显示187. delayms(1);188.189. P0=ledmap[tempdf];190. P2=0xfb; //开十分位191. delayms(1);192. }193.}194.195.void delayms(uchar count) //延时count ms子程序196.{197. uchar i,j;198. do199. {200. for(i=5;i>0;i--)201. for(j=98;j>0;j--);202. }while(--count);203.}/bbs/read.php?tid=1695第一节DS18B20通讯协议DS18B20采用Dallas公司1-WIRE网络协议通讯,这里就围绕着DS18B20介绍1-WIRE网络协议。
DS18B20温度传感器C程序
DS18B20温度传感器C程序单片机型号:STC89C54RD+, STC89C52RC测试通过。
晶震频率:11.05924使用时只需要修改对应的外部管脚即可。
MAIN.C:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P3^2; //18B20通讯引脚。
extern void DelayX10us(unsigned char t);extern bit Get18B20Temp(int *temp);extern bit Get18B20Ack();extern bit Start18B20();unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; //数码管编码0-F unsigned char LedBuff[12] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};int temp=1;unsigned char flg;unsigned char T0RH,T0RL;void ConfigTimer0(unsigned int ms) //开内部定时器延时,到时间后触发中断。
{unsigned long tmp;tmp = 11059200 / 12;tmp = (tmp * ms) / 1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char)(tmp>>8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 = 1;TR0 = 1;}void LedScan() //数码管扫描程序。
ds18b20温度检测程序(C语言)
//18B20单线温度检测的应用样例程序#include<REG52.H>#include<math.h>#include<INTRINS.H>#include<stdio.h>#define uchar unsigned char#define uint unsigned int;/*****************************************************************************/ sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口/**********************************************************************/uchar temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳uchar str[3];/***********************************************************************/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);void INITchuangkou(void);//void Initdingshiqi1(void);/************************************************************************/main(){TMOD|=0x21;//定时器设置TH0=0xef;TL0=0xf0;EA=1;TR0=1;//Initdingshiqi1();INITchuangkou();P2=0x00;count=0;while(1){str[2]=0x39;//显示C符号str[0]=tab[temp/10]; //十位温度str[1]=tab[temp%10]; //个位温度if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();printf("%d",temp);flag_get=0;}}}void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}count++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){ P2=2;dataled=str[2];count=0;}}/******************************************************************************void delay(unsigned int i)//延时函数{while(i--);}/****************************************************************************** *********///18b20初始化函数void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}//读一个字节unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}//写一个字节void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}//读取温度unsigned char ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;//float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();b<<=4;b+=(a&0xf0)>>4;t=b;//tt=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}void INITchuangkou(void){SCON=0X50;TH1=0XFD;TR1=1;TI=1;}/*void Initdingshiqi1(void);{TMOD=0X11;TH1=0XFD;TL1=0XFD; TR1=1;}*/。
DS18B20温度计 c程序 lcd1602显示(word文档良心出品)
2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
单片机DS18B20温度计C语言程序
{ dsInit(); //初始化 DS18B20, 无论什幺命令, 首先都要发起初始化 dsWait(); //等待 DS18B20 应答 delay(1); //延时 1ms, 因为 DS18B20 会拉低 DQ 60~240us 作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T } //向 DS18B20 发送读取数据命令 void sendReadCmd() { dsInit(); dsWait(); delay(1);
单片机 DS18B20 温度计 C 语言程序
#include #include #include //要用到取绝对值函数 abs() //通过 DS18B20 测试当前环境温度, 并通过数码管显示当前温度值, 目前显 示范围: -55~ +125 度 sbit wela = P2; //数码管位选 sbit dula = P2; //数码管段选 sbit ds = P2 ; int tempValue; //0-F 数码管的编码(共阳极) unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
i = 8; while(i>0) i--; //延时约 64us, 符合写时隙不低于 60us 要求 } else //写 0, 将 DQ 拉低 60us~120us ds = 0; i = 8; while(i>0) i--; //拉低约 64us, 符号要求 ds = 1; i++; i++; //整个写 0 时隙过程已经超过 60us, 这里就不用像写 1 那样, 再延 时 64us 了 } } //向 DS18B20 发送温度转换命令 void sendChangeCmd()
用DS18B20测量室温并在数码管上显示
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
码管位选变量
uchar cnt = 2;
void Disp_Numb(uint temper);
/****************主函数****************/
void main(void)
{
uchar i;
WDTCTL=WDTPW+WDTHOLD;
/*************************************************
程序功能:用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:观察显示温度数值。
*************************************************/
功 能:看门狗定时器中断服务函数,进行数码
管动态扫描
参 数:无
返回值 :无
********************************************/
#pragma vector = WDT_VECTOR
DS18B20温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
DS18B20温度传感器测温通过数码管显示(上传)
DS18B20温度传感器测温通过数码管显示(详尽版)/*-----------------------------------------------名称:DS18B20温度传感器数码管显示编写:JR日期:2017.12修改:无内容:利用DS18B20温度传感器测量温度-40~+100℃,通过数码管显示单片机开发板使用“金容电子(https:///item.htm?id=544540401703)”开发的JR51单片机开发板。
------------------------------------------------*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2; //温度传感器信号线sbit dula=P2^6; //数码管段选线sbit wela=P2^7; //数码管位选线sbit beep=P2^3; //数码管位选线uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; //低温-40℃报警,测试温度乘以100uint warn_h=10000; //高温100℃报警,测试温度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//不带小数点0-9编码const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点0-9编码uchar data temp_data[2]={0x00,0x00}; //读出温度暂放void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************************************18B20复位初始化函数1、将数据线拉高到12、延时2us(该时间要求不是很严格,但是要尽可能短一点)3、将数据线拉低到04、延时750us(该时间范围可以在480~960us)5、将数据线拉高到16、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,据该状态可以确定它的存在。
单片机DS18B20温度传感器C语言程序含CRC校验
单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
对ds18b20温度控制C语言程序
#include<reg52.h>#include<intrins.h>typedef unsigned char uchar;typedef unsigned int uint;uchar wbuf[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F}; uchar tplsb,tpmsb;//温度低位,高位uint temp=0;//实际温度uint temp1=30;//报警温度uint temp2=27;//报警温度//sbit led=P2^1; //示警发光二极管信号引脚sbit motor=P1^7; //电机信号输出引脚sbit reduce=P2^1; //报警温度下减键sbit plus=P2^0; //报警温度上加键//bit flag1=0;//bit flag2=0;sbit A=P2^6;//数码管位选sbit C=P2^7;//数码管位选sbit DQ=P1^0;//DS18B20控制线void delay1(uint j ){ int i,k;for(i=0;i<110;i++)for(k=0;k<j;k++);}void delay(uint t) //延时t毫秒{uint i;while(t--);{for(i=0;i<250;++i); //延时约1us{}}}/*产生复位脉冲初始化DS18B20*/void Init(){uint i=100;DQ=0;while(i>0)i--;//拉低约900usDQ=1;//拉高电平,产生上升沿i=4;while(i>0)i--;}/*等待应答脉冲*/void Wait(){uint i;while(DQ);while(~DQ); //检测到应答脉冲i=4;while(i>0)i--;}/*读数据一位*/bit Rebit(){uint i;bit b;DQ=0;i++;//保持低电平至少1usDQ=1;i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效b=DQ;i=9;while(i>0)i--;//读时隙不低于60usreturn(b);}/*读一个字节数据*/uchar Rebyte(){uchar i,j=0,k=0;for(i=0;i<8;i++){k=Rebit();j=(k<<7)|(j>>1);}return(j);}/*写一个字节数据*/void Wrbyte(uchar b){uint i,j;bit temp;for(j=0;j<8;j++){temp=b&0x01;b>>=1;if(temp){/*写1*/DQ=0;i++;i++;//延时15usDQ=1;i=8;while(i>0)i--;//整个写1时隙不低于60us}else{/*写0*/DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}/*启动温度转化*/void Convert(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0x44);//convert T命令}/*读取温度值*/void Retemp(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0xbe);//read scratchpad(读暂存器)命令tplsb=Rebyte();//温度低位字节(其中第四位为小数部分)tpmsb=Rebyte();//温度高位字节(其中高五位为符号位)temp=(tpmsb*256+tplsb)*0.0625;//转换}/*LED显示*/void Display(){for(n=0;n<3;n++){ j=temp/10;//取温度十位k=temp%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示十位delay(10);//com1=1; //关第一位显示P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示个位//delay(2);//com2=1;//关第二位显示}}void main(){EA=1;EX0=1;TF0=1;//EX1=1;do{//delay(1);Convert();//温度转换delay(10);Retemp();//读温度delay(10);Display();//显示if((temp>=temp1)||(temp<=temp2)){// led=0;motor=0;}else{// led=1;motor=1;}// if(temp<=temp2)// motor=0;}while(1);}void TNTO() interrupt 0do{for(n=0;n<5;n++){ j=temp1/10;//取温度十位k=temp1%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示报警温度十位delay1(12);P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示报警温度个位delay1(12);}if((P2&0x0f)!=0x0f){i=0;delay1(60);if((P2&0x0f)!=0x0f){ if(plus==0){ delay1(10);if(plus==0)temp1++;}if(reduce==0){ delay1(10);if(reduce==0)temp1--;}}}i++;if(((P2&0x0f)==0x0f)&&(i>=50)) break;}while(1);}。
DS18B20温度传感器和数码管显示例程
//DS18B20温度传感器和数码管显示//编程时间:连线表: CPU=stc89C52 SysClock=12MHz// LEDLE= 控制位高电平有效 LEDSEG=P2 KEYBOARD=P3 LEDWEI=,LED高到底//**********************************************************//DS18B20//**********************************************************//连线表: CPU=stc89C52 SysClock=12MHz *//单总线: TMDAT=////**********************************************************#include <>#define uchar unsigned char#define uint unsigned intuchar discount=0;//显示扫描位计数uchar last=0;//最终温度值uchar itcount=0x13;//定时器延时计数uchar seg[4];//数码管显示暂存uchar tem[2];//读取温度暂存uchar flag=0;//温度正负标志位/********************LED引脚定义********************/sfr LEDSEG=0x80;//P2sfr LEDWEI=0xA0;//P3/********************DS18B20引脚定义********************/sbit TMDAT=P1^0; //温度传感器数据位/********************DS18B20函数定义*******************/void dmsec(uint count);//延时(count)毫秒void tmreset(void); //产生复位信号void tmpre(void); //检测器件应答信号bit tmrbit(void); //从总线读一个bituchar tmrbyte(void); //从总线读一个字节void mwbyte(uchar dat);//向总线写一个字节void tmstart(void); //启动一次温度转换uchar tmrtemp(void); //读取温度数据/********************LED函数定义*******************/uchar * uchartodectoseg(uchar unm);//字符转换为十进制然后转换为数码管段表void disp(uchar *seg);//显示函数void delay_ms(uint t); //延时函数/************************************************/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xc6};/*************数码表*******0 1 2 3 4 5 6 7 8 9 无显示 C**************/ /************************************************/uchar * uchartodectoseg(uchar unm){uchar x00,xx,x0,x,n;x00=unm/100;//取百位xx=unm%100;//取余x0=xx/10;//取十位x=xx%10;//取余即取个位n=0;seg[n]=table[x00];n++;seg[n]=table[x0];n++;seg[n]=table[x];n++;seg[n]=table[11];//最后一位显示摄氏度符号Cif(flag==1)seg[0]=0x40;//显示负号‘-’if(seg[0]==table[0])seg[0]=table[10]; //如果百位为零则不显示if((seg[0]==table[0])&(seg[1]==table[0]))seg[1]=table[10];//如果百位为零且十位为零则十位不显示return seg;}/***************************************************/ /******DELAY***************************/void delay_ms(uint t){uint m,n;for(m=0;m<t;m++){for(n=0;n<950;n++);}}/******************************************//*********************显示LEDSEG*****************************/void disp(uchar *seg){uchar wei[]={0x08,0x04,0x02,0x01};//位扫描码//LEDSEG=seg[10];LEDWEI =wei[discount];LEDSEG = seg[discount];delay_ms(1);discount++;if(discount==4){ delay_ms(1);discount=0;//LEDSEG=seg[10];LEDWEI=wei[discount];LEDSEG=seg[discount];}//检测是否扫描完,扫描完的话则重新置初值}/*********************************************************//*****************DS18B20函数体定义****************/void dmsec(uint count) {uint i;while(count--){for(i=0;i<125;i++){} }}void tmreset(void){uint i;TMDAT=0;i=103;while(i>0) i--;TMDAT=1;i=4;while(i>0) i--;}void tmpre(void){uint i;while(TMDAT);while(~TMDAT);i=4;while(i>0) i--;}bit tmrbit(void){uint i;bit dat;TMDAT=0;i++;TMDAT=1;i++;i++;dat=TMDAT;i=8;while(i>0) i--;return(dat);}uchar tmrbyte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){ j=tmrbit();dat=(j<<7)|(dat>>1); }return(dat);}void tmwbyte(uchar dat) {uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat & 0x01; dat=dat>>1;if(testb){ TMDAT=0;i++; i++;TMDAT=1;i=8;while(i>0) i--; }else{ TMDAT=0;i=8;while(i>0) i--; TMDAT=1;i++; i++;}}}void tmstart(void){tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0x44);}uchar tmrtemp(void){uchar y1,y2,y3;tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0xbe);tem[0]=tmrbyte();tem[1]=tmrbyte();if(tem[1]>127){tem[1]=(255-tem[1]);tem[0]=(255-tem[0]);flag=1;} //负温度求补码y1=tem[0]>>4;y2=tem[1]<<4;y3=y1|y2;return(y3);}/*********************************************************/void main(){TMOD=0X01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;TR0=1;dmsec(1);tmstart();while(1){uchartodectoseg(last);disp(seg);}}void time0() interrupt 1{TL0=0XB0;TH0=0X3C;//定时50msitcount--;if(itcount==0){last=tmrtemp();dmsec(1);tmstart();itcount=0x13;}}。
DS18B20与数码管温度显示C程序
#include<reg52.h〉#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4;//ds18b20与单片机连接口unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};//共阴数码管字码表unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef,0x39};//个位带小数点字码表unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/******************************ds1820程序***************************************/void delay_18B20(unsigned int i)//延时1微秒{while(i-—);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1;//DQ复位delay_18B20(4);//延时DQ = 0;//DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i〉0;i——){DQ = 0;//给脉冲信号dat>>=1;DQ = 1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8;i〉0; i——){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue〈〈=8;tvalue=tvalue|a;if(tvalue〈0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/void ds1820disp()//温度值显示{uchar flagdat;uchar i;disdata[0]=tvalue/1000;//百位数disdata[1]=tvalue%1000/100;//十位数disdata[2]=tvalue%100/10;//个位数disdata[3]=tvalue%10;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:—if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}for(i=0;i<150;i++){P2=wei[0];P0=str[disdata[3]];delay_18B20(20);P2=wei[1];P0=str1[disdata[2]];delay_18B20(20);P2=wei[2];P0=str[disdata[1]];delay_18B20(20);P2=wei[3];P0=str[disdata[0]];delay_18B20(20);}}/********************主程序***********************************/void main(){ds1820rst;//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
DS18B20温度传感器的C语言程序
下面是DS18B20的子程序,#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar a;sbit DQ=P2^0;void reset(); //DS18B20复位函数void write_byte(uchar val); //DS18B20写命令函数uchar read_byte(void); //DS18B20读1字节函数void read_temp(); //温度读取函数void work_temp(); //温度数据处理函数uchar data temp_data[2]={0x00,0x00};uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值uchar codeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数部分查表main(){while(1){reset();write_byte(a);read_byte();read_temp();work_temp();}}void delay1(uint t) {for(;t>0;t--);}///////温度控制子函数void reset(){uchar presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_(); DQ=0; delay1(50);DQ=1;delay1(6);presence=DQ;}delay1(45);presence=~DQ;}DQ=1;}void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay1(6);val=val/2;}DQ=1;_nop_();}uchar read_byte(void){uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)value|=0x80; delay1(6);}DQ=1;return(value);}void read_temp(){reset();write_byte(0xcc);write_byte(0xbe);temp_data[0]=read_byte();temp_data[1]=read_byte();reset();write_byte(0xcc);write_byte(0x44);}void work_temp(){if(temp_data[1]>127){temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);}display[4]=temp_data[0]&0x0f; //低位的低4位display[0]=ditab[display[4]]; //小数点后的数值display[4]=((temp_data[0]&0xf0) >>4)|((temp_data[1]&0x0f)<<4); //小数点前的数值display[3]=display[4] / 100;display[1]=display[4] % 100;display[2]=display[1] / 10;display[1]=display[1] % 10;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^4;//ds18b20与单片机连接口
unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};//共阴数码管字码表
unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef,0x39};//个位带小数点字码表
unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7};
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/ void ds1820disp()//温度值显示
{ uchar flagdat;
uchar i;
disdata[0]=tvalue/1000;//百位数
disdata[1]=tvalue%1000/100;//十位数
disdata[2]=tvalue%100/10;//个位数
disdata[3]=tvalue%10;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
for(i=0;i<150;i++)
{
P2=wei[0];
P0=str[disdata[3]];
delay_18B20(20);
P2=wei[1];
P0=str1[disdata[2]];
delay_18B20(20);
P2=wei[2];
P0=str[disdata[1]];
delay_18B20(20);
P2=wei[3];
P0=str[disdata[0]];
delay_18B20(20);
}
}
/********************主程序***********************************/ void main()
{ ds1820rst;//初始化显示
while(1)
{read_temp();//读取温度
ds1820disp();//显示
}
}。