18B20温度传感器C语言编程实例
ds18b20温度传感C语言程序、LCD1602显示
程序主体#include<reg52.h>#define uchar unsigned char#define uint unsigned intextern TemperatuerResult(); //声明引用外部函数extern unsigned int idata Temperature;sbit lcd_e=P2^7;sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;void delay_ms(uchar i) //延时毫秒{int j;for(i;i>0;i--)for(j=110;j>0;j--);}bit lcd_check() //检测忙{bit result;lcd_rs=0;lcd_rw=1;lcd_e=1;delay_ms(1);result=(bit)(P0&0x80);lcd_e=0;return (result);}void write_cmd(uchar cmd) //向lcd写命令{while(lcd_check());lcd_rs=0;delay_ms(1);lcd_rw=0;delay_ms(1);P0=cmd;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void write_data(uchar shuju) //向lcd写数据{while(lcd_check());lcd_rs=1;delay_ms(1);lcd_rw=0;delay_ms(1);P0=shuju;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void lcd_init() //初始化{delay_ms(15);write_cmd(0x38);delay_ms(5);write_cmd(0x0c);delay_ms(5);write_cmd(0x06);delay_ms(5);write_cmd(0x01);}void display(uchar i,uchar j,uchar shuju) //在指定位置显示{write_cmd(0x80+j*0x40+i);delay_ms(1);write_data(shuju);delay_ms(1);}void main(){lcd_init();while(1){TemperatuerResult();display(0,0,'T');display(1,0,'e');display(2,0,'m');display(3,0,'p');display(4,0,'e');display(5,0,'r');display(6,0,'a');display(7,0,'t');display(8,0,'u');display(9,0,'r');display(10,0,'e');display(11,0,' ');display(12,0,'i');display(13,0,'s');display(0,1,(Temperature/16%10000/1000+0x30));display(1,1,(Temperature/16%1000/100+0x30));display(2,1,(Temperature/16%100/10+0x30));display(3,1,(Temperature/16%10+0x30));display(4,1,'.');display(5,1,(Temperature*10/16%10+0x30));display(6,1,'`');display(7,1,'C');}}温度采集子程序/*************************此部分为18B20的驱动程序*************************************/#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7;#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/bit flag;unsigned int idata Temperature;unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID 为8字节unsigned char idata id_buff[8];unsigned char idata *p,TIM;unsigned char idata crc_data;//************************************************************void TempDelay (unsigned char idata us){while(us--);}//************************************************************void Init18b20 (void){D18B20=1;_nop_();D18B20=0;TempDelay(80); //delay 530 uS//80_nop_();D18B20=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(D18B20==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();D18B20 = 1;}//************************************************************ void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 0;_nop_();D18B20=wr&0x01;TempDelay(3); //delay 45 uS //5_nop_();_nop_();D18B20=1;wr >>= 1;}}//************************************************************ unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 0;u >>= 1;D18B20 = 1;if(D18B20==1)u |= 0x80;TempDelay (2);_nop_();}return(u);}//************************************************************ void read_bytes (unsigned char j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}//************************************************************ void TemperatuerResult(void){Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;read_bytes (2);Temperature = temp_buff[1]*0x100 + temp_buff[0];TempDelay(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。
我的51单片机之 温度传感器18B20 的C语言和汇编编程
{
TCZ=TCZ%100;//只显示小于 100 的整数温度
}
TC[1]=TCZ/10;
TC[0]=TCZ%10;
}
Hale Waihona Puke }void main() {
LEDCODE=0xFF; LED1=0; while(1) {
ReadTemp(); Disp(); } }
四、汇编程序: ;********************************************************************
温度传感器 18B20 实验
一、功能: 插上 18B20,上电后,数码管显示相应的环境温度。
二、电路图:
三、C 程序: //******************************************************************** //读取 18B20 输出的温度数据(2 位)并在数码管上显示;made by luqichao //********************************************************************
unsigned char Reset(); unsigned char ReadByte(); void WriteByte(unsigned char Data); void ReadTemp(); //延时 void delay(unsigned char n) {
unsigned char i; for(i=0;i<n;i++) { } }
Data>>=1; CLK=0; NOP();NOP();NOP();NOP();NOP();NOP();//6us CLK=1; NOP();NOP();NOP();NOP();NOP();//4us Temp=CLK; if(Temp) {
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温度传感器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() //数码管扫描程序。
18B20温度传感器C语言编程实例
温度传感器C语言编程实例#include <reg52.h>#include<intrins.h> //含有——nop_();#include <stdio.h> //含有运算#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//数据、时钟线uchar duanma[]={0XFC,0X60,0XDA,0XF2,0X66,0XB6,0XBE,0XE0,0XFE,0XF6};uint wendu; //定义温度值存储位置// uchar bdata date; 原来是用来移动数据的float f_num; //因为温度传感器的精度为0.0625所以设一个float行的变量// sbit d=date^0;void delay_ms(uint ms){uchar i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void delay_us() //25us延时{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/****************************************************** init()初始化复位程序变量i;还有—nop是用来延时的时序:1、2us、0、480us、等待确认;在延时20us、1******************************************************/void init(){uint i;DQ=1;_nop_();DQ=0;delay_us();//1delay_us();//2delay_us();//3delay_us();//4delay_us();//5delay_us();//6delay_us();//7delay_us();//8delay_us();//9DQ=1;i=10;while((i--)&&(DQ==1));i=10;while(i--);DQ=1;}/******************************************************字节写:write_byte变量x用来产生for循环在写的过程中,0和一是分开写的时序:0、15us、把数据植入、45us、1、重复前面、1当进行写数据时0和1是分开写的;但是时序也要分开写;******************************************************/void write_byte(uchar date)//传递过来的参数是操作指令例如:0xcc,0x44;0xbe {uchar x;bit testb;for(x=0;x<8;x++){testb=date&0x01; //数据处理,它的作用是将数据的最低取出一直去完八位date>>=1;//没去一次向左移动一次if(testb){DQ=0;_nop_();_nop_();DQ=1;delay_us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;delay_us();}else{DQ=0;_nop_();_nop_();DQ=0;delay_us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;}}DQ=1;}/******************************************************位读程序:这样做的目的是为了把程序写的更有条理性而且程序的类型是bit型的,因此返回值为bit型的时序:0、15us、把数据置入、45us、1******************************************************/bit read_bit(){bit bt;DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();bt=DQ;return bt;}/****************************************************** 字节读程序:为了将上面的位读程序组合起来变量:shuju是用来将独处的数据存入******************************************************/ uchar read_byte(){uchar n,k,shuju;shuju=0;for(n=0;n<8;n++){k=read_bit();shuju=(k<<7)|(shuju>>1); //这是一个将位数据转换成字节数据,先接受的是低位}delay_us();return shuju;}/******************************************************启动温度转换:在进行对传感器操作之前必须先写入初始化程序先写入跳跃器件地址指令0xcc再写入启动温度转换指令0x44******************************************************/void start(){init();delay_ms(1);write_byte(0xcc);write_byte(0x44);//向18b20写入启动温度转换指令}/******************************************************温度转换及处理程序:他的做用是将温度值读出因为读出0的数据是两个char型数据需要将它转换成一个uint型的这样才能把显示做出来******************************************************/uint wenduchange(){uchar a,b;init(); // 初始化;必须要有的delay_ms(1);write_byte(0xcc);// 向18b20写入跳跃地址指令write_byte(0xbe);//向18b20写入读取温度指令a=read_byte(); //先读低八位b=read_byte();//再读高八位P0=b; //程序标志!检测用wendu=b;wendu<<=8;wendu=wendu|a;f_num=wendu*0.0625; //读出的温度值乘以18b20的精度wendu=f_num*10+0.5;// 保留一位小数,加0.5为了四舍五入f_num=f_num+0.5; // 在设定变量时一定注意F_num的类型为float型return wendu;}/****************************************************** 显示程序:运用的并口显示方式******************************************************/ void display(uint datt){P2=0xfd;P0=duanma[datt/100];delay_ms(5);P2=0xff;P2=0xfb;P0=duanma[datt/10%10];delay_ms(5);P2=0xff;P2=0xf7;P0=duanma[datt%10];delay_ms(5);P2=0xff;}/****************************************************** 主函数:用来把所有的子程序汇集起来!!******************************************************/ void main(){uint date;while(1){start();delay_ms(5);date=wenduchange();display(date);}}。
DS18B20温度计 c程序 lcd1602显示
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语言代码
//安装目录下的EXE文件打开后可在电脑上显示当前温度值#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DS=P2^2; //define interfaceuint temp; // variable of temperatureuchar flag1; // sign of the result positive or negativesbit dula=P2^6;sbit wela=P2^7;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};void delay(uint count) //delay{uint i;while(count){i=200;while(i>0)i--;count--;}}///////功能:串口初始化,波特率9600,方式1///////void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}void dsreset(void) //send reset and initialization command{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //read a bit{uint i;bit dat;DS=0;i++; //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //read a byte date{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DA T里}return(dat);}void tmpwritebyte(uchar dat) //write a byte to ds18b20{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //DS18B20 begin change{dsreset();delay(1);tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion }uint tmp() //get the temperature{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8; //two byte compose a int variable temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}void readrom() //read the serial{uchar sn1,sn2;dsreset();delay(1);tmpwritebyte(0x33);sn1=tmpread();sn2=tmpread();}void delay10ms() //delay{uchar a,b;for(a=10;a>0;a--)for(b=60;b>0;b--);}void display(uint temp) //显示程序{uchar A1,A2,A2t,A3,ser;ser=temp/10;SBUF=ser;A1=temp/100;A2t=temp%100;A2=A2t/10;A3=A2t%10;dula=0;P0=table[A1]; //显示百位dula=1;dula=0;wela=0;P0=0x7e;wela=1;wela=0;delay(1);dula=0;P0=table1[A2]; //显示十位dula=1;dula=0;wela=0;P0=0x7d;wela=1;wela=0;delay(1);P0=table[A3]; //显示个位dula=1;dula=0;P0=0x7b;wela=1;wela=0;delay(1);}void main(){uchar a;Init_Com();do{tmpchange();// delay(200);for(a=10;a>0;a--){ display(tmp());}} while(1); }。
单片机DS18B20温度计(有程序)
;单片机DS18B20温度计C语言程序; 有程序#include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs()//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7; //数码管位选sbit dula = P2^6; //数码管段选sbit ds = P2^2;int tempValue;//0-F数码管的编码(共阳极)unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-9数码管的编码(共阳极), 带小数点unsigned char code tableWidthDot[]={0x40, 0x79, 0x24, 0x30,0x19, 0x12, 0x02,0x78, 0x00, 0x10};//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void delay(unsigned int i){unsigned int j;while(i--){for(j = 0; j < 125; j++);}}//初始化DS18B20//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit(){//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于?us unsigned int i;ds = 0;i = 100; //拉低约800us, 符合协议要求的480us以上while(i>0) i--;ds = 1; //产生一个上升沿, 进入等待应答状态i = 4;while(i>0) i--;}void dsWait(){unsigned int i;while(ds);while(~ds); //检测到应答脉冲i = 4;while(i > 0) i--;}//向DS18B20读取一位数据//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,//之后DS18B20则会输出持续一段时间的一位数据bit readBit(){unsigned int i;bit b;ds = 0;i++; //延时约8us, 符合协议要求至少保持1usds = 1;i++; i++; //延时约16us, 符合协议要求的至少延时15us以上b = ds;i = 8;while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求return b;}//读取一字节数据, 通过调用readBit()来实现unsigned char readByte(){unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();//最先读出的是最低位数据dat = (j << 7) | (dat >> 1);}return dat;}//向DS18B20写入一字节数据void writeByte(unsigned char dat){unsigned int i;unsigned char j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1if(b){ds = 0;i++; i++; //拉低约16us, 符号要求15~60us内ds = 1;i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求}else //写"0", 将DQ拉低60us~120usds = 0;i = 8; while(i>0) i--; //拉低约64us, 符号要求ds = 1;i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us 了}}//向DS18B20发送温度转换命令void sendChangeCmd(){dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化dsWait(); //等待DS18B20应答delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0x44); //写入温度转换命令字Convert T}//向DS18B20发送读取数据命令void sendReadCmd(){dsInit();dsWait();delay(1);writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0xbe); //写入读取数据令字Read Scratchpad}//获取当前温度值int getTmpValue(){unsigned int tmpvalue;int value; //存放温度数值float t;unsigned char low, high;sendReadCmd();//连续读取两个字节数据low = readByte();high = readByte();//将高低两个字节合成一个整形变量//计算机中对于负数是利用补码来表示的//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的valuetmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度t = value * 0.0625;//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5return value;}unsigned char const timeCount = 3; //动态扫描的时间间隔//显示当前温度值, 精确到小数点后一位//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码void display(int v){unsigned char count;unsigned char datas[] = {0, 0, 0, 0, 0};unsigned int tmp = abs(v);datas[0] = tmp / 10000;datas[1] = tmp % 10000 / 1000;datas[2] = tmp % 1000 / 100;datas[3] = tmp % 100 / 10;datas[4] = tmp % 10;if(v < 0){//关位选, 去除对上一位的影响P0 = 0xff;wela = 0;//段选P0 = 0x40; //显示"-"号dula = 1; //打开锁存, 给它一个下降沿量dula = 0;//位选P0 = 0xfe;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}for(count = 0; count != 5; count++){//关位选, 去除对上一位的影响P0 = 0xff;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;//段选if(count != 2){P0 = table[datas[count]]; //显示数字}else{P0 = tableWidthDot[datas[count]]; //显示带小数点数字}dula = 0;//位选P0 = _crol_(0xfd, count); //选择第(count + 1) 个数码管wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}}void main(){unsigned char i;while(1){//启动温度转换sendChangeCmd();//显示5次for(i = 0; i < 40; i++){display(tempValue);}tempValue = getTmpValue();}以下是我编的程序,可用#include <reg52.h>#include <intrins.h>//-----------------------------------------------------------sbit DQ=P1^5;//-----------------------------------------------------------unsigned char number[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//数字0~9unsigned char wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位循环unsigned char Flag;unsigned char Templ,Temph;unsigned int temp;//-----------------------------------------------------------//函数声明//-----------------------------------------------------------void delay(unsigned char i); //延时程序//----------------------------------void Int18b20(void); //18b20初始化void Write18b20(unsigned char dat); //向18b20写一字节unsigned char Read18b20(void); //从18b20读一字节void Start18b20(void); //开始转换温度void Get18b20(void); //读出温度void chinT(void); //数据转换//----------------------------------void display(void); //显示程序//-----------------------------------------------------------//函数功能:延时//-----------------------------------------------------------/*************精确延时函数*****************/void delay(unsigned char i){while(--i);}/*此延时函数针对的是12Mhz的晶振delay(0); //延时518us 误差:518-2*256=6delay(1); //延时7us (原帖写"5us"是错的)delay(10); //延时25us 误差:25-20=5delay(20); //延时45us 误差:45-40=5delay(100); //延时205us 误差:205-200=5delay(200); //延时405us 误差:405-400=5*///-----------------------------------------------------------//DS18b20的相关程序//-----------------------------------------------------------//初始化//-----------------------------------------------------------void Int18b20(void){DQ=1;_nop_();_nop_();DQ=0; //拉低delay(100); //延时205usdelay(200); //延时405us //等待400~960微秒,最短为480us DQ=1;delay(1); //延时7usdelay(20); //延时45us //等待15~60微秒(等待回复)if(DQ==1) //判断初始化的情况是否成功{Flag=0; //复位失败}else{Flag=1;while(!DQ); //等待回复完成}delay(200); //延时405us //等待完成初始化}//-----------------------------------------------------------//写一字节//-----------------------------------------------------------void Write18b20(unsigned char dat){unsigned char i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7us //拉低后延时小于15usif(dat&0x01){DQ=1;}else{DQ=0;}dat=dat>>1;delay(20); //延时45usdelay(10); //延时25us //延时大于60usDQ=1;delay(1); //延时7us //延时大于1us}}//-----------------------------------------------------------//读一字节//-----------------------------------------------------------unsigned char Read18b20(void){unsigned char i,dat=0;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7usdat=dat>>1;DQ=1;delay(1); //延时7us //确保在15us后60us前读数据if(DQ){dat|=0x80;}delay(20); //延时45us //确保读时续大于60us}return dat;}//-----------------------------------------------------------//开始转换温度//-----------------------------------------------------------void Start18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0x44); //温度转换指令}//-----------------------------------------------------------//读出温度//-----------------------------------------------------------void Get18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0xbe); //读暂存器指令Templ=Read18b20();Temph=Read18b20();}//-----------------------------------------------------------//数据转换//-----------------------------------------------------------void chinT(void){float Tt;temp=Temph; //先把高八位有效数据赋于temptemp=(temp<<8); //将数据从temp低八位移到高八位temp=temp|Templ; //将两字节合成一个整型变量Tt=temp*0.0625; //得到真实十进制温度值(因为DS18B20可以精确到0.0625度) temp=Tt*10+0.5; //放大十倍(将小数点后一位变成个位,个位变成十位,十位变成百位,并四舍五入)}//-----------------------------------------------------------//显示程序//-----------------------------------------------------------void display(void){unsigned int i;unsigned char A1,A2,A3;A1=temp/100; //百位(温度的十位)A2=temp%100/10; //十位(温度的个位)A3=temp%10; //个位(温度的小数点后一位)for(i=0;i<20;i++){P0=0x00;P2=0x00;P0=number[A1];P2=wei[0];delay(220);P0=0x00;P2=0x00;P0=number[A2];P2=wei[1];delay(220);P0=0x00;P2=0x00;P0=number[A3];P2=wei[2];delay(220);P0=0x00;P2=0x00;P0=0x80;P2=wei[1];delay(220);}}//-----------------------------------------------------------//----------------------------------------------------------- void main(void){while(1){Int18b20();if(Flag){Start18b20(); //开始转换温度Get18b20(); //得到温度chinT(); //数据转换display(); //显示}else P3=0x01;}}。
单片机中使用DSB温度传感器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为模式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);}/*****************************************时序:初始化时序、读时序、写时序。
温度传感器18B20驱动程序(C语言)
温度传感器18B20驱动程序(C语言)/*************************************************************18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*Author:fyb*2005-3-25 11:23,OK!*************************************************************/#i nclude<reg51.h>#i nclude<intrins.h>#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read romID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126,32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227,189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93,3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192,158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56,102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165,251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27,69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134,216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242,172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111,49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209,143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76,18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180,234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41,119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151,201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10,84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (uchar us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/*************************************************************Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/*************************************************************Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;dq = 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/*************************************************************Function:读18B20*parameter:*Return:*Modify:*************************************************************/void read_bytes (uchar j){uchar i;for(i=0;i<j;i++){*p = ReadByte();p++;}}/*************************************************************Function:CRC校验*parameter:*Return:*Modify:*************************************************************/uchar CRC (uchar j){uchar i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]];return (crc_data);}/*************************************************************Function:读取温度*parameter:*Return:*Modify:*************************************************************/void GemTemp (void)read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/*************************************************************Function:内部配置*parameter:*Return:*Modify:*************************************************************/void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/*************************************************************Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/void ReadID (void)//读取器件id{Init18b20();WriteByte(0x33); //read romread_bytes(8);/*************************************************************Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}。
单片机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); }/*****************************************时序:初始化时序、读时序、写时序。
18b20多点温度检测c语言实例
//***************************//冯新刚2011-3-24// 读取18b2064位序列号+led 显示,//11.0592HMZ,8位LED循环显示//***************************#include <reg52.h>#include <INTRINS.H>sbit DQ=P1^2; //定义通信端口#define sel P2 //led#define cod P0 //ledunsigned char x,ttt; //显示用变量unsigned int x1;unsigned char shu[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //温度转换后存储变量unsigned char code Select[]={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0x0bf,0x7f};unsigned char code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x bf,0xff}; //-,灭unsigned char code SN[2][8]={{40,106,47,152,02,00,00,55},{40,44,45,152,02,00,00,115}};//18b20序列号,这里为两路温度检测,要先读出序列号填在这里才能读取温度void delay1(int z){int x,y;for(x=z;x>0;x--){for(y=10;y>0;y--);}}void delay(unsigned int i){while(--i);}//初始化函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(70); //精确延时大于480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);DQ=1;return (x);}//读一个字节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(4);}return(dat);}//写一个字节WriteOneChar(unsigned char dat) {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0,t1;float tt=0;unsigned char i;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay1(10);Init_DS18B20(); //调用复位函数WriteOneChar(0x55); //发送ROM匹配命令if(x1<1000){ET0=0;for(i=0;i<8;i++){WriteOneChar(SN[0][i]); //发送64位序列号}ET0=1;} else if(1000<=x1<2000){ET0=0;for(i=0;i<8;i++){WriteOneChar(SN[1][i]); //发送64位序列号}ET0=1;}if(x1>=2000) x1=0;WriteOneChar(0xBE);ET0=0;a=ReadOneChar();b=ReadOneChar();ET0=1;t=b;t<<=8;t=t|a;t1=t&0xf800;if(t1!=0) {t=~t+1; ttt=1;}tt=t*0.0625; //温度的高位与低位合并12位t= tt*10; //结果温度return(t);}//定时器T0中断函数,每中断1次,显示1位数码管void Time_disp(void) interrupt 1{TH0=0xEE; //主频为11.0592,定时5ms的时间常数为EE00HTL0=0x00;x1++;sel=Select[x];if(x==1) {cod=a[shu[x]]&0x7f;} //判断是否小数点位,是,显示位加小数点else cod=a[shu[x]];x++;if(x==5) x=0;}/*void Set_DS18B20(uchar TH,uchar TL,uchar RS) //修改报警温度和温度转换精度{Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x4E); // //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器//先写TH,再写TL,最后写配置寄存器WriteOneChar(TH); //写入想设定的温度报警上限WriteOneChar(TL); //写入想设定的温度报警下限WriteOneChar(RS); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1//R1R0=00分辨率娄9位,R1R0=11分辨率为12位} *///*********************************//读18B20序列号//*********************************/*DS18B20_READ_SN(){unsigned char i;Init_DS18B20();WriteOneChar(0x33); // 跳过读序号列号的操作for(i=0;i<8;i++){SN[0][i]=ReadOneChar();}}*///***********************************//显示序列号,利用定时器延时5S循环显示//***********************************/*DS18B20_DIS_SN(){unsigned char i,j;for(i=0;i<8;i++){shu[0]=SN[0][i]%10;shu[1]=SN[0][i]%100/10;shu[2]=SN[0][i]/100;while(x1<1000){for(j=0;j<3;j++){sel=Select[j];cod=a[shu[j]];delay1(20);}}x1=0;}}*/main(){unsigned int p=0;x=0;x1=0;TMOD=0x01; //定时器T0按方式1工作EA=1;ET0=1;TH0=0xee; //5ms对应的时间常数TL0=0x00;TR0=1;//DS18B20_READ_SN(); //读18b20序列号while(1){//DS18B20_DIS_SN(); //显示18b20序列号p=ReadTemperature(); //读取当前温度shu[0]=p%10;//小数位shu[1]=(p/10)%10;//个位shu[2]=(p/100)%10;//十位shu[3]=(p/1000)%10;//百位if(ttt){shu[4]=16;ttt=0;} //符号位else shu[4]=17;}}。
DS18B20温度传感器C程序
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-Funsigned 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;码管,范围从0xF8到0x04,不用纠结这个,跟电路有关系,12个数码管得用2个138译码器。
温度传感器18B20驱动程序(C语言)
//1楼主:温度传感器18B20驱动程序(C语言)/*************************************************************18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*************************************************************/#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176,238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (uchar us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;dq = 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (uchar j){uchar i;for(i=0;i {*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ uchar CRC (uchar j){uchar i,crc_data=0;for(i=0;i crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}/*急什么?急着买吗?还是要程序?我给你提供一段吧!也是网友写的。
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)。
void init() { uint i; DQ=1; _nop_(); DQ=0; delay_us();//1 delay_us();//2 delay_us();//3 delay_us();//4
delay_us();//5 delay_us();//6 delay_us();//7 delay_us();//8 delay_us();//9 DQ=1; i=10; while((i--)&&(DQ==1)); i=10; while(i--); DQ=1; } /****************************************************** 字节写:write_byte 变量 x 用来产生 for 循环 在写的过程中,0 和一是分开写的 时序:0、15us、把数据植入、45us、1、重复前面、1 当进行写数据时 0 和 1 是分开写的;但是时序也要分开写; ******************************************************/ void write_byte(uchar date)//传递过来的参数是操作指令例如:0xcc,0x44;0xbe { uchar x; bit testb; for(x=0;x<8;x++) {
testb=date&0x01; //数据处理,它的作用是将数据的最低取出一直去完八位 date>>=1;//没去一次向左移动一次 if(testb) {
DQ=0; _nop_(); _nop_(); DQ=1; delay_us(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); DQ=1; delay_us(); } else { DQ=0;
write_byte(0xbe);//向 18b20 写入读取温度指令
a=read_byte(); //先读低八位
b=read_byte();//再读高八位
P0=b;
//程序标志!检测用
wendu=b;
wendu<<=8;
wendu=wendu|a;
f_num=wendu*0.0625; //读出的温度值乘以 18b20 的精度
这样才能把显示做出来
******************************************************/
uint wenduchange()
{
uchar a,b;
init(); // 初始化;必须要有的
delay_ms(1);
write_byte(0xcc);// 向 18b20 写入跳跃地址指令
// uchar bdata date; 原来是用来移动数据的 float f_num; //因为温度传感器的精度为 0.0625 所以设一个 float 行的变量
// sbit d=date^0; void delay_ms(uint ms) { uchar i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); }
_nop_();_nop_(); DQ=0; delay_us(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); DQ=1; } } DQ=1; } /****************************************************** 位读程序: 这样做的目的是为了把程序写的更有条理性 而且程序的类型是 bit 型的,因此返回值为 bit 型的 时序:0、15us、把数据置入、45us、1 ******************************************************/ bit read_bit() { bit bt; DQ=1; _nop_(); _nop_(); DQ=0; _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); DQ=1; _nop_();_nop_(); _nop_();_nop_(); bt=DQ; return bt; } /****************************************************** 字节读程序: 为了将上面的位读程序组合起来 变量:shuju 是用来将独处的数据存入 ******************************************************/ uchar read_byte() {
P2=0xf7; P0=duanma[datt************************************************ 主函数: 用来把所有的子程序汇集起来!! ******************************************************/ void main() { uint date; while(1) { start(); delay_ms(5); date=wenduchange(); display(date); } }
运用的并口显示方式 ******************************************************/
void display(uint datt) { P2=0xfd; P0=duanma[datt/100]; delay_ms(5); P2=0xff;
P2=0xfb; P0=duanma[datt/10%10]; delay_ms(5); P2=0xff;
uchar n,k,shuju; shuju=0; for(n=0;n<8;n++)
{
k=read_bit(); shuju=(k<<7)|(shuju>>1); //这是一个将位数据转换成字节数据,先接受的是低位
}
delay_us();
return shuju;
}
/******************************************************
启动温度转换:
在进行对传感器操作之前必须先写入初始化程序
先写入跳跃器件地址指令 0xcc
再写入启动温度转换指令 0x44
******************************************************/
void start()
{
init();
delay_ms(1);
write_byte(0xcc);
write_byte(0x44);//向 18b20 写入启动温度转换指令
}
/******************************************************
温度转换及处理程序:
他的做用是将温度值读出
因为读出 0 的数据是两个 char 型数据需要将它转换成一个 uint 型的
温度传感器 C 语言编程实例
#include <reg52.h> #include<intrins.h> //含有——nop_(); #include <stdio.h> //含有运算 #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7;//数据、时钟线 uchar duanma[]={0XFC,0X60,0XDA,0XF2,0X66,0XB6,0XBE,0XE0, 0XFE,0XF6}; uint wendu; //定义温度值存储位置
wendu=f_num*10+0.5;// 保留一位小数,加 0.5 为了四舍五入
f_num=f_num+0.5; // 在设定变量时一定注意 F_num 的类型为 float 型
return wendu;
}
/****************************************************** 显示程序:
void delay_us() //25us 延时 { _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); } /****************************************************** init()初始化复位程序 变量 i;还有—nop 是用来延时的 时序:1、2us、0、480us、等待确认;在延时 20us、1 ******************************************************/