[菜农助学交流] 【第四批】入门笔记第三帖—LCD +18b20

[复制链接]
3067|1
 楼主| zxcscm 发表于 2012-2-2 22:42 | 显示全部楼层 |阅读模式
说到DS18B20,开始玩单片机时接触的第一个外围器件就是它了,虽不能说精通其操作,但对其流程也早已了然于心了。既然助学板上有DS18B20,肯定要拿来把玩了。
不说太多废话,只说说俺在调试时遇到的困惑
I/O模拟单总线访问DS18B20,最关键的就是时序了。对于51单片机好办,因为知道指令的执行周期,所以可以用软件延时做到精确的控制,但在ARM上指令不再有固定的执行周期,也就无法估算软件延时的时间了。
俺先把一起自己用过的51程序移植过来,改了端口和延时,花了很长时间也没成功,
找来网友“烈火狂龙”的程序,移植过来仍然不行,很纳闷,又找来网友“lixiaoxu2meng”的程序,这次干脆直接拷贝,不做任何改动,下载后能读出温度了!
比较俺前后的程序,发现俺的程序操作流程和lixiaoxu2meng的几乎一模一样,可俺自个写的程序就是读不出温度,作为菜鸟,只能暂时作罢,纠结下去也没有意义。这次只是把以前学的整合一下。
若有精力一定要研究研究李老师是如何用uart操作ds18b20


言归正传,简单介绍下程序功能:开机LCD显示“菜农助学板 祝愿园地 越来越红火” 按下K1显示温度,按下K2显示18B20的内部ID,长按K1显示欢迎界面,长按K2显示“新春快乐”


ds18b20程序:

  1. /***************************************************/
  2. /*     参照lixiaoxu2meng\烈火狂龙的程序修改而成    */
  3. /*     移值于其它MCU时,注意修改端口和延时函数    */
  4. /*     2012.02.02-01(调试通过)               zxcscm*/
  5. /***************************************************/

  1. #include "ds1.h"
  2. //extern unsigned int value;
  3. unsigned int temp_value;
  4. extern unsigned char DS18B20_sign_flag=0;
  5. /*************************************************************************************
  6. ** Function name:       ds1820reset
  7. ** Descriptions:        DS18B20初始化
  8. ** input parameters:    none
  9. ** output parameters:   none
  10. ** Returned value:      none
  11. *************************************************************************************/
  12. void ds1820reset()
  13. {  
  14.     /*step1:首先主机产生RESET脉冲*/
  15.     DQ_OUTPUT;     //将DQ引脚设置为输出
  16.     CLR_DQ;      //DQ引脚输出低电平(即拉低至少为480us)
  17.     delay_ds18b20(300);   //精确延时  大于480us
  18.     SET_DQ;      //DQ引脚输出高电平(即释放数据线)
  19.    /*step2:等待15~60us后 DS18B20将把数据线拉低60~240us 以作为应答*/
  20.     DQ_INPUT;     //将DQ引脚设置为输入
  21.     while(DQ_STATE);    //如果没有应答也一直等待(注意在while里可加上超时处理 以免通信出错 而造成死机)
  22.     while(!DQ_STATE);   //应答后等待(注意在while里可加上超时处理 以免通信出错 而造成死机)
  23.     /*step3:释放数据线,并延时480us(因为等待与应答必须大于480us才算整个初始化完成)*/      
  24.     SET_DQ;      //DQ引脚输出高电平(即释放数据线)
  25.     delay_ds18b20(300);   //为了保证初始化完成 在延时480us   
  26. }   
  27. /*************************************************************************************
  28. ** Function name:       ds1820rd
  29. ** Descriptions:        DS18B20 读数据
  30. ** input parameters:    none
  31. ** output parameters:   none
  32. ** Returned value:      none
  33. *************************************************************************************/
  34. unsigned char ds1820rd()//读数据
  35. {
  36.     unsigned char i=0;
  37.     unsigned char dat = 0;
  38.     for (i=8;i>0;i--)
  39.     {
  40.         DQ_OUTPUT;//将DQ引脚设置为输出
  41.         CLR_DQ;//DQ引脚输出低电平(即拉低)
  42.         delay_ds18b20(2);
  43.         dat>>=1;
  44.         SET_DQ;//DQ引脚输出高电平
  45.         DQ_INPUT;//将DQ引脚设置为输入   
  46.         delay_ds18b20(2);
  47.         if(DQ_STATE)
  48.         dat|=0x80;
  49.         delay_ds18b20(40);//大于60us
  50.     }
  51.     DQ_OUTPUT;     
  52.     SET_DQ; //放数据线
  53.     return(dat);
  54. }
  55. /*************************************************************************************
  56. ** Function name:       ds1820rd
  57. ** Descriptions:        DS18B20 写数据
  58. ** input parameters:    none
  59. ** output parameters:   none
  60. ** Returned value:      none
  61. *************************************************************************************/
  62. void ds1820wr(unsigned char wdata)//写数据
  63. {
  64.     unsigned char i=0;
  65.     for (i=8; i>0; i--)
  66.     {
  67.         DQ_OUTPUT;    //将DQ引脚设置为输出
  68.         CLR_DQ;    //DQ引脚输出低电平(小于15us )
  69.         delay_ds18b20(2);  //延时小于15us
  70.         if(wdata&0x01) SET_DQ; //DQ引脚输出高电平
  71.         else  CLR_DQ;   //DQ引脚输出低电平     
  72.         delay_ds18b20(40);  //延时大于60us
  73.         SET_DQ;    //DQ引脚输出高电平
  74.         wdata>>=1;
  75.     }
  76. }
  77. extern void GetRom_DS18B20(unsigned char *p)
  78. {
  79.     unsigned char i;
  80.     ds1820reset();
  81.     //if(Reset_DS18B20()==0xff)
  82.     {
  83.         ds1820wr(0x33);
  84.         for(i=8;i>0;i--)
  85.         {
  86.             *p++=ds1820rd(); //由低位到高位读
  87.         }
  88.     }
  89. }
  90. /*extern void ReadRom_DS18B20(unsigned char rom[8])
  91. {
  92. unsigned char i;
  93. if(Reset_DS18B20()==0xff)
  94.     {
  95.         WriteByte_DS18B20(ds18b20_ReadRom);
  96.         for(i=8;i>0;i--)
  97.         {
  98.             rom[i-1]=ReadByte_DS18B20();
  99.         }
  100.     }
  101. }
  102. ************************************************************************************
  103. ** Function name:       read_temp
  104. ** Descriptions:       读取温度值并将读到的温度进行处理
  105. ** input parameters:    none
  106. ** output parameters:   none
  107. ** Returned value:      none
  108. *************************************************************************************/
  109. extern unsigned int read_temp()//读取温度值并转换
  110. {
  111.     unsigned char a,b;
  112.     temp_value = 0;
  113.     ds1820reset();   
  114.     ds1820wr(0xcc);//跳过读序列号
  115.     ds1820wr(0x44);//启动温度转换
  116.     ds1820reset();   
  117.     ds1820wr(0xcc);//跳过读序列号
  118.     ds1820wr(0xbe);//读取温度
  119.     a=ds1820rd();
  120.     b=ds1820rd();
  121.     temp_value=b;
  122.     temp_value<<=8;
  123.     temp_value=temp_value|a;
  124.     if(temp_value<0x0fff)   //如果为正数
  125.     DS18B20_sign_flag=0;
  126.     else                 //如果为负数
  127.     {
  128.         temp_value=~temp_value+1;
  129.      DS18B20_sign_flag=1;
  130.     }
  131.     temp_value=temp_value*(0.625);//温度值扩大10倍,精确到1位小数
  132.     return(temp_value);
  133. }
  134. /*************************************************************************************
  135. ** Function name:       delay_ms
  136. ** Descriptions:        1ms(晶振为12MHZ)延时子程序
  137. ** input parameters:    count
  138. ** output parameters:   无
  139. ** Returned value:      无
  140. *************************************************************************************/
  141. void delay_ms(unsigned int count)
  142. {
  143.     unsigned int i,j;
  144. for(i=count;i>0;i--)
  145.     for(j=2395;j>0;j--);
  146. }
  147. /*************************************************************************************
  148. ** Function name:       delay_ms
  149. ** Descriptions:        大约40us(晶振为12MHZ)延时子程序
  150. ** input parameters:    count
  151. ** output parameters:   无
  152. ** Returned value:      无
  153. *************************************************************************************/
  154. void delay_ds18b20(unsigned int count)
  155. {
  156.     unsigned int i,j;
  157. for(i=count;i>0;i--)
  158.    for(j=2;j>0;j--);
  159. }



其他程序感兴趣的请见工程包


开机画面:



按下K1显示温度:

按下K2显示ID:



长按K2:









本帖子中包含更多资源

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

×
yulri 发表于 2012-2-9 10:58 | 显示全部楼层
好东西!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

628

帖子

1

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