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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的溫度采集顯示系統(tǒng)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
新手,小試牛刀,通過18b20采集溫度,然后通過四位數(shù)碼管顯示出來。
以下是proteus仿真和源程序。
大家多多指教


單片機(jī)源程序:
  1. #include <REGX52.H>
  2. #define uint8  unsigned char
  3. #define uint16 unsigned int
  4. sbit  DQ  =P3^7;//DS18B20數(shù)據(jù)端
  5. sbit KEY1=P1^0;
  6. sbit KEY2=P1^1;
  7. sbit KEY3=P1^2;
  8. uint16 Temperature;
  9. uint16 TemperatureSave;
  10. uint8 ReadFlag;//溫度讀取標(biāo)志位
  11. uint16 RecTemperature[10];//記錄的溫度
  12. uint8 RecSum=0;//記錄的數(shù)量最多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}; //共陰數(shù)碼管段選碼表,0-F無小數(shù)點(diǎn)
  17. uint8 code WeiCode[4]={0xFE,0xFD,0xFB,0xF7};//
  18. uint8 SegBus[4]={0x40,0x40,0x40,0x40};//數(shù)碼管顯示緩存
  19. code uint8 DecimalNum[16]={0,1,1,2,3,3,4,
  20. 4,5,6,6,7,8,8,9,9};//DS18B20讀取的16bit數(shù)據(jù)最低4位對應(yīng)的小數(shù)4舍5入取一位
  21. void SegShow(void);//數(shù)碼管顯示函數(shù)
  22. void Timer0Init(void);//定時器初始化函數(shù)
  23. uint16 ReadTemp(uint8 mode);//讀取溫度函數(shù)
  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)//已經(jīng)讀取到溫度
  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;//添加小數(shù)點(diǎn);
  67.         }
  68.         SegShow();
  69.     }
  70. }

  71. /**************************************************
  72. 定時器初始化函數(shù)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. 定時器中斷函數(shù)
  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);//啟動溫度轉(zhuǎn)換
  97.         ReadFlag=1;
  98.     }
  99. }
  100. /**************************************************
  101. 數(shù)碼管用延時函數(shù)
  102. **************************************************/
  103. void DelaySeg(void)
  104. {
  105.     uint8 i;
  106.     for(i=0;i<110;i--);   
  107. }
  108. /**************************************************
  109. 1位十進(jìn)制轉(zhuǎn)數(shù)碼管段碼
  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位十進(jìn)制轉(zhuǎn)數(shù)碼管段碼
  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位十進(jìn)制轉(zhuǎn)數(shù)碼管段碼
  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)//負(fù)溫度
  141.         {
  142.                 temperature=~temperature+1;
  143.                 str[3]=DuCode[DecimalNum[temperature&0x0f]];//計(jì)算小數(shù)部分
  144.                 temperature=temperature>>4;
  145.                 if(temperature>9)//負(fù)溫度的時候最多只有2位整數(shù)部分
  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]];//計(jì)算小數(shù)部分
  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. 數(shù)碼管顯示
  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復(fù)位
  209.    DelayUs(10);  //稍做延時
  210.    DQ = 0;      //單片機(jī)將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. 讀取一個字節(jié)數(shù)據(jù),返回uchar類型數(shù)據(jù)
  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寫一個字節(jié)數(shù)據(jù)
  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類型數(shù)據(jù)
  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); // 啟動溫度轉(zhuǎn)換
  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. }
復(fù)制代碼

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

評分

參與人數(shù) 1黑幣 +4 收起 理由
旋風(fēng)sv + 4 很給力!

查看全部評分

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

使用道具 舉報

11#
ID:840996 發(fā)表于 2020-11-9 16:00 | 只看該作者
10、11腳連什么阿,樓主,急!!!!
回復(fù)

使用道具 舉報

10#
ID:739415 發(fā)表于 2020-4-28 08:50 | 只看該作者
感謝!
回復(fù)

使用道具 舉報

9#
ID:661298 發(fā)表于 2019-12-24 10:42 | 只看該作者
為什么仿真的時候溫度只顯示一個數(shù)據(jù)呢?我的只顯示8
回復(fù)

使用道具 舉報

8#
ID:373169 發(fā)表于 2018-7-17 16:16 | 只看該作者
下載的文件會詳盡一點(diǎn)么
回復(fù)

使用道具 舉報

7#
ID:364266 發(fā)表于 2018-7-3 19:22 | 只看該作者
我仿真18B20輸出數(shù)據(jù)都是0
回復(fù)

使用道具 舉報

6#
ID:363959 發(fā)表于 2018-7-3 15:14 | 只看該作者
還是有什么附加功能嗎
回復(fù)

使用道具 舉報

5#
ID:363959 發(fā)表于 2018-7-3 15:14 | 只看該作者
后面是不是接電源和地
回復(fù)

使用道具 舉報

地板
ID:363959 發(fā)表于 2018-7-3 15:01 | 只看該作者
大哥你這張圖11和12引腳后面連得什么,看不了啊
回復(fù)

使用道具 舉報

板凳
ID:363822 發(fā)表于 2018-7-3 11:18 | 只看該作者
用的是51 為什么定義為52
回復(fù)

使用道具 舉報

沙發(fā)
ID:65956 發(fā)表于 2018-5-30 09:00 | 只看該作者
測試了,顯示都不正常,確定程序可行?
回復(fù)

使用道具 舉報

樓主
ID:338804 發(fā)表于 2018-5-28 08:46 | 只看該作者
仿真呢?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区精品 | 国产精品久久久久久久久久久久久 | 在线黄| 一区二区在线免费观看 | 欧美一级片在线看 | 中文字幕高清在线 | 亚洲看片网站 | 日韩区 | 一级欧美一级日韩片 | 精品美女视频在线观看免费软件 | 中文字幕av网站 | 亚洲一二三区免费 | 91久久久久| 久久精品一二三影院 | 亚州av| 成人久久久 | 亚洲444eee在线观看 | 午夜影院在线观看免费 | 涩色视频在线观看 | 最新av中文字幕 | 成人激情视频在线播放 | www.99热| 午夜精品久久久久久久久久久久久 | 久久99久久 | 91porn成人精品 | av在线黄| 久久久国产一区二区三区 | 成人av在线播放 | 在线中文字幕第一页 | 91av久久久 | 国产乱码精品一品二品 | 国产乱码久久久久久 | 7799精品视频天天看 | 欧美 中文字幕 | 成人午夜影院 | 亚洲一区二区免费 | 操操操操操 | 亚洲精品电影 | 日韩精品一二三 | 久草资源在线 | 7799精品视频天天看 |