[Cortex-M0技术交流] 第五批 学习笔记第三篇——18B20温度报警

[复制链接]
 楼主| xiaoweixu 发表于 2012-3-3 20:07 | 显示全部楼层 |阅读模式
发个18B20测温的程序,程序早都写好了,就是一直没时间发,18B20温度传感器的文档大叔的资料里有,而且有例程,我只是根据自己的硬件改了一下。温度值是通过12864液晶显示出来的。加入了报警功能,当温度超出按键设定的温度值之后会蜂鸣报警,当温度再次降低到报警之下时停止报警。
先上图


工程在这里
下面贴出代码

  1. 主函数
  2. #include <stdio.h>
  3. #include "NUC1xx.h"
  4. #include "DrvADC.h"
  5. #include "DrvGPIO.h"
  6. #include "DrvUART.h"
  7. #include "DrvSYS.h"
  8. #include "ds18b20.h"
  9. unsigned char DS18B20_ID[8]={0,0,0,0,0,0,0,0,};
  10. unsigned char NOW_TEMP[6]={0};
  11. void bee (void)
  12. {
  13. int i=100;
  14. for(i=100;i>0;i--)
  15. {

  16. DrvGPIO_SetBit(E_GPB, 10);
  17. DrvSYS_Delay(500);
  18. DrvGPIO_ClrBit(E_GPB, 10);
  19. DrvSYS_Delay(500);  
  20. }
  21. }
  22. int main (void)
  23. {
  24. unsigned int temp=0;
  25. unsigned int temp_H=0;
  26. unsigned int temp_L=0;
  27. unsigned char i=0;
  28. unsigned int bv=30;
  29. unsigned char   flag    ;
  30. UNLOCKREG();               //  芯片注册解锁
  31.     SYSCLK->PWRCON.XTL12M_EN = 1;           //  设定12M外部晶振
  32.     DrvSYS_Delay(5000);              //  等待时钟就绪
  33. LOCKREG();                //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  34. //---------------------------------------------------------     // 系统初始化
  35. DrvGPIO_Open(E_GPA, 9, E_IO_OUTPUT);
  36. DrvGPIO_Open(E_GPA, 8, E_IO_OUTPUT);      
  37. DrvGPIO_Open(E_GPA, 7, E_IO_OUTPUT);         
  38. DrvGPIO_Open(E_GPA, 6, E_IO_OUTPUT);        
  39. DrvGPIO_Open(E_GPA, 5, E_IO_OUTPUT);
  40. DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);         //  设置GPB10端口为输出模式
  41. DrvGPIO_Open(E_GPA, 9, E_IO_OUTPUT);
  42.   DrvSYS_Delay(6000);
  43. DrvGPIO_Open( E_GPB, 14, E_IO_INPUT );   //按键端口设置为输入
  44.     DrvGPIO_Open( E_GPB, 15, E_IO_INPUT );
  45. DrvGPIO_ClrBit(E_GPB, 10);  
  46. DrvSYS_Delay(6000);
  47. LCMInit();
  48. Chn_disp_char("现在温度",1,1)   ;
  49. Chn_disp_char("报警设定值",2,1)   ;
  50. while(1)
  51.   {
  52.    temp  = readTempDS18B20();
  53.    temp_H  = temp/100;
  54.    temp_L  =   temp%100;
  55.             Digtal_disp(temp_H,1,5);
  56.     WriteLCM(1,0x2e) ;
  57.    Digtal_disp(temp_L,1,0);
  58.     Chn_disp_char("度",1,7)    ;
  59.      Digtal_disp(bv,2,6);
  60.     if(temp_H>=bv)
  61.     bee();
  62.    
  63. if (DrvGPIO_GetBit(E_GPB,14) == 0)     // 键按下检测
  64.   {
  65.   bv++;
  66.   DrvGPIO_SetBit(E_GPB, 10);
  67.   DrvSYS_Delay(100);
  68.   DrvGPIO_ClrBit(E_GPB, 10);
  69.   }
  70.   
  71. if (DrvGPIO_GetBit(E_GPB,15) == 0)     // 键按下检测
  72.   {
  73.   bv--;
  74.   DrvGPIO_SetBit(E_GPB, 10);
  75.   DrvSYS_Delay(100);
  76.   DrvGPIO_ClrBit(E_GPB, 10);
  77.   DrvSYS_Delay(60000);
  78.    }
  79.     DrvSYS_Delay(60000);
  80.   }
  81. }


18B20.c

  1. /***************************************************/
  2. /*     烈火狂龙   论坛ID:plc_avr   QQ:16053729    */
  3. /*     移值于其它MCU时,注意修改端口和延时函数    */
  4. /*     2011、03、30           */
  5. /*-------------------------------------------------*/
  6. #include "ds18b20.h"
  7. unsigned char DS18B20_sign_flag=0;
  8. /**********************************************************************
  9. 延时
  10. **********************************************************************/
  11. void delay_nus(unsigned int t)
  12. {
  13. unsigned int i=0;
  14. while(t--)
  15.    {
  16.     for(i=0;i<1;i++);
  17.     }
  18. }
  19. /**********************************************************************
  20. functionName: unsigned char resetDS18B20(void)
  21. description :DS18B20初始化
  22. **********************************************************************/
  23. unsigned char resetDS18B20(void)
  24. {
  25.     unsigned char errTime=0;
  26.     HLD_DS18B20;     //控制总线
  27.     CLR_DS18B20;     //强制拉低      
  28.     delay_nus(260);        //以上延时大于480us
  29.     SET_DS18B20;
  30.     RLS_DS18B20;     //释放总线,总线自动上拉 DDR
  31.     delay_nus(7);          //15~60us
  32.     while (STU_DS18B20)
  33.     {
  34.         delay_nus(3);    //5.15us
  35.         errTime++;
  36.         if (errTime>20)
  37.             return(0x00);  //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
  38.     }
  39.     errTime=0;
  40.     while (!(STU_DS18B20))
  41.     {
  42.         delay_nus(3);    //5.15us
  43.         errTime++;
  44.         if (errTime>50)
  45.             return(0x00);  //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
  46.     }
  47.     HLD_DS18B20;     //控制总线
  48.     SET_DS18B20;     //强制拉高
  49.     return(0xff);
  50. }
  51. /**********************************************************************
  52. functionName: unsigned char readByteDS18B20(void)
  53. description :读DS18B20一个字节
  54. **********************************************************************/
  55. unsigned char readByteDS18B20(void)
  56. {
  57.     unsigned char i;
  58.     unsigned char retVal=0;
  59.     //RLS_DS18B20;     //释放总线
  60.     for (i=8;i>0;i--)
  61.     {
  62.         retVal>>=1;
  63.         HLD_DS18B20;    //控制总线
  64.         CLR_DS18B20;    //强制拉低
  65.         delay_nus(1);    //延时大于1us
  66.         SET_DS18B20;    //释放总线,DS18B20会将总线强制拉低
  67.         RLS_DS18B20;    //释放总线
  68.         delay_nus(1);
  69.         if (STU_DS18B20)
  70.             retVal|=0x80;
  71.         delay_nus(15);   //31us
  72.     }
  73.     HLD_DS18B20;     //控制总线
  74.     SET_DS18B20;     //强制拉高
  75.     return(retVal);
  76. }
  77. /**********************************************************************
  78. functionName: unsigned char readByteDS18B20(void)
  79. description :写DS18B20一个字节
  80. **********************************************************************/
  81. void writeByteDS18B20(unsigned char wb)
  82. {
  83.     unsigned char i;
  84.     unsigned char temp;
  85.     //RLS_DS18B20;         //释放总线
  86.     for (i=0;i<8;i++)
  87.     {
  88.         HLD_DS18B20;  //控制总线
  89.         CLR_DS18B20;  //强制拉低
  90.         delay_nus(1);   //14.92us
  91.         temp=wb>>i;
  92.         if (temp&=0x01)
  93.             SET_DS18B20;    //释放总线
  94.         else
  95.             CLR_DS18B20; //强制拉低
  96.         delay_nus(15);     //30.38us
  97.         SET_DS18B20;  //释放总线
  98.         delay_nus(1);   //2.71us(大于1us就行了)
  99.     }
  100. }
  101. /**********************************************************************
  102. functionName: get_rom(unsigned char* p)
  103. description :读ROM
  104. **********************************************************************/
  105. void get_rom(unsigned char* p)
  106. {
  107.     unsigned char i;
  108.     if (resetDS18B20()==0xff)
  109.     {
  110.         writeByteDS18B20(ds18b20_read_rom);
  111.         for (i=0;i<8;i++)
  112.         {
  113.             *p++ = readByteDS18B20();
  114.         }
  115.     }
  116. }
  117. /**********************************************************************
  118. functionName: void set_ds18b20(char th,char tl,unsigned char config)
  119. description :设定DS18B20模式
  120. **********************************************************************/
  121. void set_ds18b20(char th,char tl,unsigned char config)
  122. {
  123.     if (resetDS18B20()==0xff)
  124.     {
  125.         writeByteDS18B20(ds18b20_skip_rom);
  126.         writeByteDS18B20(ds18b20_write_ram);
  127.         writeByteDS18B20(th);
  128.         writeByteDS18B20(tl);
  129.         writeByteDS18B20(config);
  130.     }
  131. }
  132. /**********************************************************************
  133. functionName: convert_ds18b20(void)
  134. description :写DS18B20一个字节
  135. **********************************************************************/
  136. void convert_ds18b20(void)
  137. {
  138.     if (resetDS18B20()==0xff)
  139.     {
  140.         writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
  141.         writeByteDS18B20(ds18b20_convert_tem); //启动温度转换
  142.     }
  143. }
  144. /**********************************************************************
  145. functionName: unsigned int readTempDS18B20(void)
  146. description :读DS18B20温度   有正负符号标志和两个小数点精度
  147. **********************************************************************/
  148. unsigned int readTempDS18B20(void)
  149. {
  150.     unsigned char tempL,tempH,wm0,wm2;
  151.     unsigned int x;
  152.     if (resetDS18B20()==0)
  153.         return 0;
  154.     writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
  155.     writeByteDS18B20(ds18b20_read_ram); //读数据
  156.     tempL=readByteDS18B20();
  157.     tempH=readByteDS18B20();
  158.     wm0=tempL;
  159.     wm0=wm0>>4;
  160.     tempH=tempH<<4;
  161.     wm2=wm0+tempH; //温度的整数值
  162.     if (wm2&0x80)  //测试符号位
  163.     {
  164.         DS18B20_sign_flag=1;
  165.         wm2=256-wm2;
  166.     }
  167.     else
  168.         DS18B20_sign_flag=0;
  169.     x = wm2*100;   //字符型赋给整形,扩大100倍
  170.     if (tempL&0x08) //提高测试精度
  171.     {
  172.         x=x+50;
  173.     }
  174.     if (tempL&0x04)
  175.     {
  176.         x=x+25;
  177.     }
  178.     if (tempL&0x02)
  179.     {
  180.         x=x+12;
  181.     }
  182.     if (tempL&0x01)
  183.     {
  184.         x=x+6;
  185.     }
  186.     convert_ds18b20();//启动温度转换
  187.     return(x);
  188. }


18B20.h

  1. #ifndef __DS18B20__H
  2. #define __DS18B20__H
  3. #include "NUC1xx.h"
  4. #include "DrvGPIO.h"
  5. #define CLR_DS18B20     DrvGPIO_ClrBit(E_GPB, 4)             //数据线强制拉低
  6. #define SET_DS18B20     DrvGPIO_SetBit(E_GPB, 4)             //数据线强制拉高,上拉
  7. #define HLD_DS18B20     DrvGPIO_Open(E_GPB, 4, E_IO_OUTPUT)  //M0控制总线
  8. #define RLS_DS18B20     DrvGPIO_Open(E_GPB, 4, E_IO_QUASI)   //释放总线
  9. #define STU_DS18B20     DrvGPIO_GetBit(E_GPB, 4)             //数据线的状态
  10. #define ds18b20_read_rom           0x33
  11. #define ds18b20_match_rom          0x55
  12. #define ds18b20_skip_rom           0xcc
  13. #define ds18b20_search_rom         0xf0
  14. #define ds18b20_alarm_search_rom   0xec
  15. #define ds18b20_write_ram          0x4e
  16. #define ds18b20_read_ram           0xbe
  17. #define ds18b20_copy_ram           0x48
  18. #define ds18b20_convert_tem        0x44
  19. #define ds18b20_eecall_eeprom      0xb8
  20. #define ds18b20_read_power_supply  0xb4
  21. extern unsigned char DS18B20_sign_flag;
  22. void delay_nus(unsigned int t);
  23. unsigned char resetDS18B20(void);
  24. void get_rom(unsigned char* p);
  25. void set_ds18b20(char th,char tl,unsigned char config);
  26. void convert_ds18b20(void);
  27. unsigned int readTempDS18B20(void);
  28. #endif



  1. /////////////////////////////////////////////////////////////////////////////////////////////
  2. //LCM显示程序
  3. //2011.12.30 by xiaowei
  4. /////////////////////////////////////////////////////////////////////////////////////////////
  5. #include <stdio.h>
  6. #include "NUC1xx.h"
  7. #include "DrvGPIO.h"
  8. #include "DrvSYS.h"
  9. #include "lcm.h"
  10. void WriteLCM(int32_t data_comm,int32_t in_com)   //1 for data,0 for comm
  11. {  
  12.    int32_t com,i,j,std;
  13.        DrvSYS_Delay(100);
  14.    com = in_com;
  15.      DrvGPIO_SetBit( E_GPA,8 );  //LCD_CS = 1;
  16.     DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  17.        DrvGPIO_SetBit(E_GPA,7);//LCD_STD = 1;
  18.    for(i=5;i>0;i--)
  19.    {
  20.      DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  21.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;   
  22.    }
  23.      DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
  24.       DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  25.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  26.    if(data_comm==1)
  27.     DrvGPIO_SetBit(E_GPA,7);//LCD_STD = 1;
  28.    else
  29.        DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
  30.       DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  31.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  32.          DrvGPIO_ClrBit(E_GPA,7);//LCD_STD = 0;
  33.    DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  34.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  35.   
  36. for(j=2;j>0;j--)
  37. {
  38.   for(i=4;i>0;i--)
  39.   {
  40.    
  41.    std=com&0x80;
  42.    if(std==0x80)
  43.     DrvGPIO_SetBit(E_GPA,7);   //LCD_STD = 1;
  44.    else
  45.     DrvGPIO_ClrBit(E_GPA,7);   //LCD_STD = 0;
  46.     com=com<<1;
  47.    DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  48.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  49.   }
  50.   DrvGPIO_ClrBit(E_GPA,7);   //LCD_STD = 0;
  51.   for(i=4;i>0;i--)
  52.   {
  53.    DrvGPIO_SetBit( E_GPA,6); //LCD_EN = 1;
  54.    DrvGPIO_ClrBit( E_GPA,6); //LCD_EN = 0;
  55.   }
  56. }
  57. }
  58. ////////////////////////////////////////////////////////////////////////////////
  59. void LCMInit(void)  //LCM初始化
  60. {
  61. DrvGPIO_ClrBit(E_GPA,5 );
  62.     DrvSYS_Delay(6000);
  63.   DrvGPIO_SetBit(E_GPA,5 );  
  64.     WriteLCM(0,0x30) ;    //设接口数据位数(DL),显示行数(L),及字型(F)
  65.     DrvSYS_Delay(6000);
  66. WriteLCM(0,0x01) ;   //清屏指令
  67.     DrvSYS_Delay(6000);
  68. WriteLCM(0,0x0c) ;    //设整体显示开关(D),光标开关关(C),及光标位的字符不闪耀(B)
  69.     DrvSYS_Delay(6000);
  70. WriteLCM(0,0x06) ;    //7设光标移动方向并指定整体显示是否移动
  71.     DrvSYS_Delay(6000);
  72. WriteLCM(0,0x01) ;  //清屏指令
  73.     DrvSYS_Delay(6000);  
  74. WriteLCM(0,0x80) ;  //设DDRAM地址,设置后DDRAM数据被发送和接收
  75. }
  76. /////////////////////////////////////////////////////////////////////////
  77. //写汉字
  78. //输入char[]={"显示的字"},行数,列数    显示数字时,如果列数为0,则接着显示
  79. void Chn_disp_char( char *chn, int32_t line_pos, int32_t dis_pos)
  80. {
  81. char i=0,Start_pos;
  82. WriteLCM (comm_flag,0x30);
  83. switch(line_pos)
  84. {
  85.   case 1:
  86.    Start_pos=FirstLine_Start;
  87.    break;
  88.   case 2:
  89.    Start_pos=SecondLine_Start;
  90.    break;  
  91.   case 3:
  92.    Start_pos=ThirdLine_Start;
  93.    break;
  94.   case 4:
  95.    Start_pos=FourthLine_Start;
  96.    break;
  97. }
  98. if(dis_pos!=0)
  99.   WriteLCM (comm_flag,(Start_pos+dis_pos-1));
  100.     while(chn[i]!='\0')
  101.     {
  102.      WriteLCM (data_flag,chn[i]);
  103.      i++;
  104. }
  105. }
  106. ////////////////////////////////////////////////////////
  107. //写数字
  108. //输入 (数字,行数,列数)
  109. void Digtal_disp( int32_t digt, int32_t line_pos, int32_t dis_pos)
  110. {
  111. char digt_ []={""};
  112. sprintf(digt_,"%.2d",digt);
  113. Chn_disp_char(digt_,line_pos,dis_pos);
  114. }
  115. /////////////////////////////////////////////////////////////////

lcm.h


  1. //用于TG12864
  2. //串口通信
  3. #include <stdio.h>
  4. #include "NUC1xx.h"
  5. #include "DrvGPIO.h"
  6. #include "DrvSYS.h"
  7. #define LCD_CS    E_GPA,8 ;
  8. #define LCD_STD    E_GPA,7 ;
  9. #define LCD_EN   E_GPA,6 ;
  10. #define LCD_RST   E_GPA,5 ;
  11. #define  FirstLine_Start  0x80
  12. #define  SecondLine_Start 0x90
  13. #define  ThirdLine_Start  0x88
  14. #define  FourthLine_Start 0x98
  15. #define  comm_flag  0
  16. #define  data_flag  1
  17. void WriteLCM(int32_t data_comm,int32_t in_com)    ;
  18. void LCMInit(void)         ;
  19. void Chn_disp_char( char *chn, int32_t line_pos, int32_t dis_pos) ;
  20. void Digtal_disp( int32_t digt, int32_t line_pos, int32_t dis_pos) ;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
王紫豪 发表于 2012-3-7 01:15 | 显示全部楼层
弄得不错,代码很整洁,支持一下~
老鱼探戈 发表于 2012-3-7 12:56 | 显示全部楼层
支持一下!
13301 发表于 2012-3-7 20:42 | 显示全部楼层
不赖嘛~~
plc_avr 发表于 2012-3-8 07:29 | 显示全部楼层
顶!楼主用心了。
ceflsh 发表于 2014-4-16 11:31 | 显示全部楼层
下来用一用,谢谢LZ。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

113

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部