ds1820是简易的温度传感器,简单易用,下面给我大家分享一下,ds18b20的简易程序
- #include<reg52.H> //单片机头文件
- GetTemp(); //声明引用外部函数
- externunsigned int idata Temperature; // 声明引用外部变量
- voiddelay(unsigned int i);
- sbit LS138A=P2^2; //管脚定义
- sbit LS138B=P2^3;
- sbit LS138C=P2^4;
- sbit EN573= P1^3;
- //此表为 LED 的字模, 共阴数码管 “01234567899 –”
- unsignedchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsignedlong LedOut[5],LedNumVal;
- voidsystem_Ini() //初始化定时器函数,定时一段时间后,重新读取温度值
- {
- TMOD= 0x11;
- TH1 = 0xD8; //10
- TL1 = 0xF0;
- IE = 0x8A;
- TR1 = 1;
- }
- main()
- {
- unsigned char i;
- EN573=0;
- system_Ini();
- while(1)
- {
- GetTemp(); //获取温度函数,这个函数再Temp.c 文件中,
- /********以下将读18b20的数据送到LED数码管显示*************/
- LedNumVal=Temperature; //把实际温度送到LedNumVal变量中
- LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
- LedOut[1]=Disp_Tab[LedNumVal%1000/100];
- LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[3]=Disp_Tab[LedNumVal%10]; //个位
-
- for(i=0; i<4; i++)
- {
- P0 = LedOut ;
-
- switch(i)
- { //138译码
- case 0:LS138A=0; LS138B=0;LS138C=0; break;
- case 1:LS138A=1; LS138B=0;LS138C=0; break;
- case 2:LS138A=0; LS138B=1;LS138C=0; break;
- case 3:LS138A=1; LS138B=1;LS138C=0; break;
- }
-
- delay(100);
- }
- P0 = 0;
-
- }
- }
- //延时程序
- voiddelay(unsigned int i)
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
- Temp.c文件
- /*************************此部分为18B20的驱动程序*********/
- #include <reg52.H>
- #include <intrins.h>
- sbit D18B20=P1^7;
- #define NOP() _nop_() /* 定义空指令 */
- #define _Nop() _nop_() /*定义空指令*/
- void TempDelay (unsigned int idata us);
- void Init18b20 (void); //18B20初始化复位
- void WriteByte (unsigned char idatawr); //单字节写入函数
- void read_bytes (unsigned char idata j); // 读出一单字节函数
- unsigned char CRC (unsigned char j); // CRC 校验函数
- void GemTemp (void);
- void Config18b20 (void); //配置18B20函数
- void ReadID (void); //读取器件序列号函数
- void TemperatuerResult(void); //读取温度函数
- bit flag;
- unsigned int idata Temperature;
- unsigned char idata temp_buff[9]; //存储读取的字节,readscratchpad为9字节,readrom ID为8字节
- unsigned char idata id_buff[8]; //定义器件ID值变量
- unsigned char idata *p,TIM;
- unsigned char idata crc_data;
- unsigned char 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}; //CRC校验查询表
- /************************************************************
- *Function:延时处理
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidTempDelay (unsigned int idata us)
- {
- while(us--);
- }
- /************************************************************
- *Function:18B20初始化
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidInit18b20 (void)
- {
- D18B20=1;
- _nop_();
- D18B20=0;
- TempDelay(530); //delay 530 uS
- _nop_();
- D18B20=1;
- TempDelay(100); //
- _nop_();
- _nop_();
- _nop_();
-
- if(D18B20==0)
- flag = 1; //DS18B20响应,初始化完成
- else
- flag = 0; //DS18B20初始化失败
- TempDelay(200);
- _nop_();
- _nop_();
- D18B20= 1;
- }
- /************************************************************
- *Function:向18B20写入一个字节
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidWriteByte (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;
- }
- }
- /************************************************************
- *Function:读18B20的一个字节
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsignedchar 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);
- }
- /************************************************************
- *Function:读18B20多个字节,读取j 个字节
- *parameter: j
- *Return:
- *Modify:
- *************************************************************/
- voidread_bytes (unsigned char idata j)
- {
- unsigned char idata i;
- for(i=0;i<j;i++)
- {
- *p = ReadByte();
- p++;
- }
- }
- /************************************************************
- *Function:CRC校验
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsignedchar CRC (unsigned char j)
- {
- unsignedchar idata i,crc_data=0;
- for(i=0;i<j;i++) //查表校验
- crc_data= CrcTable[crc_data^temp_buff];
- return (crc_data);
- }
- /************************************************************
- *Function:读取温度
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidGemTemp (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:
- *************************************************************/
- voidConfig18b20 (void) //重新配置报警限定值和分辨率
- {
- Init18b20(); //复位18B20
- WriteByte(0xcc); //skiprom 如果总线上只有一个18B20,就可使用此命令,
- WriteByte(0x4e); //0x4e 这个指令时接下来向DS18B20写三个字节数据,分别是:
- //写暂存器第2、3和4字节的数据(即TH,TL和配置寄存器)
- WriteByte(0x19); //上限
- WriteByte(0x1a); //下限
- WriteByte(0x7f); //set 12bit (0.125) 转换精度
- Init18b20();
- WriteByte(0xcc); //skiprom
- WriteByte(0x48); //保存设定值,将暂存器中的TH,TL和配置字节
- //复制到EPPROM中
- Init18b20();
- WriteByte(0xcc); //skip rom
- WriteByte(0xb8); //回调设定值,将TH,TL和配置字节从EPPROM读回至暂存器中
- }
- /************************************************************
- *Function:读18B20ID
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidReadID (void)//读取器件id
- {
- Init18b20();
- WriteByte(0x33); //read rom 指令
- read_bytes(8); //读取器件ID指令
- }
- /************************************************************
- *Function:读取18B20温度值
- 说明一下:我们再例程里只读取温度值,其他功能暂时不演示,其他功能只需要添加就可以
- 现在我们将其他代码屏蔽掉,如果需要恢复相应功能即可。
- *************************************************************/
- voidTemperatuerResult(void)
- {
- // p = id_buff;
- // ReadID();
- Config18b20();
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- //WriteByte(0x44); //Temperature convert
- TempDelay(7000) ;
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- WriteByte(0xbe); //read Temperature
- p = temp_buff;
- GemTemp();
- }
- voidGetTemp() //
- {
- if(TIM==100) //每隔 1000ms读取温度
- { TIM=0;
- TemperatuerResult();
- }
- }
- /*************************************
- [t1 (10ms)中断]中断,初始化函数在TemMain.c文件中
- *************************************/
- voidT1zd(void) interrupt 3
- {
- TH1 = 0xD8; //10
- TL1 = 0xF0;
- TIM++;
- }
复制代码
|