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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3286|回復: 0
收起左側

單片機數字溫度計仿真程序 帶負溫度顯示

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

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

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

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

  2. typedef unsigned int uint;          
  3. //對數據類型進行聲明定義
  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. //延遲函數
  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. //初始化函數
  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.         //反應會將在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. //向傳感器寫字節
  56. void Ds18K20WriteByte(uchar dat)
  57. {
  58.         uint i, j;

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

  77. //從傳感器讀字節
  78. uchar Ds18K20ReadByte()
  79. {
  80.         uchar byte, bi;//bi保存單位數據
  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等待數據穩定
  89.                 bi = DSPORT;         //讀取數據,從最低位開始讀取
  90.                 byte = (byte >> 1) | (bi << 7);
  91.                 /*如,byte=0000 0000,bi讀取到一個最低位有效數字0000 0001,
  92.                 左移七位1000 0000,byte右移一位0000 0000,和byte或,
  93.                         byte=1000 0000,bi讀取到一個最低位有效數字0000 0001,
  94.                         左移七位1000 0000,byte右移一位0100 0000,和byte或,
  95.                         byte=1100 0000,以此類推       
  96.                 */                                                  
  97.                 while(i--);//延時45us
  98.         }                               
  99.         return byte;
  100. }

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

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

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

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

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

  157. //數據處理函數
  158. void datapros(int temp)          
  159. {        uint ge,shi,bai;
  160.            float tp;  
  161.         //保存溫度
  162.         if(temp< 0)//當溫度值為負數
  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.                 //留兩個小數點就*100,+0.5是四舍五入,因為
  172.                 //C語言浮點數轉換為整型的時候把小數點
  173.                 //后面的數自動去掉,不管是否大于0.5,而+0.5
  174.                 //之后大于0.5的就是進1了,小于0.5的就
  175.                 //算加上0.5,還是在小數點后面。

  176.           }
  177.         else
  178.           {                       
  179.                 DisplayData[0] = 0x00;
  180.                 tp=temp;
  181.                 //因為數據處理有小數點所以將溫度賦給一個浮點型變量
  182.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  183.                 temp=tp*0.0625*100+0.5;       
  184.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮
  185.                 //點數轉換為整型的時候把小數點后面的數自動去掉,
  186.                 //不管是否大于0.5,而+0.5之后大于0.5的就是進1了,
  187.                 //小于0.5的就算加上0.5,還是在小數點后面。
  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(){//警戒處理函數
  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進入警戒值調整
  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)         //位選,選擇點亮的數碼管,
  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];//發送段碼
  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. //顯示數字
  285. void DigDisplay()
  286. {
  287. ……………………

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

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


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 欧美 日韩 在线 | 91av在线免费| 久久精品亚洲一区二区三区浴池 | 中文在线а√在线8 | 亚欧精品一区 | 成人免费网站视频 | yiren22综合网成人 | 亚洲一区二区av在线 | 羞羞视频免费在线观看 | 天天操夜夜爽 | 91精品国产一区二区三区 | 欧美精品一二三 | 综合网在线 | 欧美视频免费在线 | 日韩视频 中文字幕 | 91影院在线观看 | 日韩中文一区二区三区 | 99这里只有精品视频 | 精品日韩在线 | 久久久999成人 | 亚洲网站在线播放 | 99re国产精品 | 免费看大片bbbb欧美 | 久久久成人网 | 精品国产精品国产偷麻豆 | 一道本不卡视频 | 天天夜夜操 | 日本欧美国产在线 | 久久精品亚洲国产奇米99 | 欧美一区二区免费在线 | 男人天堂av网 | 污视频免费在线观看 | 国产日韩欧美一区二区 | 欧美中文| 国产成人网 | 国产高清在线精品一区二区三区 | 精品一区二区三区在线观看国产 | 在线一区视频 | 56pao在线| 国产 亚洲 网红 主播 | 久久久久国产精品 |