找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3435|回复: 0
收起左侧

89c51单片机+ds18b20实现温度检测及设定

[复制链接]
ID:224025 发表于 2017-8-2 15:23 | 显示全部楼层 |阅读模式
89c51+ds18b20实现温度检测及设定
文档中有原理图及程序。亲测可行
1.001.jpg
  • 显示电路
数码管采用共阳数码管
1.002.jpg     1.003.jpg

共阳数码管结构图                  数码管上对应的各段

例如:1的字形码为 0xf9;0为0xc0;
  • 按键电路

1.004.jpg             
矩阵式键盘的优缺点:在按键多时,占用的I/O少,但程序编写复杂。

独立式键盘的优缺点:占用的I/O多,但程序编写简单。
本次设计为独立键盘(所选单片机I/O足够用)
  • 温度检测电路
  • 数字式温度传感器DS18B20
1.005.jpg          1.006.jpg             1.007.jpg






程序(此程序只能做到左侧两个数码管显示设定温度,右侧两个数码管显示测量的温度,并没有实现温度的控制调节功能)


单片机源程序如下:
  1. #include      //52系列头文件
  2. #include   //特殊寄存器头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #include

  6. //--定义要使用的IO口--//

  7. #define GPIO_DIG   P0              //段选
  8. #define GPIO_PLACE P2              //位选
  9. sbit DSPORT=P3^7;
  10. unsigned char code DIG_PLACE[8] = {
  11. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
  12. unsigned char code DIG_CODE[17] = {
  13. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,
  14.   0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  15. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  16. unsigned char DisplayData[5];//用来存放要显示的8位数的值
  17. void Delay10ms(unsigned int c);   //延时10ms
  18. void Key_Scan();
  19. void DigDisplay();
  20. uchar Ds18b20Init();                           //初始化程序
  21. sbit key1=P3^4;                                                                                                                              //设定温度加
  22. sbit key2=P3^5;                                                                                                                              //设定温度减
  23. void Ds18b20WriteByte(uchar dat);                                                        //写一个字节
  24. uchar Ds18b20ReadByte();                                                                                    //读一个字节
  25. void  Ds18b20ChangTemp();                                                                                    //转换温度
  26. void  Ds18b20ReadTempCom();                                                                                    //发送读取温度命令
  27. int Ds18b20ReadTemp();                                                                                                  //读取温度命令
  28. int   sdtemp1=30;
  29. int  wendu;                                                                                                                                              //定义临时变量
  30. /********************主程序*****************************************8 */
  31. void main(void)
  32. {            
  33.               while (1)
  34.               {            
  35.                                           Key_Scan();
  36.                                           DigDisplay();
  37.                                           DisplayData[0]=DIG_CODE[sdtemp1/10];
  38.                       DisplayData[1]=DIG_CODE[sdtemp1%10];
  39.                                           wendu=Ds18b20ReadTemp();
  40.                                           wendu=wendu>>4;
  41.                                           DisplayData[2] = DIG_CODE[wendu%100/10];
  42.             DisplayData[3] = DIG_CODE[wendu % 10];


  43.             
  44.               }
  45. }                              

  46. /***************按键扫描程序*******************************************/
  47. void  Key_Scan()
  48. {
  49.     //--检测按键1--//
  50.               if (key1== 0)                            //检测按键K1是否按下
  51.               {
  52.                             Delay10ms(1);              //消除抖动
  53.                             if (key1== 0)              //再次检测按键是否按下               
  54.                             {  //DigDisplay();
  55.                                sdtemp1=sdtemp1+1;
  56.                                           if(sdtemp1>99)              sdtemp1=30;
  57.                             //              DigDisplay();
  58.                                           while (!key1 )              //检测按键是否松开
  59.                                           {//Delay10ms(20);
  60.                                           DigDisplay();
  61.                                          
  62.                                           }
  63.                                                                                     
  64.                             }
  65.               }

  66.                 if (key2== 0)                            //检测按键K1是否按下
  67.               {              DigDisplay();
  68.                             Delay10ms(1);              //消除抖动

  69.                             if (key2== 0)              //再次检测按键是否按下               
  70.                             {  DigDisplay();
  71.                                sdtemp1=sdtemp1-1;
  72.                                           if(sdtemp1<15)              sdtemp1=15;

  73.                                           while (!key2 )              //检测按键是否松开
  74.                                                         { //Delay10ms(2);
  75.                                           DigDisplay();
  76.                                          
  77.                                           }   
  78.                             }
  79.               }
  80. }
  81. /***************************************************
  82. 函数名                            :Delay
  83. 函数功能              :延时
  84. 输入                            :无
  85. 输出                            :无
  86. ***************************************************/
  87. void Delay10ms(unsigned int c)   //误差 0us
  88. {
  89.     unsigned char a, b;

  90.               //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  91.     for (;c>0;c--)
  92.               {
  93.                             for (b=38;b>0;b--)
  94.                             {
  95.                                           for (a=130;a>0;a--);
  96.                             }

  97.               }      
  98. }
  99. /*******************************************************************************
  100. * 函 数 名         : DigDisplay
  101. * 函数功能                               : 使用数码管显示
  102. * 输    入         : 无
  103. * 输    出         : 无
  104. *******************************************************************************/

  105. void DigDisplay()
  106. {
  107.               unsigned char i;
  108.               unsigned int j;

  109.             
  110.               for(i=0; i<4; i++)
  111.               {
  112.                             GPIO_PLACE = DIG_PLACE[i];              //发送位选
  113.                             GPIO_DIG = DisplayData[i];     //发送段码

  114.                   j = 80;                                                                                    //扫描间隔时间设定
  115.                             while(j--);            
  116.                             GPIO_DIG = 0xFF;//消隐
  117.               }

  118. }
  119. /*******************************************************************************
  120. * 函 数 名         : Ds18b20Init
  121. * 函数功能                               : 初始化
  122. * 输    入         : 无
  123. * 输    出         : 初始化成功返回1,失败返回0
  124. *******************************************************************************/

  125. uchar Ds18b20Init()
  126. {
  127.               uchar i;
  128.               DSPORT = 0;                                          //将总线拉低480us~960us
  129.               i = 70;            
  130.               while(i--);//延时642us
  131.               DSPORT = 1;                                          //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  132.               i = 0;
  133.               while(DSPORT)              //等待DS18B20拉低总线
  134.               {
  135. DigDisplay();
  136.               //              Delay1ms(1);
  137.                             i++;
  138.                             if(i>5)//等待>5MS
  139.                             {
  140.                                           return 0;//初始化失败
  141.                             }
  142.             
  143.               }
  144.               return 1;//初始化成功
  145. }
  146. /*******************************************************************************
  147. * 函 数 名         : Ds18b20WriteByte
  148. * 函数功能                               : 向18B20写入一个字节
  149. * 输    入         : com
  150. * 输    出         : 无
  151. *******************************************************************************/

  152. void Ds18b20WriteByte(uchar dat)
  153. {
  154.               uint i, j;

  155.               for(j=0; j<8; j++)
  156.               {
  157.                             DSPORT = 0;                                   //每写入一位数据之前先把总线拉低1us
  158.                             i++;
  159.                             DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
  160.                             i=6;
  161.                             while(i--); //延时68us,持续时间最少60us
  162.                             DSPORT = 1;              //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  163.                             dat >>= 1;
  164.               }
  165. }
  166. /*******************************************************************************
  167. * 函 数 名         : Ds18b20ReadByte
  168. * 函数功能                               : 读取一个字节
  169. * 输    入         : com
  170. * 输    出         : 无
  171. *******************************************************************************/


  172. uchar Ds18b20ReadByte()
  173. {
  174.               uchar byte, bi;
  175.               uint i, j;            
  176.               for(j=8; j>0; j--)
  177.               {
  178.                             DSPORT = 0;//先将总线拉低1us
  179.                             i++;
  180.                             DSPORT = 1;//然后释放总线
  181.                             i++;
  182.                             i++;//延时6us等待数据稳定
  183.                             bi = DSPORT;              //读取数据,从最低位开始读取
  184.                             /*将byte右移移一位,然后与上左移7位后的bi,注意移动之后移掉那位补0。*/
  185.                             byte = (byte >> 1) | (bi << 7);                                                                                    
  186.                             i = 4;                            //读取完之后等待48us再接着读取下一个数
  187.                             while(i--);
  188.               }                                                      
  189.               return byte;
  190. }
  191. /*******************************************************************************
  192. * 函 数 名         : Ds18b20ChangTemp
  193. * 函数功能                               : 让18b20开始转换温度
  194. * 输    入         : com
  195. * 输    出         : 无
  196. *******************************************************************************/

  197. void  Ds18b20ChangTemp()
  198. {
  199.               Ds18b20Init();
  200. DigDisplay();//              Delay1ms(1);
  201.               Ds18b20WriteByte(0xcc);                            //跳过ROM操作命令                           
  202.               Ds18b20WriteByte(0x44);                  //温度转换命令
  203. //              Delay1ms(100);              //等待转换成功,而如果你是一直刷着的话,就不用这个延时了

  204. }
  205. /*******************************************************************************
  206. * 函 数 名         : Ds18b20ReadTempCom
  207. * 函数功能                               : 发送读取温度命令
  208. * 输    入         : com
  209. * 输    出         : 无
  210. *******************************************************************************/

  211. void  Ds18b20ReadTempCom()
  212. {            
  213. ……………………

  214. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
所有文档.doc (115.5 KB, 下载次数: 32)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表