1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 基于51單片機的溫度采集顯示系統 [打印本頁]

作者: wdq7    時間: 2018-2-1 14:44
標題: 基于51單片機的溫度采集顯示系統
新手,小試牛刀,通過18b20采集溫度,然后通過四位數碼管顯示出來。
以下是proteus仿真和源程序。
大家多多指教


單片機源程序:
  1. #include <REGX52.H>
  2. #define uint8  unsigned char
  3. #define uint16 unsigned int
  4. sbit  DQ  =P3^7;//DS18B20數據端
  5. sbit KEY1=P1^0;
  6. sbit KEY2=P1^1;
  7. sbit KEY3=P1^2;
  8. uint16 Temperature;
  9. uint16 TemperatureSave;
  10. uint8 ReadFlag;//溫度讀取標志位
  11. uint16 RecTemperature[10];//記錄的溫度
  12. uint8 RecSum=0;//記錄的數量最多10
  13. uint8 Fin;
  14. uint8 mode=0;
  15. uint8 code DuCode[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數碼管段選碼表,0-F無小數點
  17. uint8 code WeiCode[4]={0xFE,0xFD,0xFB,0xF7};//
  18. uint8 SegBus[4]={0x40,0x40,0x40,0x40};//數碼管顯示緩存
  19. code uint8 DecimalNum[16]={0,1,1,2,3,3,4,
  20. 4,5,6,6,7,8,8,9,9};//DS18B20讀取的16bit數據最低4位對應的小數4舍5入取一位
  21. void SegShow(void);//數碼管顯示函數
  22. void Timer0Init(void);//定時器初始化函數
  23. uint16 ReadTemp(uint8 mode);//讀取溫度函數
  24. void ShowTemperature(uint16 temperature,uint8* str);
  25. void main(void)
  26. {Timer0Init();
  27.     ReadTemp(0);
  28.     while(1)
  29.     {
  30.         if(KEY1==0)
  31.         {
  32.             mode=(mode+1)%2;//模式
  33.             while(KEY1==0);
  34.         }
  35.         if(mode==1)//溫度查詢 +
  36.         {
  37.             if(KEY2==0)
  38.             {
  39.                 Fin=(Fin+1)%10;
  40.                 while(KEY2==0);
  41.             }
  42.             if(KEY3==0)
  43.             {
  44.                 if(--Fin==255)Fin=0;
  45.                 while(KEY3==0);
  46.             }
  47.                            
  48.         }

  49.         if(ReadFlag)//已經讀取到溫度
  50.         {
  51.             ReadFlag=0;
  52.             if(TemperatureSave!=Temperature)
  53.             {
  54.                 TemperatureSave=Temperature;
  55.                 RecTemperature[RecSum++]=Temperature;
  56.                 RecSum=RecSum%10;               
  57.             }
  58.             if(mode==0)
  59.             {
  60.                 ShowTemperature(Temperature,SegBus);
  61.             }
  62.             else
  63.             {
  64.                 ShowTemperature(RecTemperature[Fin],SegBus);
  65.             }
  66.             SegBus[2]|=0x80;//添加小數點;
  67.         }
  68.         SegShow();
  69.     }
  70. }

  71. /**************************************************
  72. 定時器初始化函數50ms定時中斷
  73. **************************************************/
  74. void Timer0Init(void)
  75. {
  76.     TMOD=0x01;
  77.     TH0=(65536-50000)/256;
  78.     TL0=(65536-50000)%256;
  79.     TR0=1;
  80.     ET0=1;
  81.     EA=1;
  82. }
  83. /**************************************************
  84. 定時器中斷函數
  85. **************************************************/
  86. void Timer0_ISR(void) interrupt 1
  87. {
  88.     static uint8 cnt=0;
  89.     TH0=(65536-50000)/256;
  90.     TL0=(65536-50000)%256;
  91.     cnt++;
  92.     if(cnt>15)//每隔750ms讀取一次溫度
  93.     {
  94.         Temperature=ReadTemp(1);//讀取溫度
  95.         cnt=0;
  96.         ReadTemp(0);//啟動溫度轉換
  97.         ReadFlag=1;
  98.     }
  99. }
  100. /**************************************************
  101. 數碼管用延時函數
  102. **************************************************/
  103. void DelaySeg(void)
  104. {
  105.     uint8 i;
  106.     for(i=0;i<110;i--);   
  107. }
  108. /**************************************************
  109. 1位十進制轉數碼管段碼
  110. **************************************************/
  111. void Dec1ToSeg(uint8 dec,uint8 *str)
  112. {
  113.         str[0]=0;//百位不顯示
  114.         str[1]=0;//個位不顯示
  115.         str[2]=DuCode[dec];
  116. }
  117. /**************************************************
  118. 2位十進制轉數碼管段碼
  119. **************************************************/
  120. void Dec2ToSeg(uint8 dec,uint8 *str)
  121. {
  122.         str[0]=0;
  123.         str[1]=DuCode[dec/10];
  124.         str[2]=DuCode[dec%10];
  125. }
  126. /**************************************************
  127. 3位十進制轉數碼管段碼
  128. **************************************************/
  129. void Dec3ToSeg(uint8 dec,uint8 *str)
  130. {
  131.         str[0]=DuCode[dec/100];
  132.         str[1]=DuCode[dec%100/10];
  133.         str[2]=DuCode[dec%10];
  134. }
  135. /**************************************************
  136. 顯示溫度信息
  137. **************************************************/
  138. void ShowTemperature(uint16 temperature,uint8* str)
  139. {
  140.         if(temperature&0x8000)//負溫度
  141.         {
  142.                 temperature=~temperature+1;
  143.                 str[3]=DuCode[DecimalNum[temperature&0x0f]];//計算小數部分
  144.                 temperature=temperature>>4;
  145.                 if(temperature>9)//負溫度的時候最多只有2位整數部分
  146.                 {
  147.                         Dec3ToSeg(temperature,str);
  148.                         str[0]=0x40;//-                                
  149.                 }
  150.                 else
  151.                 {
  152.                         Dec2ToSeg(temperature,str);
  153.                         str[1]=0x40;//-;        
  154.                 }
  155.         }
  156.         else
  157.         {
  158.                 str[3]=DuCode[DecimalNum[temperature&0x0f]];//計算小數部分
  159.                 temperature=temperature>>4;
  160.                 if(temperature>99)
  161.                 {
  162.                         Dec3ToSeg(temperature,str);                        
  163.                 }
  164.                 else if(temperature>9)
  165.                 {
  166.                         Dec2ToSeg(temperature,str);                        
  167.                 }
  168.                 else
  169.                 {
  170.                         Dec1ToSeg(temperature,str);                        
  171.                 }                                
  172.         }
  173. }
  174. /**************************************************
  175. 數碼管顯示
  176. **************************************************/
  177. void SegShow(void)
  178. {
  179.     P0=0x00;
  180.     P2=WeiCode[0];
  181.     P0=SegBus[0];
  182.     DelaySeg();
  183.     P0=0x00;
  184.     P2=WeiCode[1];
  185.     P0=SegBus[1];
  186.     DelaySeg();
  187.     P0=0x00;
  188.     P2=WeiCode[2];
  189.     P0=SegBus[2];
  190.     DelaySeg();
  191.     P0=0x00;
  192.     P2=WeiCode[3];
  193.     P0=SegBus[3];
  194.     DelaySeg();            
  195. }
  196. /**************************************************
  197. 大致延時一次延時2*t+7us
  198. **************************************************/
  199. void DelayUs(uint8 t)
  200. {
  201.     while(--t);
  202. }
  203. /**************************************************
  204. DS18B20初始化
  205. **************************************************/
  206. void DS18B20Init(void)
  207. {
  208.    DQ = 1;      //DQ復位
  209.    DelayUs(10);  //稍做延時
  210.    DQ = 0;      //單片機將DQ拉低
  211.    DelayUs(200);//精確延時 大于 480us 小于960us
  212.    DelayUs(200);
  213.    DQ = 1;      //拉高總線
  214.    DelayUs(75); //15~60us 后 接收60-240us的存在脈沖
  215.    DelayUs(75);
  216. }
  217. /**************************************************
  218. 讀取一個字節數據,返回uchar類型數據
  219. **************************************************/
  220. uint8 DS18B20Read(void)
  221. {
  222.    uint8 i=0;
  223.    uint8 cdat=0;
  224.    for(i=8;i>0;i--)
  225.    {
  226.           DQ=0;//給脈沖信號
  227.           cdat>>=1;
  228.           DQ = 1; // 給脈沖信號
  229.           if(DQ)
  230.             cdat|=0x80;
  231.       DelayUs(50);
  232.    }
  233.    return (cdat);
  234. }
  235. /**************************************************
  236. * 功能描述: 向DS18B20寫一個字節數據
  237. **************************************************/
  238. void DS18B20Write(uint8 cdat)
  239. {
  240.         unsigned char i=0;
  241.         for(i=8;i>0;i--)
  242.         {
  243.            DQ=0;
  244.            DQ=cdat&0x01;
  245.            DelayUs(50);
  246.            DQ=1;
  247.            cdat>>=1;
  248.         }
  249.         DelayUs(50);
  250. }
  251. /**************************************************
  252. * 功能描述: 讀取溫度值,返回uint類型數據
  253. **************************************************/
  254. uint16 ReadTemp(uint8 mode)
  255. {
  256.    unsigned char a=0;
  257.    unsigned int b,t;
  258.     DS18B20Init();
  259.    DS18B20Write(0xCC); // 跳過讀序號列號的操作
  260.    switch(mode)
  261.    {
  262.      case 0:
  263.        DS18B20Write(0x44); // 啟動溫度轉換
  264.        return 0;
  265.      case 1:
  266.        DS18B20Write(0xBE); //讀取溫度寄存器
  267.        a=DS18B20Read();   //低位
  268.        b=DS18B20Read();   //高位
  269.        b<<=8;
  270.        t=a+b;
  271.        return (t);
  272.     default:return 0;
  273.    }
  274.    return (0);
  275. }
復制代碼

下載:
數碼管DS18B20溫度整點記錄.zip (70.75 KB, 下載次數: 122)

作者: xy160628    時間: 2018-5-28 08:46
仿真呢?
作者: aking991    時間: 2018-5-30 09:00
測試了,顯示都不正常,確定程序可行?
作者: ai52    時間: 2018-7-3 11:18
用的是51 為什么定義為52
作者: daddad    時間: 2018-7-3 15:01
大哥你這張圖11和12引腳后面連得什么,看不了啊
作者: daddad    時間: 2018-7-3 15:14
后面是不是接電源和地
作者: daddad    時間: 2018-7-3 15:14
還是有什么附加功能嗎
作者: 2753013982    時間: 2018-7-3 19:22
我仿真18B20輸出數據都是0
作者: 李嘉智    時間: 2018-7-17 16:16
下載的文件會詳盡一點么
作者: 拉屎特炫    時間: 2019-12-24 10:42
為什么仿真的時候溫度只顯示一個數據呢?我的只顯示8
作者: guardianl97    時間: 2020-4-28 08:50
感謝!
作者: 一羊遷徙    時間: 2020-11-9 16:00
10、11腳連什么阿,樓主,急。。。




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