找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1866|回复: 3
收起左侧

大佬们看下为什么温度显示是0?单片机+DS18B20+oled

[复制链接]
ID:738296 发表于 2020-11-22 21:40 | 显示全部楼层 |阅读模式
  1. #include "STC15F2K60S2.h"
  2. #include "oled.h"
  3. //#include "bmp.h"
  4. #include "DS.h"

  5. u32  speed=70;
  6. bit status=0;

  7. sbit SB1 = P0^3; //按钮定义
  8. sbit SB2 = P0^2;
  9. sbit SB3 = P2^5;
  10. sbit SB4 = P2^4;

  11. unsigned char n=0;
  12. sbit ENA=P1^3;///L298N的ENA
  13. sbit IN1=P1^4;
  14. sbit IN2=P1^5;

  15. //unsigned char a;
  16. //unsigned char send_data[]="01\n";
  17. //unsigned char send_data1[]="1\n";
  18. extern unsigned int  idata Temperature;
  19. //void Timer0_Init();

  20. //void delay(int time)
  21. //{
  22. //        int k,j;
  23. //        for(k=0;k<time;k++)
  24. //        for(j=0;j<1000;j++);
  25. //}
  26. //
  27. //void uart_send_byte(unsigned char dat)
  28. //{
  29. //        SBUF=dat;        
  30. //        while(!TI);
  31. //        TI=0;
  32. //}
  33. //
  34. //void uart_send_str(unsigned char *s)
  35. //{
  36. //        while(*s!='\0')
  37. //        {
  38. //                uart_send_byte(*s);
  39. //                s++;
  40. //        }
  41. //}


  42. int main(void)
  43. {           

  44. //          SCON=0x50;
  45. //        AUXR|=0x40;
  46. //        AUXR&=0xFE;
  47. //        TMOD&=0x0F;
  48. //        TMOD|=0x20;
  49. //        TL1=0xE0;
  50. //        TH1=0xFE;
  51. //        ET1=0;
  52. //        TR1=1;
  53. //        ES=1;
  54. //        REN=1;


  55. //   TL0 = 0x00;                        //设定定时器初值
  56. //        TH0 = 0xDC;                        //设定定时器初值

  57. //        TMOD = (TMOD & 0xF0)|0x01;
  58. //         TMOD |= 0x01;
  59. //        TL0 = (65536-5000)%256;                        //设定定时器初值
  60. //        TH0 = (65536-5000)/256;                         //设定定时器初值

  61.          

  62.         AUXR |= 0x80;                //定时器时钟1T模式
  63. //        TMOD &= 0xF0;                //设置定时器模式
  64.         TMOD = (TMOD & 0xF0)|0x01;
  65.         TL0 = 0xff;                //设置定时初值
  66.         TH0 = 0x10;                //设置定时初值
  67.         TF0 = 0;                //清除TF0标志
  68.         TR0 = 1;                //定时器0开始计时
  69.         EA  = 1;        //总中断打开
  70.         ET0 = 1;        //定时器0中断打开
  71.         ENA=1;
  72. //Timer0_Init();

  73.                  OLED_Init();                        //初始化OLED  
  74.                 OLED_On();
  75.                 delay_ms(100);
  76.                 OLED_Clear();  
  77.                    OLED_ShowCHinese(0,2,3);//电
  78.                 OLED_ShowCHinese(18,2,4);//子
  79.                 OLED_ShowString(36,2,"1802",16);//1802
  80.                 OLED_ShowCHinese(72,2,14);
  81.                 OLED_ShowCHinese(90,2,15);
  82.                 OLED_ShowCHinese(108,2,16);
  83.                 OLED_ShowCHinese(36,4,0);
  84.                 OLED_ShowCHinese(54,4,1);
  85.                 OLED_ShowCHinese(72,4,2);
  86.                 OLED_ShowCHinese(90,4,5);
  87.                 delay_ms(100);
  88.                 OLED_Clear();
  89.          
  90.   while(1)
  91.         {
  92.            
  93.                 OLED_ShowString(0,2,"status",16);
  94.                 OLED_ShowString(54,2,":",16);
  95.                 OLED_ShowString(0,0,"speed",16);
  96.                 OLED_ShowString(54,0,":",16);
  97.                 OLED_ShowString(0,4,"Temp",16);
  98.                 OLED_ShowString(36,4,":",16);
  99.                 OLED_ShowString(0,6,"time",16);
  100.                 OLED_ShowString(36,6,":",16);
  101.          
  102.           if(SB1==0)
  103.                                 {
  104.                                         delay_ms(1);
  105.                                         if(SB1==0)
  106.                                         {
  107.                                           while(!SB1);
  108.                                           status=!status;
  109. //                                          uart_send_str(send_data);
  110.                                         }
  111.                                  }
  112.                           if(SB2==0)
  113.                                 {
  114.                                         delay_ms(1);
  115.                                         if(SB2==0)
  116.                                         {
  117.                                           while(!SB2);                                
  118.                                            speed-=5;
  119. //                                           uart_send_str(send_data1);
  120.                                                                                                            
  121.                                         }

  122.                                 }  
  123. //                                  if(SB3==0)
  124. //                                {
  125. //                                        delay_ms(1);
  126. //                                        if(SB3==0)
  127. //                                        {
  128. //                                          while(!SB3);
  129. //                                          
  130. //                                        }
  131. //                                }

  132. //                                  if(SB4==0)
  133. //                                {
  134. //                                        delay_ms(1);
  135. //                                        if(SB4==0)
  136. //                                        {
  137. //                                          while(!SB4);
  138. //                                          
  139. //                                        }
  140. //               }



  141.                                                   if( status==1||Temperature>=29)
  142.                                                 
  143.                                                    OLED_ShowString(64,2,"start",16);
  144.                                             else if(status==0||Temperature<=29)
  145.                                                    OLED_ShowString(64,2,"stop ",16);
  146.                                                 
  147. //                                                if(a=='a')
  148. //                                                status=!status;
  149. //                                                 OLED_ShowString(64,2,"start",16);
  150. //                                                 if(a=='b')
  151. //                                                speed-=5;
  152. //                                                OLED_ShowString(64,2,"stop ",16);
  153.                                        
  154.                                                            
  155.                                  if(speed==45)
  156.                                 speed=70;
  157.                                  if( speed==50)
  158.                                 OLED_ShowString(82,0,"1",16);
  159.                                    if( speed==55)
  160.                                 OLED_ShowString(82,0,"2",16);
  161.                                    if( speed==60)
  162.                                 OLED_ShowString(82,0,"3",16);
  163.                                    if( speed==65)
  164.                                 OLED_ShowString(82,0,"4",16);
  165.                                    if( speed==70)
  166.                                 OLED_ShowString(82,0,"5",16);         

  167.                                 
  168.         OLED_ShowNum(64,4,Temperature,3,16);

  169.          TemperatuerResult();                        
  170.                                 
  171.                                 
  172.                                 
  173. //}
  174. //}                                
  175.                                        
  176.                  
  177.   }
  178. }




  179. void int_tim0(void) interrupt 1
  180. {
  181.    /* TH0 =(65536-500)/256;  
  182.         TL0 =(65536-500)%256;
  183.     if( CT++==speed)
  184.           {
  185.             TIM=1;
  186.             CT=0;
  187.           }                */
  188. //         TL0 = 0x00;                        //设定定时器初值
  189. //         TH0 = 0xDC;                        //设定定时器初值
  190. // TH0 =(65536-500)/256;  
  191. //TL0=(65536-500)%256;
  192.                    TH0=0xff;
  193.                TL0=0x10;
  194.                 n++;
  195.                 if(n==100)n=0;
  196.                 if(status==1&n>=speed||Temperature>=29)
  197.                 {IN1=1;
  198.                 IN2=0;}
  199.                 else
  200.                 {IN1=0;
  201.                 IN2=0;}

  202. }
  203.                         


  204. //void uart_int() interrupt 4
  205. //{
  206. //
  207. //        EA=0;   //关中断
  208. //        RI=0;                 //RI由软件清0
  209. //        a=SBUF;         //接收数据
  210. //
  211. //        EA=1;   //开中断
  212. //
  213. //}


  214. //DS18B20
  215. #include "STC15F2K60S2.h"

  216. #include <intrins.h>
  217. #include "DS.h"

  218. sbit    D18B20=P2^0;   //数字温度计I/O端
  219. #define  NOP()   _nop_()   /* 定义空指令 */
  220. #define  _Nop()  _nop_()   /*定义空指令*/


  221. bit  flag;
  222. unsigned int  idata Temperature;  //内部变量
  223. unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
  224. unsigned char idata id_buff[8];
  225. unsigned char idata *p,CDG;  //*p是定义字符型变量的指针变量
  226. unsigned char idata crc_data;

  227. unsigned char code CrcTable [256]={
  228. 0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
  229. 157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
  230. 35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
  231. 190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
  232. 70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
  233. 219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
  234. 101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
  235. 248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
  236. 140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
  237. 17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
  238. 175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
  239. 50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
  240. 202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
  241. 87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
  242. 233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
  243. 116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};
  244. //
  245. /************************************************************
  246. *Function:延时处理  (功能)
  247. *parameter:         (参数)
  248. *Return:           (返回值)
  249. *Modify:         (改变)
  250. *************************************************************/
  251. void TempDelay (unsigned char idata us)
  252. {
  253.         while(us--);
  254. }

  255. /************************************************************
  256. *Function:18B20初始化
  257. *parameter:
  258. *Return:
  259. *Modify:
  260. *************************************************************/
  261. void Init18b20 (void)     //发低电平脉冲,接收返回信号进行判断
  262. {
  263.         D18B20=1;
  264.         _nop_();
  265.         D18B20=0;
  266.         TempDelay(80);   //delay 530 uS//80:要求拉低480~700uS
  267.         _nop_();
  268.         D18B20=1;
  269.         TempDelay(14);   //delay 100 uS//14;释放15-60us
  270.         _nop_();
  271.         _nop_();
  272.         _nop_();
  273.         
  274.         if(D18B20==0)// 等待18b20会拉低总线60-240us
  275.                 flag = 1;   //detect 1820 success!
  276.         else
  277.                 flag = 0;    //detect 1820 fail!
  278.         TempDelay(20);       //20
  279.         _nop_();
  280.         _nop_();
  281.         D18B20 = 1;
  282. }

  283. /************************************************************
  284. *Function:向18B20写入一个字节
  285. *parameter:
  286. *Return:
  287. *Modify:
  288. *************************************************************/
  289. void WriteByte (unsigned char idata wr)  //单字节写入
  290. {
  291.         unsigned char idata i;
  292.         for (i=0;i<8;i++)
  293.         {
  294.                 D18B20 = 0;
  295.                 _nop_();
  296.                 D18B20=wr&0x01;  //变量wr最低位写至18B20,wr非0,D18B20=1,wr为0,D18B20为0
  297.                 TempDelay(3);   //delay 45 uS //5
  298.                 _nop_();
  299.                 _nop_();
  300.                 D18B20=1;
  301.                 wr >>= 1;
  302.         }
  303. }

  304. /************************************************************
  305. *Function:读18B20的一个字节
  306. *parameter:
  307. *Return:
  308. *Modify:
  309. *************************************************************/
  310. unsigned char ReadByte (void)     //读取单字节
  311. {
  312.         unsigned char idata i,u=0;
  313.         for(i=0;i<8;i++)
  314.         {
  315.                 D18B20 = 0;
  316.                 u >>= 1;
  317.                 D18B20 = 1;
  318.                 if(D18B20==1)
  319.                 u |= 0x80;//otherwise??
  320.                 TempDelay (2);
  321.                 _nop_();
  322.         }
  323.         return(u);
  324. }

  325. /************************************************************
  326. *Function:读18B20
  327. *parameter:
  328. *Return:
  329. *Modify:
  330. *************************************************************/
  331. void read_bytes (unsigned char idata j)
  332. {
  333.          unsigned char idata i;
  334.          for(i=0;i<j;i++)
  335.          {
  336.                   *p = ReadByte();//读入数据存入指针指向地址
  337.                   p++;
  338.          }
  339. }

  340. /************************************************************
  341. *Function:CRC校验
  342. *parameter:
  343. *Return:
  344. *Modify:
  345. *************************************************************/
  346. unsigned char CRC (unsigned char j)
  347. {
  348.            unsigned char idata i,crc_data=0;
  349.           for(i=0;i<j;i++)  //查表校验
  350.             crc_data = CrcTable[crc_data^temp_buff[i]];  //异或运算
  351.     return (crc_data);
  352. }

  353. /************************************************************
  354. *Function:读取温度
  355. *parameter:
  356. *Return:
  357. *Modify:
  358. *************************************************************/
  359. void GemTemp (void)
  360. {
  361.    read_bytes (9);
  362.    if (CRC(9)==0) //校验正确
  363.    {
  364.             Temperature = temp_buff[1]*0x100 + temp_buff[0];
  365. //            Temperature *= 0.625;
  366.                 Temperature /= 16;
  367.                 TempDelay(1);
  368.     }
  369. }

  370. /************************************************************
  371. *Function:内部配置
  372. *parameter:
  373. *Return:
  374. *Modify:
  375. *************************************************************/
  376. void Config18b20 (void)  //重新配置报警限定值和分辨率
  377. {
  378.      Init18b20();
  379.      WriteByte(0xcc);  //skip rom跳过ROM;1字节
  380.      WriteByte(0x4e);  //write scratchpad写中间结果暂存器;2字节
  381.      WriteByte(0x19);  //上限;3字节高温触发器TH,25
  382.      WriteByte(0x1a);  //下限;4字节低温触发器TL,26
  383.      WriteByte(0x7f);     //set 11 bit (0.125);R1=1,R0=1,分辨率12位,
  384.      Init18b20();
  385.      WriteByte(0xcc);  //skip rom
  386.      WriteByte(0x48);  //保存设定值
  387.      Init18b20();
  388.      WriteByte(0xcc);  //skip rom
  389.      WriteByte(0xb8);  //回调设定值
  390. }

  391. /************************************************************
  392. *Function:读18B20ID
  393. *parameter:
  394. *Return:
  395. *Modify:
  396. *************************************************************/
  397. void ReadID (void)//读取器件 id
  398. {
  399.         Init18b20();
  400.         WriteByte(0x33);  //read rom
  401.         read_bytes(8);
  402. }

  403. /************************************************************
  404. *Function:18B20ID全处理
  405. *parameter:
  406. *Return:
  407. *Modify:
  408. *************************************************************/
  409. void TemperatuerResult(void)
  410. {
  411.           p = id_buff;
  412.           ReadID();
  413.           Config18b20();
  414.         Init18b20 ();
  415.         WriteByte(0xcc);   //skip rom
  416.         WriteByte(0x44);   //Temperature convert

  417.         Init18b20 ();
  418.         WriteByte(0xcc);   //skip rom
  419.         WriteByte(0xbe);   //read Temperature
  420.         p = temp_buff;
  421.         GemTemp();
  422. }


  423. void GetTemp()
  424. {      
  425.      if(CDG==1)
  426.         {  CDG=0;
  427.            TemperatuerResult();
  428.         }

  429. }

  430. /*************************************
  431. [ t1 (0.5ms)中断] 中断中做 PWM 输出
  432.   ------------1000/(0.02ms*250)=200Hz
  433. *************************************/
  434. void T1zd(void) interrupt 3
  435. {
  436.    TH1 = 0xfe;    //11.0592
  437.    TL1 = 0x33;
  438.    CDG++;
  439. }
复制代码
回复

使用道具 举报

ID:568565 发表于 2020-11-23 10:05 | 显示全部楼层
大胆猜测一手,你根本没将ds18b20接到P2.0口
回复

使用道具 举报

ID:278840 发表于 2020-11-23 18:29 | 显示全部楼层
软硬件并茂比较好
回复

使用道具 举报

ID:848390 发表于 2020-11-25 16:56 | 显示全部楼层
是不是程序没对上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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