久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3967|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)DS18B20源程序與Proteus仿真 元件清單等

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:918075 發(fā)表于 2021-5-9 15:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
利用protues仿真溫度采集系統(tǒng),可以顯示溫度

元件清單:
序號    元器件    型號    標(biāo)志
1    LCD1602液晶    LCD1602    LCD1
2    電阻    10K    R1
3    STM32核心板    STM32_CORE    U1
4    DS18B20溫度芯片    DS18B20    U2
5    電位器    10k    RP1
5    六腳自鎖開關(guān)    /    U3
6    覆銅板或萬用板    /    /
7    普通USB線_大頭    /    /
8    導(dǎo)線(只萬用板有)    /    /
9    焊錫    /    /

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


電路原理圖如下:


單片機(jī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include "bsp-lcd1602.h"
  3. #include "delay.h"
  4. #include "sys.h"

  5. #include "ds18b20.h"
  6. #include <stdio.h>
  7. #include "math.h"


  8. short tem,tem1;
  9. u8 a,b,c,t;
  10. #ifdef __GNUC__
  11. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  12. #else
  13. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  14. #endif


  15. void Delay_DS18B20(int num)
  16. {
  17.         while(num--) ;
  18. }


  19. int main(void)
  20.        
  21. {

  22.         SystemCoreClockUpdate ();
  23.         LCD1602_Init();
  24.         LCD1602_ShowStr(2,0,"tempe=000.0C",13);
  25.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  26.         GPIO_InitTypeDef g;
  27.         g.GPIO_Mode = GPIO_Mode_Out_PP;
  28.         g.GPIO_Speed = GPIO_Speed_10MHz;
  29.         g.GPIO_Pin = GPIO_Pin_8  ;
  30.         GPIO_Init(GPIOB,&g);
  31.         GPIO_SetBits(GPIOB,GPIO_Pin_8);    //輸出1

  32.    t=DS18B20_DQ_IN;
  33. while(t){
  34.                 DS18B20_IO_OUT();         //SET PG11 OUTPUT

  35.     DS18B20_DQ_OUT=0;         //拉低DQ
  36.           Delay_DS18B20(750);             //拉低750us
  37.     DS18B20_DQ_OUT=1;         //DQ=1
  38.           Delay_DS18B20(15);             //15US
  39.                 DS18B20_IO_IN();        //SET PG11 INPUT         
  40.     Delay_DS18B20(100);
  41.                 t=DS18B20_DQ_IN;
  42. //                 LCD_ShowNum(13,0,t);
  43. }
  44. tem=DS18B20_Get_Temp();
  45.                 Delay_DS18B20(1000000);

  46. while(1)
  47.         {       
  48.     tem=DS18B20_Get_Temp();
  49.                 if(        tem>0)
  50.                 {        a=tem/100;
  51.                 b=tem%100/10;
  52.                 c=tem%10;
  53.                 LCD_ShowChar(8,0,'+');
  54.         LCD_ShowNum(9,0,a);       
  55.         LCD_ShowNum(10,0,b);
  56.         LCD_ShowNum(12,0,c);
  57.                           
  58.                 }
  59.         else
  60.         {       
  61. //                tem1=(int)tem;
  62. //                tem1=abs(tem1);
  63.                 tem1=-(tem);
  64.                 tem1=tem1+1;
  65.                 a=tem1/100;
  66.                 b=tem1%100/10;
  67.                 c=tem1%10;
  68.         LCD_ShowChar(8,0,'-');
  69.         LCD_ShowNum(9,0,a);       
  70.         LCD_ShowNum(10,0,b);
  71.         LCD_ShowNum(12,0,c);
  72.                
  73.         }
  74.         Delay_DS18B20(100000);
  75.   }



  76. }
復(fù)制代碼
  1. #include "ds18b20.h"
  2. #include "delay.h"       

  3.   



  4. void Delay_DS18B20_1us(int num)
  5. {
  6.         while(num--) ;
  7. }


  8. //復(fù)位DS18B20
  9. void DS18B20_Rst(void)          
  10. {                 
  11.         DS18B20_IO_OUT();         //SET PG11 OUTPUT
  12.     DS18B20_DQ_OUT=0;         //拉低DQ
  13.   Delay_DS18B20_1us(750);            //拉低750us
  14.     DS18B20_DQ_OUT=1;         //DQ=1
  15. Delay_DS18B20_1us(15);            //15US
  16. }
  17. //等待DS18B20的回應(yīng)
  18. //返回1:未檢測到DS18B20的存在
  19. //返回0:存在
  20. u8 DS18B20_Check(void)           
  21. {   
  22.         u8 retry=0;
  23.         DS18B20_IO_IN();        //SET PG11 INPUT         
  24.     while (DS18B20_DQ_IN&&retry<200)
  25.         {
  26.                 retry++;
  27.                 Delay_DS18B20_1us(1);
  28.         };         
  29.         if(retry>=200)return 1;
  30.         else retry=0;
  31.     while (!DS18B20_DQ_IN&&retry<240)
  32.         {
  33.                 retry++;
  34.                 Delay_DS18B20_1us(1);
  35.         };
  36.         if(retry>=240)return 1;            
  37.         return 0;
  38. }
  39. //從DS18B20讀取一個位
  40. //返回值:1/0
  41. u8 DS18B20_Read_Bit(void)          
  42. {
  43.     u8 data;
  44.         DS18B20_IO_OUT();        //SET PG11 OUTPUT
  45.     DS18B20_DQ_OUT=0;
  46.         Delay_DS18B20_1us(2);
  47.     DS18B20_DQ_OUT=1;
  48.         DS18B20_IO_IN();        //SET PG11 INPUT
  49.         Delay_DS18B20_1us(12);
  50.         if(DS18B20_DQ_IN)data=1;
  51.     else data=0;         
  52.     Delay_DS18B20_1us(50);           
  53.     return data;
  54. }
  55. //從DS18B20讀取一個字節(jié)
  56. //返回值:讀到的數(shù)據(jù)
  57. u8 DS18B20_Read_Byte(void)     
  58. {        
  59.     u8 i,j,dat;
  60.     dat=0;
  61.         for (i=1;i<=8;i++)
  62.         {
  63.         j=DS18B20_Read_Bit();
  64.         dat=(j<<7)|(dat>>1);
  65.     }                                                    
  66.     return dat;
  67. }
  68. //寫一個字節(jié)到DS18B20
  69. //dat:要寫入的字節(jié)
  70. void DS18B20_Write_Byte(u8 dat)     
  71. {            
  72.     u8 j;
  73.     u8 testb;
  74.         DS18B20_IO_OUT();        //SET PG11 OUTPUT;
  75.     for (j=1;j<=8;j++)
  76.         {
  77.         testb=dat&0x01;
  78.         dat=dat>>1;
  79.         if (testb)
  80.         {
  81.             DS18B20_DQ_OUT=0;        // Write 1
  82.             Delay_DS18B20_1us(2);                           
  83.             DS18B20_DQ_OUT=1;
  84.             Delay_DS18B20_1us(60);            
  85.         }
  86.         else
  87.         {
  88.             DS18B20_DQ_OUT=0;        // Write 0
  89.             Delay_DS18B20_1us(60);            
  90.             DS18B20_DQ_OUT=1;
  91.             Delay_DS18B20_1us(2);                          
  92.         }
  93.     }
  94. }
  95. //開始溫度轉(zhuǎn)換
  96. void DS18B20_Start(void)
  97. {                                                                 
  98.     DS18B20_Rst();          
  99.         DS18B20_Check();         
  100.     DS18B20_Write_Byte(0xcc);        // skip rom
  101.     DS18B20_Write_Byte(0x44);        // convert
  102. }

  103. //初始化DS18B20的IO口 DQ 同時檢測DS的存在
  104. //返回1:不存在
  105. //返回0:存在             
  106. u8 DS18B20_Init(void)
  107. {
  108.         GPIO_InitTypeDef  GPIO_InitStructure;
  109.        
  110.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PORTG口時鐘
  111.        
  112.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                //PORTG.11 推挽輸出
  113.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   
  114.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  115.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  116.         GPIO_SetBits(GPIOA,GPIO_Pin_11);    //輸出1

  117.         DS18B20_Rst();

  118.         return DS18B20_Check();
  119. }  
  120. //從ds18b20得到溫度值
  121. //精度:0.1C
  122. //返回值:溫度值 (-550~1250)
  123. short DS18B20_Get_Temp(void)
  124. {
  125.     u8 temp;
  126.     u8 TL,TH;
  127.         short tem;
  128.     DS18B20_Start ();                          // ds1820 start convert
  129.     DS18B20_Rst();
  130.     DS18B20_Check();         
  131.     DS18B20_Write_Byte(0xcc);        // skip rom
  132.     DS18B20_Write_Byte(0xbe);        // convert            
  133.     TL=DS18B20_Read_Byte();         // LSB   
  134.     TH=DS18B20_Read_Byte();         // MSB  
  135.                       
  136.     if(TH>7)
  137.     {
  138.         TH=~TH;
  139.         TL=~TL;
  140.         temp=0;                                        //溫度為負(fù)  
  141.     }else temp=1;                                //溫度為正                    
  142.     tem=TH;                                         //獲得高八位
  143.     tem<<=8;   
  144.     tem+=TL;                                        //獲得底八位
  145.     tem=(float)tem*0.625;                //轉(zhuǎn)換     
  146.         if(temp)return tem;                 //返回溫度值
  147.         else return -tem;   
  148. }
復(fù)制代碼

所有資料51hei提供下載:
STM32 溫度傳感器DS18B20仿真.7z (454.03 KB, 下載次數(shù): 180)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1052824 發(fā)表于 2023-12-17 23:32 | 只看該作者
你好,我按照你畫為什么仿真不了,應(yīng)該是沒有接錯的

屏幕截圖 溫度顯示.png (94.38 KB, 下載次數(shù): 90)

屏幕截圖 溫度顯示.png
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人午夜电影 | 国产精品特级毛片一区二区三区 | 亚洲精品久久久9婷婷中文字幕 | 久久免费精品视频 | 国产免费看| 日韩免费福利视频 | 欧美一级做性受免费大片免费 | 亚洲视频欧美视频 | 青青久久 | 日韩一级欧美一级 | 欧美成人免费 | 91精品久久久久久久久久入口 | 成人性视频免费网站 | 日韩中文在线 | 91国内精精品久久久久久婷婷 | 成人在线观看黄 | 日韩一区二区在线视频 | 99视频在线免费观看 | 国产成人久久精品 | 国产精品自拍啪啪 | 亚洲一区二区三区在线 | 欧美日韩久久久久 | 欧美一级高潮片免费的 | 精品一区二区三区四区在线 | 69精品久久久久久 | 午夜国产一级 | 日本福利一区 | 福利色导航 | 亚洲国产成人久久综合一区,久久久国产99 | 久久久久久成人 | 超碰电影 | 尤物在线精品视频 | 精品国产免费一区二区三区演员表 | 亚洲性人人天天夜夜摸 | 天天躁天天操 | 久久青青 | 中文字幕乱码一区二区三区 | 日韩毛片在线免费观看 | av中文在线观看 | 国产精品国产a | 在线国产一区二区 |