标题: 51单片机读取ds18b20数码管显示 [打印本页]

作者: 永远的lgz    时间: 2018-1-7 20:45
标题: 51单片机读取ds18b20数码管显示
ds1820是简易的温度传感器,简单易用,下面给我大家分享一下,ds18b20的简易程序

  1. #include<reg52.H>                                 //单片机头文件
  2. GetTemp();                                                                   //声明引用外部函数
  3. externunsigned int  idata Temperature;                   // 声明引用外部变量
  4. voiddelay(unsigned int i);
  5. sbit    LS138A=P2^2;       //管脚定义
  6. sbit    LS138B=P2^3;
  7. sbit    LS138C=P2^4;
  8. sbit    EN573= P1^3;
  9. //此表为 LED 的字模, 共阴数码管 “01234567899 –”
  10. unsignedchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  11. unsignedlong  LedOut[5],LedNumVal;
  12. voidsystem_Ini()                //初始化定时器函数,定时一段时间后,重新读取温度值
  13. {
  14.     TMOD= 0x11;
  15.     TH1 = 0xD8;    //10
  16.     TL1 = 0xF0;   
  17.        IE = 0x8A;     
  18.     TR1 = 1;
  19. }
  20. main()
  21. {
  22.        unsigned char i;
  23.        EN573=0;
  24.        system_Ini();
  25.     while(1)
  26.    {      
  27.         GetTemp();             //获取温度函数,这个函数再Temp.c 文件中,
  28.        /********以下将读18b20的数据送到LED数码管显示*************/
  29.        LedNumVal=Temperature;      //把实际温度送到LedNumVal变量中
  30.         LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
  31.       LedOut[1]=Disp_Tab[LedNumVal%1000/100];
  32.       LedOut[2]=Disp_Tab[LedNumVal%100/10];   //十位
  33.       LedOut[3]=Disp_Tab[LedNumVal%10];    //个位
  34.         
  35.     for(i=0; i<4; i++)
  36.          {         
  37.                P0 = LedOut ;
  38.                                              
  39.               switch(i)                              
  40.          {                 //138译码
  41.                      case 0:LS138A=0; LS138B=0;LS138C=0; break;         
  42.             case 1:LS138A=1; LS138B=0;LS138C=0; break;                 
  43.             case 2:LS138A=0; LS138B=1;LS138C=0; break;
  44.             case 3:LS138A=1; LS138B=1;LS138C=0; break;
  45.          }
  46.                
  47.               delay(100);
  48.          }
  49.         P0 = 0;  
  50.   
  51.     }
  52. }
  53. //延时程序
  54. voiddelay(unsigned int i)
  55. {
  56.     char j;
  57.     for(i; i > 0; i--)
  58.         for(j = 200; j > 0; j--);
  59. }
  60. Temp.c文件
  61. /*************************此部分为18B20的驱动程序*********/
  62. #include <reg52.H>        
  63. #include <intrins.h>
  64. sbit   D18B20=P1^7;
  65. #define NOP()   _nop_()   /* 定义空指令 */
  66. #define _Nop()  _nop_()   /*定义空指令*/
  67. void TempDelay (unsigned int idata us);
  68. void Init18b20 (void);                  //18B20初始化复位
  69. void WriteByte (unsigned char idatawr);  //单字节写入函数
  70. void read_bytes (unsigned char idata j);   // 读出一单字节函数
  71. unsigned char CRC (unsigned char j);    // CRC 校验函数
  72. void GemTemp (void);
  73. void Config18b20 (void);             //配置18B20函数
  74. void ReadID (void);                 //读取器件序列号函数
  75. void TemperatuerResult(void);         //读取温度函数
  76. bit flag;
  77. unsigned int  idata Temperature;
  78. unsigned char idata temp_buff[9]; //存储读取的字节,readscratchpad为9字节,readrom ID为8字节
  79. unsigned char idata id_buff[8];   //定义器件ID值变量
  80. unsigned char idata *p,TIM;
  81. unsigned char idata crc_data;
  82. unsigned char code CrcTable [256]={
  83. 0, 94, 188,  226,  97, 63,  221,  131, 194,  156,  126, 32,  163,  253, 31,  65,
  84. 157, 195,  33,  127, 252,  162,  64, 30,  95,  1, 227,  189,  62, 96,  130,  220,
  85. 35, 125,  159,  193, 66,  28,  254, 160,  225,  191, 93,  3,  128, 222,  60,  98,
  86. 190, 224,  2,  92, 223,  129,  99, 61,  124,  34, 192,  158,  29, 67,  161,  255,
  87. 70, 24,  250,  164, 39,  121,  155, 197,  132,  218, 56,  102,  229, 187,  89,  7,
  88. 219, 133, 103,  57,  186, 228,  6,  88, 25,  71,  165, 251,  120,  38, 196,  154,
  89. 101, 59, 217,  135,  4, 90,  184,  230, 167,  249,  27, 69,  198,  152, 122,  36,
  90. 248, 166, 68,  26,  153, 199,  37,  123, 58,  100,  134, 216,  91,  5, 231,  185,
  91. 140, 210, 48,  110,  237, 179,  81,  15, 78,  16,  242, 172,  47,  113, 147,  205,
  92. 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校验查询表
  93. /************************************************************
  94. *Function:延时处理
  95. *parameter:
  96. *Return:
  97. *Modify:
  98. *************************************************************/
  99. voidTempDelay (unsigned int idata us)
  100. {
  101.        while(us--);
  102. }
  103. /************************************************************
  104. *Function:18B20初始化
  105. *parameter:
  106. *Return:
  107. *Modify:
  108. *************************************************************/
  109. voidInit18b20 (void)
  110. {
  111.        D18B20=1;
  112.        _nop_();
  113.        D18B20=0;
  114.        TempDelay(530);   //delay 530 uS
  115.        _nop_();
  116.        D18B20=1;
  117.        TempDelay(100);   //
  118.        _nop_();
  119.        _nop_();
  120.        _nop_();
  121.       
  122.        if(D18B20==0)
  123.               flag = 1;   //DS18B20响应,初始化完成
  124.        else
  125.               flag = 0;    //DS18B20初始化失败
  126.        TempDelay(200);      
  127.        _nop_();
  128.        _nop_();
  129.        D18B20= 1;
  130. }
  131. /************************************************************
  132. *Function:向18B20写入一个字节
  133. *parameter:
  134. *Return:
  135. *Modify:
  136. *************************************************************/
  137. voidWriteByte (unsigned char idata wr)  //单字节写入
  138. {
  139.        unsigned char idata i;
  140.        for (i=0;i<8;i++)
  141.        {
  142.               D18B20 = 0;
  143.               _nop_();
  144.               D18B20=wr&0x01;
  145.               TempDelay(3);   //delay 45 uS //5
  146.               _nop_();
  147.               _nop_();
  148.               D18B20=1;
  149.               wr >>= 1;
  150.        }
  151. }
  152. /************************************************************
  153. *Function:读18B20的一个字节
  154. *parameter:
  155. *Return:
  156. *Modify:
  157. *************************************************************/
  158. unsignedchar ReadByte (void)     //读取单字节
  159. {
  160.        unsigned char idata i,u=0;
  161.        for(i=0;i<8;i++)
  162.        {
  163.               D18B20 = 0;
  164.               u >>= 1;
  165.               D18B20 = 1;
  166.               if(D18B20==1)
  167.               u |= 0x80;
  168.               TempDelay (2);
  169.               _nop_();
  170.        }
  171.        return(u);
  172. }
  173. /************************************************************
  174. *Function:读18B20多个字节,读取j 个字节
  175. *parameter: j
  176. *Return:
  177. *Modify:
  178. *************************************************************/
  179. voidread_bytes (unsigned char idata j)
  180. {
  181.         unsigned char idata i;
  182.         for(i=0;i<j;i++)
  183.         {
  184.                *p = ReadByte();
  185.                p++;
  186.         }
  187. }
  188. /************************************************************
  189. *Function:CRC校验
  190. *parameter:
  191. *Return:
  192. *Modify:
  193. *************************************************************/
  194. unsignedchar CRC (unsigned char j)
  195. {
  196.      unsignedchar idata i,crc_data=0;
  197.       for(i=0;i<j;i++)  //查表校验
  198.            crc_data= CrcTable[crc_data^temp_buff];
  199.     return (crc_data);
  200. }
  201. /************************************************************
  202. *Function:读取温度
  203. *parameter:
  204. *Return:
  205. *Modify:
  206. *************************************************************/
  207. voidGemTemp (void)
  208. {
  209.    read_bytes (9);
  210.    if (CRC(9)==0) //校验正确
  211.    {
  212.           Temperature = temp_buff[1]*0x100 + temp_buff[0];
  213. //        Temperature *= 0.625;
  214.               Temperature /= 16;
  215.               TempDelay(1);
  216.     }
  217. }
  218. /************************************************************
  219. *Function:内部配置
  220. *parameter:
  221. *Return:
  222. *Modify:
  223. *************************************************************/
  224. voidConfig18b20 (void)  //重新配置报警限定值和分辨率
  225. {
  226.      Init18b20();      //复位18B20
  227.      WriteByte(0xcc);  //skiprom   如果总线上只有一个18B20,就可使用此命令,
  228.      WriteByte(0x4e);  //0x4e 这个指令时接下来向DS18B20写三个字节数据,分别是:
  229.                      //写暂存器第2、3和4字节的数据(即TH,TL和配置寄存器)
  230.      WriteByte(0x19);  //上限
  231.      WriteByte(0x1a);  //下限
  232.      WriteByte(0x7f);     //set 12bit (0.125) 转换精度
  233.      Init18b20();
  234.      WriteByte(0xcc);  //skiprom
  235.      WriteByte(0x48);  //保存设定值,将暂存器中的TH,TL和配置字节
  236. //复制到EPPROM中
  237.      Init18b20();
  238.      WriteByte(0xcc); //skip rom
  239.      WriteByte(0xb8); //回调设定值,将TH,TL和配置字节从EPPROM读回至暂存器中
  240. }
  241. /************************************************************
  242. *Function:读18B20ID
  243. *parameter:
  244. *Return:
  245. *Modify:
  246. *************************************************************/
  247. voidReadID (void)//读取器件id
  248. {
  249.        Init18b20();
  250.        WriteByte(0x33);  //read rom 指令
  251.        read_bytes(8);    //读取器件ID指令
  252. }
  253. /************************************************************
  254. *Function:读取18B20温度值
  255. 说明一下:我们再例程里只读取温度值,其他功能暂时不演示,其他功能只需要添加就可以
  256.   现在我们将其他代码屏蔽掉,如果需要恢复相应功能即可。
  257. *************************************************************/
  258. voidTemperatuerResult(void)
  259. {
  260. //   p = id_buff;
  261. //   ReadID();
  262.       Config18b20();
  263.        Init18b20 ();
  264.        WriteByte(0xcc);   //skip rom
  265.        //WriteByte(0x44);   //Temperature convert
  266.        TempDelay(7000)   ;
  267.        Init18b20 ();
  268.        WriteByte(0xcc);   //skip rom
  269.        WriteByte(0xbe);   //read Temperature
  270.        p = temp_buff;
  271.        GemTemp();
  272. }
  273. voidGetTemp()     //
  274. {      
  275.      if(TIM==100) //每隔 1000ms读取温度
  276.        { TIM=0;
  277.          TemperatuerResult();
  278.        }
  279. }
  280. /*************************************
  281. [t1 (10ms)中断]中断,初始化函数在TemMain.c文件中                                                                                                                                                                                                                                                                                          
  282. *************************************/
  283. voidT1zd(void) interrupt 3
  284. {
  285.    TH1 = 0xD8;    //10
  286.    TL1 = 0xF0;
  287.    TIM++;
  288. }

复制代码


作者: sadlucky1996    时间: 2018-6-11 14:44
谢谢楼主啊




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1