找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1958|回復(fù): 2
收起左側(cè)

STC12C5A60S2單片機(jī)驅(qū)動18b20顯示整數(shù),12m晶振 串口全是00

[復(fù)制鏈接]
ID:56694 發(fā)表于 2021-8-13 14:26 | 顯示全部樓層 |閱讀模式
STC12C5A60S2驅(qū)動18b20顯示整數(shù)   12m晶振    串口全是00
請各位大佬指教
單片機(jī)源程序如下:
  1. #include "STC12C5A60S2.h"      //調(diào)用51單片機(jī)的頭文件
  2. #include <Intrins.h>

  3. sbit ds18b20=P3^2;


  4. //---------------------------------------         
  5. unsigned char temp1;
  6. unsigned int temp2;
  7. unsigned char xiaoshu1;//小數(shù)第一位
  8. unsigned char xiaoshu2;//小數(shù)第二位
  9. unsigned char xiaoshu;//兩位小數(shù)
  10. //---------------------------------------





  11. void Timer0Init(void)                //1微秒@12MHz
  12. {
  13.         AUXR |= 0x80;                //定時器時鐘1T模式
  14.         TMOD &= 0xF0;                //設(shè)置定時器模式
  15.         TMOD |= 0x01;                //設(shè)置定時器模式
  16.         TL0 = 0xF4;                //設(shè)置定時初始值
  17.         TH0 = 0xFF;                //設(shè)置定時初始值
  18.         TF0 = 0;                //清除TF0標(biāo)志
  19.         TR0 = 1;                //定時器0開始計時
  20. }



  21. /* 微秒延時函數(shù) 參數(shù)給幾 就延時幾微秒 */
  22. void delay_us(unsigned int us)
  23. {
  24.         while(us--)
  25.         {
  26.           Timer0Init();
  27.         }
  28. }


  29. //---------------------------------------
  30. //名稱:復(fù)位DS18B20函數(shù)

  31. bit Reset(void)
  32. {
  33.         
  34.    bit k;
  35.    ds18b20=1;
  36.    ds18b20=0;                             //拉低DQ總線開始復(fù)位        
  37.    delay_us(870);                            //保持DQ低大約870uS,符合不低于48US的要求            
  38.    ds18b20=1;                             //拉高準(zhǔn)備接收數(shù)據(jù)   
  39.    delay_us(80);                        //大約80uS后
  40.    k=ds18b20;                               //讀出數(shù)據(jù)并保存   
  41.    delay_us(400);                     //維持約400US,符合總讀時隙不低于480US的要求
  42.    return k;               //k=0為復(fù)位成功,k=1為復(fù)位失敗
  43. }

  44. //---------------------------------------
  45. //名稱:讀一字節(jié)函數(shù)

  46. unsigned char ReadByte(void)
  47. {
  48.         
  49.    unsigned char j,buf=0;
  50.    for(j=0;j<8;j++)                        //接收8次還原一個字節(jié)數(shù)據(jù)
  51.    {
  52.         buf=buf>>1;                          //接收前,想將接收緩沖區(qū)右移
  53.         ds18b20=0;                                 //拉低      
  54.         delay_us(2);
  55.         ds18b20=1;                                  //拉高,為讀數(shù)據(jù)做準(zhǔn)備
  56.         delay_us(6);
  57.         if(ds18b20==1) buf|=0x80;  //讀出1位數(shù)據(jù)保存于buf中
  58.                                                          //維持約52US,符合總讀時隙不低于60US的要求
  59.         delay_us(52);
  60.         }
  61.    return buf;             //退出的同時將接收緩沖區(qū)參數(shù)返回
  62. }

  63. //---------------------------------------
  64. //名稱:寫一字節(jié)函數(shù)

  65. void WriteByte(unsigned char dat)
  66. {
  67.         
  68.    unsigned char j;
  69.    for(j=0;j<8;j++)
  70.    {            
  71.          if(dat&0x01)                        //如果寫1
  72.       {      
  73.          ds18b20=0;                         //拉低      
  74.         delay_us(2);
  75.         ds18b20=1;                          //拉高        
  76.         delay_us(63);
  77.                 }
  78.       else                                                //如果寫0
  79.       {            
  80.         ds18b20=0;                         //拉低                 
  81.         delay_us(63);      
  82.         ds18b20=1;                         //拉高               
  83.         delay_us(2);
  84.       }
  85.        dat=dat>>1;                                //寫入字節(jié)右移1位
  86.         }
  87. }

  88. //---------------------------------------
  89. //名稱:DS18B20溫度轉(zhuǎn)換函數(shù)

  90. bit Convert()
  91. {   
  92.         if(Reset()==0)          //復(fù)位DS18B20
  93.         {               
  94.       WriteByte(0xcc);                //寫入跳過序列號命令字 Skip Rom
  95.       WriteByte(0x44);                //寫入溫度轉(zhuǎn)換命令字 Convert T  
  96.                   return 1;            //啟動溫度轉(zhuǎn)換成功
  97.         }
  98.         else
  99.         {         
  100.                   return 0;            //啟動溫度轉(zhuǎn)換失敗
  101.         }
  102. }

  103. //---------------------------------------
  104. //名稱:轉(zhuǎn)換結(jié)束處理函數(shù)

  105. void ReadFlash(void)
  106. {   
  107.         unsigned char Lsb,Msb;        
  108.    if(Reset()==0)          //復(fù)位DS18B20
  109.         {
  110.       WriteByte(0xcc);                //寫入跳過序列號命令字 Skip Rom
  111.       WriteByte(0xbe);                //寫入讀取數(shù)據(jù)令字 Read Scratchpad
  112.       Lsb=ReadByte();                //讀出第一個字節(jié)暫存于LSB
  113.       Msb=ReadByte();                //讀出第二個字節(jié)暫存于MSB        
  114.       temp1=Lsb&0x0f;                //temp1內(nèi)裝溫度參數(shù)的小數(shù)部分
  115.       temp2=(Lsb>>4)|(Msb<<4);//temp2內(nèi)裝溫度參數(shù)的整數(shù)部分
  116.       xiaoshu1 = (temp1&0x0f)*10/16; //小數(shù)第一位
  117.       xiaoshu2 = (temp1&0x0f)*100/16%10;//小數(shù)第二位
  118.       xiaoshu=xiaoshu1*10+xiaoshu2; //小數(shù)兩位
  119.       temp2=((temp2/100)<<8)+(temp2/10%10)*16+(temp2%10);
  120.       
  121.         }        
  122.         else
  123.         {
  124.           temp1=0;                                        //如果復(fù)位失敗,溫度參數(shù)清零
  125.           temp2=0;                                        //如果復(fù)位失敗,溫度參數(shù)清零        
  126.         }
  127. }





  128. void main(void)            //主函數(shù),單片機(jī)開機(jī)后就是從這個函數(shù)開始運(yùn)行
  129. {
  130.         
  131.         
  132.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  133.         AUXR |= 0x40;                //定時器時鐘1T模式
  134.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  135.         TMOD &= 0x0F;                //設(shè)置定時器模式
  136.         TL1 = 0xC7;                //設(shè)置定時初始值
  137.         TH1 = 0xFE;                //設(shè)置定時初始值
  138.         ET1 = 0;                //禁止定時器%d中斷
  139.         TR1 = 1;                //定時器1開始計時  
  140.    
  141.      while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個死循環(huán)
  142.    {
  143.                
  144.       if(Convert()==1)                                                 //啟動轉(zhuǎn)換
  145.         {               
  146.             ReadFlash();                       //讀取溫度                           
  147.                
  148.         }
  149.            SBUF=temp2;
  150.         while(TI == 0);        //檢查發(fā)送中斷標(biāo)志位
  151.                 TI = 0;                //令發(fā)送中斷標(biāo)志位為0(軟件清零)
  152.    }
  153. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2021-8-13 15:20 | 顯示全部樓層
查18b20與串口硬件接線是否正確。
回復(fù)

使用道具 舉報

ID:1111456 發(fā)表于 2024-3-17 10:46 | 顯示全部樓層
你好,請問解決了嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表