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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數(shù)字溫度計仿真程序 帶負(fù)溫度顯示

[復(fù)制鏈接]
ID:355923 發(fā)表于 2020-10-29 18:26 | 顯示全部樓層 |閱讀模式
功能說明

1.數(shù)碼管顯示 DS18B20設(shè)置的問題
2.報警設(shè)置初始值為30 上電默認(rèn)30  K1按鍵按下進(jìn)入報警溫度設(shè)置 K2+溫度 K3-溫度 K4恢復(fù)顯示

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

單片機源程序如下:
  1. #include "reg52.h"                       

  2. typedef unsigned int uint;          
  3. //對數(shù)據(jù)類型進(jìn)行聲明定義
  4. typedef unsigned char uchar;

  5. sbit beep = P1^5;

  6. sbit DSPORT        =P3^7;
  7. sbit LSA=P2^2;
  8. sbit LSB=P2^3;
  9. sbit LSC=P2^4;
  10. sbit K1=P3^0;
  11. sbit K2=P3^1;
  12. sbit K3=P3^2;
  13. sbit K4=P3^3;



  14. uint DisplayData[8];
  15. uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  16. uint warn = 30;
  17. uint tt = 30;//記錄溫度
  18. uint warns[8];

  19. void delay(uint i){        //延遲ius
  20.         while(i--);
  21. }

  22. //延遲函數(shù)
  23. void Delay1ms(uint y)
  24. {
  25.         uint x;
  26.         for( ; y>0; y--)
  27.         {
  28.                 for(x=110; x>0; x--);
  29.         }
  30. }

  31. //初始化函數(shù)
  32. uchar Ds18K20Init()
  33. {
  34.         uchar i;
  35.         DSPORT = 0;
  36.         //將總線拉低480us~960us
  37.         i = 73;       
  38.         while(i--);//延時642us
  39.         DSPORT = 1;
  40.         //然后拉高總線,如果DS18K20做出
  41.         //反應(yīng)會將在15us~60us后總線拉低
  42.         i = 0;
  43.         while(DSPORT)       
  44.         {//等待DS18K20拉低總線
  45.                 Delay1ms(1);
  46.                 i++;
  47.                 if(i>5)//等待>5ms
  48.                 {
  49.                         return 0;//初始化失敗
  50.                 }
  51.        
  52.         }
  53.         return 1;//初始化成功
  54. }

  55. //向傳感器寫字節(jié)
  56. void Ds18K20WriteByte(uchar dat)
  57. {
  58.         uint i, j;

  59.         for(j=0; j<8; j++)
  60.         {
  61.                 DSPORT = 0;                       
  62.                 //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  63.                 i++;
  64.                 DSPORT = dat & 0x01;  
  65.                 //然后寫入一個數(shù)據(jù),從最低位開始 0000 0001
  66.                 i=6;
  67.                 while(i--);
  68.                 //延時68us,持續(xù)時間最少60us
  69.                 DSPORT = 1;       
  70.                 //然后釋放總線,至少1us給總線恢復(fù)時
  71.                 //間才能接著寫入第二個數(shù)值
  72.                 dat >>= 1;       
  73.                 //傳輸完最低位,數(shù)據(jù)右移,傳輸次低
  74.                 //位,依次循環(huán)           1000 1001 -> 0100 0100
  75.         }
  76. }

  77. //從傳感器讀字節(jié)
  78. uchar Ds18K20ReadByte()
  79. {
  80.         uchar byte, bi;//bi保存單位數(shù)據(jù)
  81.         uint  i,j;       
  82.         for(j=8; j>0; j--)
  83.         {
  84.                 DSPORT = 0;//先將總線拉低1us
  85.                 i++;
  86.                 DSPORT = 1;//總線拉高,然后釋放總線
  87.                 i++;
  88.                 i++;//延時6us等待數(shù)據(jù)穩(wěn)定
  89.                 bi = DSPORT;         //讀取數(shù)據(jù),從最低位開始讀取
  90.                 byte = (byte >> 1) | (bi << 7);
  91.                 /*如,byte=0000 0000,bi讀取到一個最低位有效數(shù)字0000 0001,
  92.                 左移七位1000 0000,byte右移一位0000 0000,和byte或,
  93.                         byte=1000 0000,bi讀取到一個最低位有效數(shù)字0000 0001,
  94.                         左移七位1000 0000,byte右移一位0100 0000,和byte或,
  95.                         byte=1100 0000,以此類推       
  96.                 */                                                  
  97.                 while(i--);//延時45us
  98.         }                               
  99.         return byte;
  100. }

  101. //溫度轉(zhuǎn)換函數(shù)指令
  102. void  Ds18K20ChangTemp()
  103. {
  104.         Ds18K20Init();
  105.         Delay1ms(1);
  106.         Ds18K20WriteByte(0xcc);               
  107.         //跳過ROM操作命令                 
  108.         Ds18K20WriteByte(0x44);          
  109.         //溫度轉(zhuǎn)換命令
  110.         //Delay1ms(100);       
  111.         //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
  112.    
  113. }

  114. //讀取溫度數(shù)據(jù)指令
  115. void  Ds18K20ReadTempCom()
  116. {       

  117.         Ds18K20Init();
  118.         Delay1ms(1);
  119.         Ds18K20WriteByte(0xcc);         
  120.         //跳過ROM操作命令
  121.         Ds18K20WriteByte(0xbe);         
  122.         //發(fā)送讀取溫度命令
  123. }

  124. //報警函數(shù)
  125. void Alarm(uint t){
  126.         uint i = 10;
  127.        
  128.         if(t>=warn){
  129.                 while(i--){
  130.                         beep=~beep;
  131.                 }
  132.         }
  133. }

  134. //溫度讀取函數(shù)
  135. int Ds18K20ReadTemp()
  136. {
  137.         int temp = 0;
  138.         //注意這里int是2字節(jié)16位
  139.         uchar tmh, tml;
  140.         //分別用于存放溫度的低字節(jié)和高字節(jié)數(shù)據(jù)
  141.         Ds18K20ChangTemp();                         
  142.         //先寫入轉(zhuǎn)換命令
  143.         Ds18K20ReadTempCom();               
  144.         //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  145.         tml = Ds18K20ReadByte();       
  146.         //讀取溫度值共16位,先讀低字節(jié)
  147.         tmh = Ds18K20ReadByte();       
  148.         //再讀高字節(jié)
  149.         temp = tmh;
  150.         //先讀取高八位         0000 0000
  151.         temp <<= 8;
  152.         //將讀取到的數(shù)據(jù)從temp低八位移位至高八位
  153.         temp |= tml;
  154.         //以或的形式讀取低八位
  155.         return temp;
  156. }

  157. //數(shù)據(jù)處理函數(shù)
  158. void datapros(int temp)          
  159. {        uint ge,shi,bai;
  160.            float tp;  
  161.         //保存溫度
  162.         if(temp< 0)//當(dāng)溫度值為負(fù)數(shù)
  163.           {
  164.                 DisplayData[0] = 0x40;           //   -
  165.                 //因為讀取的溫度是實際溫度的補碼
  166.                 //,所以減1,再取反求出原碼
  167.                 temp=temp-1;
  168.                 temp=~temp;
  169.                 tp=temp;
  170.                 temp=tp*0.0625*100+0.5;       
  171.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為
  172.                 //C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  173.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5
  174.                 //之后大于0.5的就是進(jìn)1了,小于0.5的就
  175.                 //算加上0.5,還是在小數(shù)點后面。

  176.           }
  177.         else
  178.           {                       
  179.                 DisplayData[0] = 0x00;
  180.                 tp=temp;
  181.                 //因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  182.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  183.                 temp=tp*0.0625*100+0.5;       
  184.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮
  185.                 //點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點后面的數(shù)自動去掉,
  186.                 //不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,
  187.                 //小于0.5的就算加上0.5,還是在小數(shù)點后面。
  188.         }


  189.         bai=temp / 10000;
  190.         shi=temp % 10000 / 1000;
  191.         ge=        temp % 10000 % 1000/100;
  192.         DisplayData[1] = smgduan[bai];                                        //百位
  193.         DisplayData[2] = smgduan[shi];                        //十位
  194.         DisplayData[3] = smgduan[ge]|0x80;        //個位
  195.         DisplayData[4] = smgduan[temp %  100 / 10];
  196.         DisplayData[5] = smgduan[temp %  100 % 10];
  197.         tt=bai*100+10*shi+ge;
  198. }                                          


  199. void dealWaring(){//警戒處理函數(shù)
  200.         if(warn>0){
  201.                 warns[0] = 0x00;
  202.                 warns[1] = smgduan[warn/100];
  203.                 warns[2] = smgduan[warn%100/10];
  204.                 warns[3] = smgduan[warn%10];
  205.         }else{
  206.                  warns[0]= 0x40;           //   -
  207.                 warns[1] = smgduan[warn/100];
  208.                 warns[2] = smgduan[warn%100/10];
  209.                 warns[3] = smgduan[warn%10];
  210.         }

  211. }

  212. void keyScan()//鍵盤控制
  213. {
  214.         uint flag;
  215.         if(K1==0)//按下按鍵1進(jìn)入警戒值調(diào)整
  216.         {
  217.                 Delay1ms(10);
  218.                 if(K1==0)
  219.                 {
  220.                         dealWaring();
  221.                         while(flag){
  222.                                 uchar i;
  223.                                 for(i=0;i<6;i++)
  224.                                 {
  225.                                         switch(i)         //位選,選擇點亮的數(shù)碼管,
  226.                                         {
  227.                                            case(0):
  228.                                                         LSA=1;LSB=1;LSC=1; break;//顯示第0位
  229.                                                 case(1):
  230.                                                         LSA=0;LSB=1;LSC=1; break;//顯示第1位
  231.                                                 case(2):
  232.                                                         LSA=1;LSB=0;LSC=1; break;//顯示第2位
  233.                                                 case(3):       
  234.                                                         LSA=0;LSB=0;LSC=1; break;//顯示第3位
  235.                                                 case(4):
  236.                                                         LSA=1;LSB=1;LSC=0; break;//顯示第4位
  237.                                                 case(5):
  238.                                                         LSA=0;LSB=1;LSC=0; break;//顯示第5位
  239.                                                 case(6):
  240.                                                         LSA=1;LSB=0;LSC=0; break;//顯示第6位
  241.                                                 case(7):
  242.                                                         LSA=0;LSB=0;LSC=0; break;//顯示第7位       
  243.                                         }
  244.                                         P0=warns[i];//發(fā)送段碼
  245.                                         delay(50); //間隔一段時間掃描       
  246.                                         P0=0x00;//消影
  247.                                 }
  248.                                 if(K2==0)
  249.                                 {
  250.                                         Delay1ms(10);
  251.                                         if(K2==0)
  252.                                         {               
  253.                                                 warn++;
  254.                                                 dealWaring();
  255.                                                 while(!K2);
  256.                                         }
  257.                                 }
  258.                        
  259.                                 if(K3==0)
  260.                                 {
  261.                                         Delay1ms(10);
  262.                                         if(K3==0)
  263.                                         {               
  264.                                                 warn--;
  265.                                                 dealWaring();
  266.                                                 while(!K3);
  267.                                         }
  268.                                 }
  269.                        
  270.                                 if(K4==0)
  271.                                 {
  272.                                         Delay1ms(10);
  273.                                         if(K4==0)
  274.                                         {               
  275.                                                 flag=0;
  276.                                                 while(!K4);
  277.                                         }
  278.                                 }                                         
  279.                         }
  280.                
  281.                 }
  282.         }
  283. }

  284. //顯示數(shù)字
  285. void DigDisplay()
  286. {
  287. ……………………

  288. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于DS18B20的溫度傳感器設(shè)計.zip (109.91 KB, 下載次數(shù): 41)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天干天天爽 | 嫩草懂你的影院入口 | 久久免费看 | 亚洲一本 | 天天操天天干天天曰 | 日本不卡免费新一二三区 | 成人精品区 | 一级网站 | 欧美精品片 | 久久亚洲国产精品 | 欧美日韩一区二区三区不卡视频 | 久久免费香蕉视频 | 99中文字幕 | 久久亚洲国产精品 | 久久精品国产久精国产 | 精品九九九 | 成人免费视频在线观看 | 成人免费大片黄在线播放 | 伊人久久综合 | 久久久成人精品 | 欧美国产日本一区 | 四虎影院新地址 | 欧美日韩国产精品 | 中文字幕一级毛片 | 国产精品精品视频一区二区三区 | 国产激情一区二区三区 | 日本天堂视频在线观看 | 男女免费在线观看视频 | 国产精品日韩高清伦字幕搜索 | 在线观看精品视频网站 | 九九热免费观看 | 视频一区二区在线观看 | 三级黄色片在线播放 | 亚洲一区二区三区在线播放 | 国产精品亚洲一区二区三区在线观看 | 91精品国产91久久综合桃花 | 色综合久久久久 | 欧美一区二区免费 | 久草综合在线 | 日韩欧美三区 | 午夜日韩 |