找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2402|回复: 2
打印 上一主题 下一主题
收起左侧

STC 1T单片机设置DS18B20传感器软件延时不好不能读取正确温度值问题请教

[复制链接]
跳转到指定楼层
楼主
10黑币
最近在用STC12C5A60S2的1T单片机做DS18B20的温度监控电路,晶振11.0592MHz。电路一直读不出正确的温度值,刚开始以为是1us软件延时有问题,不过试了好几种软件延时方式结果都是一样,麻烦各位有做过1T单片机的温度监控的大虾帮忙看看问题究竟出在哪里,谢谢!
温度是用串口助手输出的,温度值一直读取到的是160.00℃。


这是两路温度监控用串口读取的数值

下面为源代码:
  1. /************************************************************
  2.        STC12C5A60S2      11.0592MHz
  3. ************************************************************/

  4. #include <STC12C5A60S2.h>        
  5. #include <intrins.h>
  6. #include <math.h>

  7. #define        uchar        unsigned char
  8. #define        uint        unsigned int

  9. #define   nop        _nop_()
  10. #define RECEIVE_SIZE  255

  11. #define SEND_TEMP_ELECTRICITY_VALUE     0XFF
  12. #define SEND_TEMP1_VALUE                                         0X00
  13. #define SEND_TEMP2_VALUE                                         0X01

  14. sbit TP2_alm = P2^2;        
  15. sbit TP1_alm = P2^1;

  16. sbit F_PG    = P1^4;
  17. sbit F_pwm   = P1^3;        
  18. sbit TP2     = P1^1;
  19. sbit TP1     = P1^0;        

  20. uint n2, ValueDelayCount=0, CT_conut1 = 0, CT_conut2 = 0;
  21. uint ReceiveBuf[6]=0,ReceiveTotal=0;
  22. float value = 0;
  23. int temp1, temp2;
  24. char *reg;
  25. char temp1buf[6] = 0, temp2buf[6] = 0;
  26. int len1 = 0, len2 = 0;

  27. const double eps = 1e-11;

  28. void T1init(void){               

  29.         AUXR |= 0x40;               
  30.         TMOD &= 0x0F;               
  31.         TMOD |= 0x10;   
  32.         TL1 = 0xCD;                                
  33.         TH1 = 0xD4;
  34.         TF1 = 0;                                       
  35.         TR1 = 1;               

  36.         ET1=1;                                
  37.         EA=1;        
  38. }


  39. void delay_ms(uint n){
  40.         uint i,j;
  41.         for (i=0;i<n*10;i++)
  42.            for(j=0;j<363;j++);
  43. }

  44. /*
  45. void delay_us(uint t){
  46.         do{
  47.                 nop; nop;
  48.                 nop; nop;
  49.                 nop; nop;
  50.                 nop; nop;
  51.                 nop; nop;
  52.         }while(t--);
  53. }
  54. */


  55. void delay_us(uchar t){   // 延时:1.6us~232us
  56.         uchar i;
  57.         for(i = t; i > 0 ; i--);
  58. }

  59. /*
  60. void Delay_T0(uint t) {      // t = time(us) * fosc(MHz) - 45   延时:5us ~ 5ms
  61.         AUXR |= 0x80;        
  62.         TMOD &= 0xF0;        
  63.         TMOD |= 0x01;      
  64.         
  65.         t = 65536 - t;
  66.         TL0 = t;
  67.         TH0 = t >> 8;
  68.         
  69.         TR0 = 1;               
  70.         
  71.         while (!TF0);
  72.         TR0 = 0;
  73.         TF0 = 0;        
  74. }
  75. */

  76. void UART1_Init(void){                // 115200bps @11.0592MHz
  77.         PCON &= 0x7F;        
  78.         SCON = 0x50;               
  79.         AUXR |= 0x04;        
  80.         BRT = 0xFD;               
  81.         AUXR |= 0x01;        
  82.         AUXR |= 0x10;               
  83.         ES = 1;        
  84. }



  85. void SendByte(uint SendData){
  86.         SBUF = SendData;
  87.         while(TI == 0);
  88.         TI = 0;
  89. }                                       

  90. /*************************************
  91. *       DS18B20温度传感器控制函数              *
  92. *************************************/

  93. void TP1_DS18B20_Rst(void){                                          
  94.         TP1 = 0;                                 
  95.         delay_us(250);               
  96.         delay_us(250);
  97.         delay_us(250);       // 延时 750us
  98.         TP1 = 1;                        
  99.         delay_us(15);            // 延时 15us
  100.         nop;
  101. }

  102. void TP2_DS18B20_Rst(void){                  
  103.         TP1 = 0;                                 
  104.         delay_us(250);                        // 延时 750us
  105.         delay_us(250);
  106.         delay_us(250);
  107.         TP1 = 1;                                
  108.         delay_us(15);                         // 延时 15us
  109. }

  110. uint TP1_DS18B20_Check(void){   
  111.         uint retry=0;
  112.   while(TP1&&retry<200){
  113.                 retry++;
  114.                 delay_us(1);
  115.         }         
  116.         if(retry>=200)
  117.                 return 1;
  118.         else
  119.                 retry=0;
  120.   while(!TP1&&retry<240){
  121.                 retry++;
  122.                 delay_us(1);
  123.         }
  124.         if(retry>=240)
  125.                 return 1;            
  126.         return 0;
  127. }

  128. uint TP2_DS18B20_Check(void)            
  129. {   
  130.         uint retry=0;
  131.   while(TP2&&retry<200){
  132.                 retry++;
  133.                 delay_us(1);
  134.         }         
  135.         if(retry>=200)
  136.                 return 1;
  137.         else
  138.                 retry=0;
  139.   while(!TP2&&retry<240){
  140.                 retry++;
  141.                 delay_us(1);
  142.         }
  143.         if(retry>=240)
  144.                 return 1;            
  145.         return 0;
  146. }

  147. void TP1_DS18B20_Write_Byte(uint dat){
  148.         uint i;
  149.         uint testb;
  150.         for(i=0; i<8; i++){
  151.                 testb=dat&0x01;
  152.                 dat=dat>>1;
  153.                 if(testb){
  154.                         TP1=0;        // Write 1
  155.                         delay_us(2);    // 2us
  156.                         TP1=1;
  157.                         delay_us(60);  // 60us           
  158.                 }else{
  159.                         TP1=0;        // Write 0
  160.                         delay_us(60);            
  161.                         TP1=1;
  162.                         delay_us(2);
  163.                 }
  164.         }
  165. }

  166. void TP2_DS18B20_Write_Byte(uint dat){
  167.         uint i;
  168.         uint testb;
  169.         for(i=0; i<8; i++){
  170.                 testb=dat&0x01;
  171.                 dat=dat>>1;
  172.                 if(testb){
  173.                         TP2=0;        // Write 1
  174.                         delay_us(2);                // 2us
  175.                         TP2=1;
  176.                         delay_us(60);  // 60us           
  177.                 }else{
  178.                         TP2=0;        // Write 0
  179.                         delay_us(60);            
  180.                         TP2=1;
  181.                         delay_us(2);
  182.                 }
  183.         }
  184. }

  185. uint TP1_DS18B20_Read_Bit(void){
  186.         uint dat;
  187.         TP1 = 0;
  188.         delay_us(1);                // 2us
  189.         TP1 = 1;
  190.         delay_us(12);                // 12us
  191.         if(TP1)dat = 1;
  192.         else dat = 0;
  193.         delay_us(50);                // 50us
  194.         return dat;
  195. }

  196. uchar TP1_DS18B20_Read_Byte(void){
  197.         uint i,j,dat;
  198.   dat=0;
  199.         for(i=1;i<=8;i++){
  200.                 j=TP1;
  201.                 dat=(j<<7)|(dat>>1);
  202.   }                                                   
  203.   return dat;
  204. }

  205. uchar TP2_DS18B20_Read_Bit(void){
  206.         uint dat;
  207.         TP2 = 0;
  208.         delay_us(1);                        // 2us
  209.         TP2 = 1;
  210.         delay_us(12);                        // 12us
  211.         if(TP2)dat = 1;
  212.         else dat = 0;
  213.         delay_us(50);                // 50us
  214.         return dat;
  215. }

  216. uchar TP2_DS18B20_Read_Byte(void){
  217.         uint i,j,dat;
  218.   dat=0;
  219.         for(i=1;i<=8;i++){
  220.                 j=TP2;
  221.                 dat=(j<<7)|(dat>>1);
  222.   }                                                   
  223.   return dat;
  224. }

  225. void TP1_DS18B20_Start(void){                                                                  
  226.         TP1_DS18B20_Rst();           
  227.         TP1_DS18B20_Check();         
  228.         TP1_DS18B20_Write_Byte(0xcc);
  229.         TP1_DS18B20_Write_Byte(0x44);
  230. }

  231. void TP2_DS18B20_Start(void){                                                                  
  232.         TP2_DS18B20_Rst();           
  233.         TP2_DS18B20_Check();         
  234.         TP2_DS18B20_Write_Byte(0xcc);
  235.         TP2_DS18B20_Write_Byte(0x44);
  236. }


  237. short TP1_DS18B20_ReadTemperature(void){
  238.         uint TL,TH;
  239.         uint temp;
  240.         short tem;
  241.         EA = 0;
  242.         TP1_DS18B20_Start ();
  243.   TP1_DS18B20_Rst();
  244.   TP1_DS18B20_Check();
  245.         TP1_DS18B20_Write_Byte(0xCC);
  246.         TP1_DS18B20_Write_Byte(0xBE);
  247.         TL = TP1_DS18B20_Read_Byte();
  248.         TH = TP1_DS18B20_Read_Byte();
  249.         EA = 1;
  250.         if(TH>7){
  251.                 TH=~TH;
  252.                 TL=~TL;
  253.                 temp=0;                                 
  254.         }else temp=1;                                    
  255.         tem=TH;                                 
  256.         tem<<=8;   
  257.         tem+=TL;                                
  258.         tem=(float)tem*0.625;        
  259.         if(temp)
  260.                 return tem;         
  261.         else
  262.                 return -tem;
  263. }

  264. short TP2_DS18B20_ReadTemperature(void){
  265.         uint TL,TH;
  266.         uint temp;
  267.         short tem;
  268.         EA = 0;
  269.         TP1_DS18B20_Start ();
  270.   TP1_DS18B20_Rst();
  271.   TP1_DS18B20_Check();
  272.         TP1_DS18B20_Write_Byte(0xCC);
  273.         TP1_DS18B20_Write_Byte(0xBE);
  274.         TL = TP1_DS18B20_Read_Byte();
  275.         TH = TP1_DS18B20_Read_Byte();
  276.         EA = 1;
  277.         if(TH>7){
  278.                 TH=~TH;
  279.                 TL=~TL;
  280.                 temp=0;                                
  281.         }else temp=1;                                    
  282.         tem=TH;                                 
  283.         tem<<=8;   
  284.         tem+=TL;                                
  285.         tem=(float)tem*0.625;        
  286.         if(temp)
  287.                 return tem;         
  288.         else
  289.                 return -tem;
  290. }

  291. void float_to_str(char *str,float num){
  292.         int high;  
  293.         float low, tp;
  294.         char *start=str;
  295.         int n=0;
  296.         char ch[20];
  297.         int i;
  298.         high=(int)num;
  299.         low=num-high;

  300.         while(high>0){
  301.                 ch[n++]='0'+high%10;
  302.                 high=high/10;
  303.         }
  304.          
  305.         for(i=n-1;i>=0;i--){
  306.                 *str++=ch[i];
  307.         }
  308.          
  309.         num -= (int)num;
  310.         tp = 0.1;
  311.         *str++='.';
  312.          
  313.         while(num > eps){
  314.                 num -= tp * (int)(low * 10);
  315.                 tp /= 10;
  316.                 *str++='0'+(int)(low*10);
  317.                 low=low*10.0-(int)(low*10);
  318.         }
  319.         *str='\0';
  320.         str=start;
  321. }

  322. void time1(void) interrupt 3   
  323. {
  324.         CY = 0;
  325.         TL1 += 0xDA;
  326.         TH1 = 0xD4 + (uchar)CY;

  327.         n2 ++;
  328.         if(n2 == 250){                        
  329.                 temp1 = TP1_DS18B20_ReadTemperature();
  330.                 float_to_str(&temp1buf,temp1);
  331.         }else if(n2 >= 500){        
  332.                 n2 = 0;
  333.                 temp2 = TP2_DS18B20_ReadTemperature();
  334.                 float_to_str(&temp2buf,temp2);
  335.         }
  336.         ValueDelayCount++;        
  337. }

  338. void UART1_Int(void) interrupt 4
  339. {
  340.         if(RI==1)  
  341.         {  
  342.                 RI=0;
  343.                 ReceiveBuf[ReceiveTotal]=SBUF;
  344.                 ReceiveTotal++;
  345.                 if(ReceiveTotal>=RECEIVE_SIZE)  
  346.                 {
  347.                         ReceiveTotal=RECEIVE_SIZE;
  348.                 }                                
  349.         }        
  350. }
  351. void SendTEMPValue(void){

  352.         if(ValueDelayCount>=500){         //500ms                                    
  353.                 ValueDelayCount=0;
  354.                 SendByte(SEND_TEMP_ELECTRICITY_VALUE);
  355.                 SendByte(SEND_TEMP1_VALUE);
  356.                 for(len1 = 0; len1 < 6; len1++){
  357.                         SendByte(temp1buf[len1]);
  358.                 }
  359.                 SendByte(SEND_TEMP_ELECTRICITY_VALUE);
  360.                 SendByte(SEND_TEMP2_VALUE);
  361.                 for(len2 = 0; len2 < 6; len2++){
  362.                         SendByte(temp2buf[len2]);
  363.                 }                                       
  364.         }                                          
  365. }


  366. void main(void){        

  367.         P1M1=0x00;                 
  368.         P1M0=0xFF;
  369.   P2M1=0x00;                        
  370.         P2M0=0xFF;
  371.         
  372.         
  373.         TP1_alm = 0;
  374.         TP2_alm = 0;

  375.         UART1_Init();        
  376.         delay_ms(500);                        
  377.         T1init();                        

  378.         delay_ms(500);
  379.         TP1_alm = 1;
  380.         TP2_alm = 1;


  381.         while (1){        
  382.                 SendTEMPValue();
  383.         }               
  384. }
复制代码


最佳答案

查看完整内容

仔细阅读DS18B20手册,重点是工作条件部分,看看程序中哪些违反了手册规定。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-6-9 14:59 | 只看该作者
仔细阅读DS18B20手册,重点是工作条件部分,看看程序中哪些违反了手册规定。
回复

使用道具 举报

板凳
ID:8840 发表于 2019-6-10 12:33 | 只看该作者
yzwzfyz 发表于 2019-6-10 08:20
仔细阅读DS18B20手册,重点是工作条件部分,看看程序中哪些违反了手册规定。

看了几遍技术手册了,没发现哪里违反手册的规定。。。初始化的延时从480us到960us的延时都试了,等待时间也是按最大时间值来延时的,就是没得到想要的数据。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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