欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC12C5A60S2單片機驅動18b20顯示整數,12m晶振 串口全是00 [打印本頁]

作者: maizhi99    時間: 2021-8-13 14:26
標題: STC12C5A60S2單片機驅動18b20顯示整數,12m晶振 串口全是00
STC12C5A60S2驅動18b20顯示整數   12m晶振    串口全是00
請各位大佬指教
單片機源程序如下:
  1. #include "STC12C5A60S2.h"      //調用51單片機的頭文件
  2. #include <Intrins.h>

  3. sbit ds18b20=P3^2;


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





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



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


  29. //---------------------------------------
  30. //名稱:復位DS18B20函數

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

  44. //---------------------------------------
  45. //名稱:讀一字節函數

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

  63. //---------------------------------------
  64. //名稱:寫一字節函數

  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;                                //寫入字節右移1位
  86.         }
  87. }

  88. //---------------------------------------
  89. //名稱:DS18B20溫度轉換函數

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

  103. //---------------------------------------
  104. //名稱:轉換結束處理函數

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





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




作者: xuyaqi    時間: 2021-8-13 15:20
查18b20與串口硬件接線是否正確。
作者: lamcare    時間: 2024-3-17 10:46
你好,請問解決了嗎





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1