找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

基于單片機(jī)的溫度計(jì)仿真程序設(shè)計(jì) 達(dá)到門(mén)限溫度亮燈

[復(fù)制鏈接]
ID:805923 發(fā)表于 2020-7-20 20:51 | 顯示全部樓層 |閱讀模式
本帖是關(guān)于單片機(jī)的溫度計(jì)顯示
傳感器用的是ds18b20,
采用數(shù)碼管動(dòng)態(tài)顯示,可顯示3位數(shù)的溫度,第二位帶小數(shù)點(diǎn)
本實(shí)驗(yàn)還包括蜂鳴器報(bào)警,溫度高于某值,蜂鳴器報(bào)警
附件包括仿真原理圖,proteus工程文件夾,txt格式的代碼

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
  • 實(shí)驗(yàn)?zāi)康?/font>
熟練掌握C語(yǔ)言的設(shè)計(jì)和調(diào)試方法,了解與掌握數(shù)字溫度傳感器DS18B20的工作原理。
  • 實(shí)驗(yàn)內(nèi)容
利用數(shù)字溫度傳感器DS18B20與單片機(jī)結(jié)合來(lái)測(cè)量溫度控制器使用單片機(jī)AT89C51,測(cè)溫傳感器使用DS18B20,用3位LED數(shù)碼管以串口傳送數(shù)據(jù),實(shí)現(xiàn)溫度顯示。且設(shè)置一個(gè)門(mén)限溫度,當(dāng)傳感器溫度達(dá)到門(mén)限溫度后,發(fā)出提醒。
  • 實(shí)驗(yàn)要求
要求完成實(shí)驗(yàn)內(nèi)容,LED數(shù)碼管成功顯示示數(shù)。設(shè)置報(bào)警門(mén)限,若溫度超限蜂鳴器報(bào)警。
  • 實(shí)驗(yàn)硬件電路

圖1 硬件電路圖





  • 實(shí)驗(yàn)結(jié)果及分析

圖 1未達(dá)門(mén)限溫度截過(guò)圖

圖 2達(dá)到門(mén)限溫度結(jié)果圖

  • 實(shí)驗(yàn)總結(jié)及建議

實(shí)驗(yàn)總結(jié):通過(guò)這次實(shí)驗(yàn),我了解了DS13B20的基本原理和編程方法,更加熟悉了多位數(shù)碼管的動(dòng)態(tài)顯示,自己的編寫(xiě)代碼的能力也增強(qiáng)了許多。但這次實(shí)驗(yàn)也反映了自己的一些問(wèn)題,編寫(xiě)基本的代碼還可以,稍微有些難度的代碼就編寫(xiě)不出來(lái)了,以后會(huì)多加練習(xí),克服這個(gè)問(wèn)題。


單片機(jī)源程序如下:


  1. /* Main.c file generated by New Project wizard
  2. *
  3. * Created:   周一 7月 6 2020
  4. * Processor: AT89C52
  5. * Compiler:  Keil for 8051
  6. */

  7. #include <reg51.h>
  8. #include <stdio.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. sbit X=P2^6;
  12. sbit Y=P2^7;
  13. sbit Z=P2^3;
  14. sbit DQ=P2^2;
  15. uchar code Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  16. void delay(uint count)      //delay        延時(shí)
  17. {
  18.   uint i;
  19.   while(count)
  20.   {
  21.     i=200;
  22.     while(i>0)
  23.     i--;
  24.     count--;
  25.   }
  26. }
  27. void dsreset(void)       //重置、初始化命令
  28. {
  29.   uint i;
  30.   DQ=0;                 //賦值
  31.   i=103;              //延時(shí)480us-960us
  32.   while(i>0)i--;
  33.   DQ=1;                  //賦值
  34.   i=4;
  35.   while(i>0)i--;         //延時(shí)15-60us
  36. }

  37. bit tmpreadbit(void)       //讀一位
  38. {
  39.    uint i;
  40.    bit dat;
  41.    DQ=0;
  42.    i++;          //i++ for delay 延時(shí)1us-15us
  43.    DQ=1;
  44.    i++;i++;      //釋放總線(xiàn)延時(shí)
  45.    dat=DQ;            //讀數(shù)賦值
  46.    i=8;
  47.    while(i>0)i--;
  48.    return (dat);//返回所獲得讀數(shù)
  49. }

  50. uchar tmpread(void)   //讀一個(gè)字節(jié) 8Bit
  51. {
  52.   uchar i,j,dat;
  53.   dat=0;
  54.   for(i=1;i<=8;i++)//連續(xù)讀取8位,1字節(jié)
  55.   {
  56.     j=tmpreadbit();       //調(diào)用讀1位的函數(shù)
  57.     dat=(j<<7|(dat>>1));   //讀出的數(shù)據(jù)最低位在最前面,動(dòng)腦想如何設(shè)計(jì)
  58.   }
  59.   return(dat);//返回1字節(jié)的讀數(shù)
  60. }

  61. void tmpwritebyte(uchar dat)   //寫(xiě)一個(gè)字節(jié)
  62. {
  63.   uint i;
  64.   uchar j;
  65.   bit testb;//寫(xiě)入的數(shù)
  66.   for(j=1;j<=8;j++)//連續(xù)寫(xiě)8位
  67.   {
  68.     testb=dat&0x01;//思考如何設(shè)計(jì)每次讀到的1bit
  69.      dat=dat>>1;
  70.     if(testb)     //write 1
  71.     {
  72.       DQ=0;//賦值
  73.       i++;i++;
  74.      DQ=1;//賦值
  75.       i=8;while(i>0)i--;
  76.     }
  77.     else              //write 0
  78.     {
  79.       DQ=0;//賦值      
  80.       i=8;while(i>0)i--;
  81.       DQ=1;//賦值
  82.       i++;i++;
  83.     }
  84.   }
  85. }

  86. void tmpchange(void)  //DS18B20 轉(zhuǎn)換溫度
  87. {
  88.   dsreset();//初始化
  89.   delay(1);
  90.   tmpwritebyte(0xcc);//跳過(guò)ROM
  91.   tmpwritebyte(0x44);//轉(zhuǎn)換溫度
  92. }
  93. void tempread(void)
  94. {
  95.   dsreset();  //寫(xiě)入相關(guān)指令,思考要寫(xiě)什么指令
  96.   delay(1);
  97.   tmpwritebyte(0xcc);//跳過(guò)RON
  98.   tmpwritebyte(0xbe);//讀取暫存器
  99.    }

  100. uint tmp()               //獲得溫度
  101. {
  102.   float tt;
  103.   uchar a,b;
  104.   uint temp;
  105.   tmpchange();
  106.   tempread();
  107.   a=tmpread();
  108.   b=tmpread();
  109.   temp=b;
  110.   temp<<=8;             //two byte  compose a int variable
  111.   temp=temp|a;
  112.   tt=temp*0.0625;
  113.   temp=tt*10+0.5;
  114.   return temp;
  115. }

  116. void display(uint temp)                        //顯示程序
  117. {
  118.    Y=0;
  119.    P0=0xfe;
  120.    Y=1;
  121.    Y=0;
  122.    X=0;
  123.    P0=Data[temp/100];
  124.    X=1;
  125.    X=0;
  126.    delay(1);

  127.    Y=0;
  128.    P0=0xfd;
  129.    Y=1;
  130.    Y=0;
  131.    X=0;
  132.    P0=Data[(temp%100)/10]+0x80;
  133.    X=1;
  134.    X=0;
  135.    delay(1);
  136.    
  137.    Y=0;
  138.    P0=0xfb;
  139.    Y=1;
  140.    Y=0;
  141.    X=0;
  142.    P0=Data[(temp%100)%10];
  143.    X=1;
  144.    X=0;
  145.    delay(1);
  146.    if(temp>=400)         
  147.      {
  148.        Z=0;
  149.           }  
  150.    else Z=1;
  151. }


  152. void main()
  153. {
  154.   uchar a,temp;
  155.   do
  156.   {
  157.     tmpchange();//溫度轉(zhuǎn)換
  158.     for(a=10;a>0;a--)  //避免閃爍
  159.     {   
  160.           display(tmp());//調(diào)用顯示函數(shù)
  161.       }

  162.   } while(1);
  163. }
復(fù)制代碼

所有資料51hei提供下載:

溫度計(jì)設(shè)計(jì).zip (247.08 KB, 下載次數(shù): 36)


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:940398 發(fā)表于 2021-6-19 14:40 | 顯示全部樓層
仿真工程是Proteus8.8版本的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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