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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3478|回復: 1
打印 上一主題 下一主題
收起左側

單片機溫控風扇代碼與Proteus仿真原理圖

[復制鏈接]
跳轉到指定樓層
樓主
溫控風扇仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>                                           //包含頭文件
  3. #define uchar unsigned char
  4. #define uint unsigned int                           //宏定義
  5. ////////////////////
  6. sbit dj=P1^0;//電機控制端接口
  7. sbit DQ=P1^6;//溫度傳感器接口
  8. //////////按鍵接口/////////////////////////////////
  9. sbit key1=P3^5;//設置溫度
  10. sbit key2=P3^6;//溫度加
  11. sbit key3=P3^7;//溫度減
  12. //////////////////////////////////////////////////////
  13. sbit w1=P2^4;
  14. sbit w2=P2^5;
  15. sbit w3=P2^6;
  16. sbit w4=P2^7;                                //數碼管的位選端
  17. /////共陰數碼管段選//////////////////////////////////////////////
  18. uchar table[22]=
  19. {0x3F,0x06,0x5B,0x4F,0x66,                //0 1 2 3 4
  20. 0x6D,0x7D,0x07,0x7F,0x6F,                //5 6 7 8 9
  21. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  22. 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n         16-21
  23. uint wen_du;                                   //溫度變量
  24. int shang,xia; //對比溫度暫存變量
  25. uchar dang;//檔位顯示
  26. uchar speed;                        //速度變量
  27. uchar flag=0;                        //設置的變量
  28. bit start=0;                        //開始采集溫度變量
  29. uchar d1,d2,d3;//顯示數據暫存變量
  30. void delay(uint ms)                  //延時函數
  31. {
  32.         uchar x;
  33.         for(ms;ms>0;ms--)
  34.                 for(x=10;x>0;x--);
  35. }
  36. /***********ds18b20延遲子函數(晶振12MHz )*******/
  37. void delay_18B20(uint i)
  38. {
  39.         while(i--);
  40. }
  41. /**********ds18b20初始化函數**********************/
  42. void Init_DS18B20()
  43. {
  44.          uchar x=0;
  45.          DQ=1;          //DQ復位
  46.          delay_18B20(8);  //稍做延時
  47.          DQ=0;          //單片機將DQ拉低
  48.          delay_18B20(80); //精確延時 大于 480us
  49.          DQ=1;          //拉高總線
  50.          delay_18B20(14);
  51.          x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  52.          delay_18B20(20);
  53. }
  54. /***********ds18b20讀一個字節**************/  
  55. uchar ReadOneChar()
  56. {
  57.         uchar i=0;
  58.         uchar dat=0;
  59.         for (i=8;i>0;i--)
  60.          {
  61.                   DQ=0; // 給脈沖信號
  62.                   dat>>=1;
  63.                   DQ=1; // 給脈沖信號
  64.                   if(DQ)
  65.                   dat|=0x80;
  66.                   delay_18B20(4);
  67.          }
  68.         return(dat);
  69. }
  70. /*************ds18b20寫一個字節****************/  
  71. void WriteOneChar(uchar dat)
  72. {
  73.         uchar i=0;
  74.         for (i=8;i>0;i--)
  75.         {
  76.                   DQ=0;
  77.                 DQ=dat&0x01;
  78.             delay_18B20(5);
  79.                 DQ=1;
  80.             dat>>=1;
  81.         }
  82. }
  83. /**************讀取ds18b20當前溫度************/
  84. void ReadTemperature()
  85. {
  86.         uchar a=0;
  87.         uchar b=0;
  88.         uchar t=0;
  89.         Init_DS18B20();
  90.         WriteOneChar(0xCC);            // 跳過讀序號列號的操作
  91.         WriteOneChar(0x44);         // 啟動溫度轉換
  92. //        delay_18B20(100);       // this message is wery important
  93.         Init_DS18B20();
  94.         WriteOneChar(0xCC);         //跳過讀序號列號的操作
  95.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  96. //        delay_18B20(100);
  97.         a=ReadOneChar();            //讀取溫度值低位
  98.         b=ReadOneChar();                   //讀取溫度值高位
  99.         wen_du=((b*256+a)>>4);    //當前采集溫度值除16得實際溫度值
  100. }
  101. void init()                        //定時器初始化函數
  102. {
  103.         TMOD=0x01;                //工作方式
  104.         TH0=0xff;
  105.         TL0=0x38;                //定時器賦初值
  106.         EA=1;                        //打開中斷總開關
  107.         ET0=1;                        //打開定時器0中斷允許開關
  108.         TR0=1;                        //打開定時器0定時開關
  109. }
  110. void init_dis()                //開機顯示
  111. {
  112.         w1=0;w2=0;w3=0;w4=0;P0=table[16];
  113. }
  114. void display()//顯示溫度
  115. {
  116.         if(flag==0)
  117.         {
  118.                 if(speed>5) d1=speed-5;else d1=0;d2=wen_du/10;d3=wen_du%10;          //速度分10個檔位,但是風扇在1 2 3 4 5檔位時轉不起來,所以從6開始為轉動的1檔
  119.         }
  120.         w1=0;P0=table[d1];delay(20); //第1位
  121.         P0=0x00;w1=1;
  122.          
  123.         w2=0;P0=table[16];delay(20);//第2位
  124.         P0=0x00;w2=1;

  125.         w3=0;P0=table[d2]; delay(20);//第3位
  126.         P0=0x00;w3=1;;

  127.         w4=0;P0=table[d3];delay(20);//第4位
  128.         P0=0x00;w4=1;
  129. }
  130. void zi_keyscan()//自動模式按鍵掃描函數
  131. {
  132.         if(key1==0)                          //設置鍵按下
  133.         {
  134.                 delay(10);                  //按鍵去抖
  135.                 if(key1==0)                  //再次判斷
  136.                 {
  137.                         flag++;                  //設置狀態加,等于1時是設置上限,等于2時是設置下限,等于0時退出設置
  138.                         TR0=0;                  //關閉定時器
  139.                         dj=0;                  //關閉風扇
  140.                         if(flag>=3)          //退出設置
  141.                         {
  142.                                 TR0=1;          //打開定時器,準備讀取溫度
  143.                                 flag=0;          //變量清零,退出設置
  144.                         }
  145.                 }
  146.                 while(key1==0) display();//按鍵釋放,按鍵不松開,程序就停在這里,防止重復執行上面的程序,造成按鍵重復判斷
  147.         }
  148.         if(flag==1)                                  //設置上限時
  149.         {
  150.                 d1=18;d2=shang/10;d3=shang%10;        //顯示字母H
  151.                 if(key2==0)                                                //加鍵按下
  152.                 {
  153.                         delay(10);                                        //延時去抖
  154.                         if(key2==0)                                        //再次判斷按鍵
  155.                         {
  156.                                 shang+=1;                                //上限值加
  157.                                 if(shang>=99)shang=99;        //最大加到99
  158.                         }
  159.                         while(key2==0) display();//松手檢測
  160.                 }
  161.                 if(key3==0)                                                //減鍵按下
  162.                 {
  163.                         delay(10);                                   //延時去抖
  164.                         if(key3==0)                                         //再次判斷
  165.                         {
  166.                                 shang-=1;                                           //上限減
  167.                                 if(shang<=xia+4)shang=xia+4;        //上限最小比下限大4
  168.                         }
  169.                         while(key3==0) display();//松手檢測
  170.                 }               
  171.         }
  172.         if(flag==2)                                                        //設置下限
  173.         {
  174.                 d1=17;d2=xia/10;d3=xia%10;                //顯示字母L
  175.                 if(key2==0)
  176.                 {                                                                //以下注釋參考設置上限
  177.                         delay(10);
  178.                         if(key2==0)
  179.                         {
  180.                                 xia+=1;
  181.                                 if(xia>=shang-4)xia=shang-4;       
  182.                         }
  183.                         while(key2==0) display();//松手檢測
  184.                 }
  185.                 if(key3==0)
  186.                 {
  187.                         delay(10);
  188.                         if(key3==0)
  189.                         {
  190.                                 xia-=1;
  191.                                 if(xia<=0)xia=0;       
  192.                         }
  193.                         while(key3==0) display();//松手檢測
  194.                 }               
  195.         }
  196. }
  197. void zi_dong()//自動溫控模式
  198. {
  199. //        此函數的目的是將上限和下限的差值平均為5份,每一份對應一個速度值                14-25
  200.         if(wen_du<xia)                                                                                                                   //溫度小于下限
  201.         speed=0;                                                                                                                           //速度0檔
  202.         else if(wen_du>=xia&&(wen_du<(uint)((shang-xia)/4+xia)))                                           //溫度大于下限并且小于(上限減去下限)除以4加下限
  203.         speed=6;                                                                                                                           //6檔                14-16.75          14-15
  204.         else if((wen_du>=(uint)((float)(shang-xia)/4+xia))&&(wen_du<(uint)((float)(shang-xia)/2+xia)))           //溫度大于 (上限減去下限)除以4加下限  并且小于(上限減去下限)除以2加下限
  205.         speed=7;                                                                                                                           //7檔                16-19.5                  16-18
  206.         else if((wen_du>=(uint)(shang-xia)/2+xia)&&(wen_du<(uint)((float)((float)(shang-xia)/4)*3+xia)))   //溫度大于 (上限減去下限)除以2加下限  并且小于(上限減去下限)除以4乘以3加下限
  207.         speed=8;                                                                                                                           //8檔                19-22.25          19-21
  208.         else if((wen_du>=(uint)((float)((float)(shang-xia)/4)*3+xia))&&wen_du<shang)                                   //溫度大于 (上限減去下限)除以4乘以3加下限  并且小于上限
  209.         speed=9;                                                                                                                           //9檔                22-24                  22-24
  210.         else if(wen_du>=shang)                                                                                                   //大于上限
  211.         speed=10;                                                                                                                           //10檔                >25
  212. }
  213. void main()                         //主函數
  214. {
  215.         uchar j;
  216.        
  217.         dj=0;                         //關閉風扇
  218.         shang=34;         //34  30
  219.         xia=30;                         //初始化上下限值
  220.         init_dis();                 //初始化顯示
  221.         for(j=0;j<200;j++)           //讀取溫度,防止開機顯示85
  222.         ReadTemperature();         
  223.         init();                                        //定時器初始化
  224.         while(1)                          //進入while循環,括號內為1,也就是死循環
  225.         {       
  226.                 if(start==1)          //開始讀取溫度
  227.                 {
  228.                         start=0;          //清零
  229.                         TR0=0;                  //關閉定時器
  230.                         dj=0;                  //關閉風扇
  231.                         ReadTemperature();//讀取溫度
  232.                         TR0=1;                  //打開定時器
  233.                         zi_dong();//自動溫控模式
  234.                 }
  235.                 zi_keyscan();//按鍵掃描函數
  236.                 display();         //顯示函數
  237.         }
  238. }
  239. //以下是控制PWM的
  240. void time0() interrupt 1         //定時器服務函數
  241. {
  242.         uchar m;
  243.         uint n;
  244.         TH0=0xff;          //200us初值
  245.         TL0=0x38;

  246.         if(m<speed)                          //m值小于speed
  247.         dj=1;                                  //打開風扇
  248.         else if(m>=speed)          //否則
  249.         dj=0;                                  //關閉風扇

  250.         m++;                                  //m加
  251.         if(m>=10)                          //m極愛到10,也就是2ms
  252.         m=0;

  253.         n++;                                  //200us  n加一次
  254.         if(n>=10000)                  //n加到10000  也就是2秒
  255.         {
  256.                 n=0;
  257.                 start=1;                  //啟動一次溫度測量
  258.         }
  259. }
復制代碼

所有資料51hei提供下載:
溫控風扇.zip (715.49 KB, 下載次數: 48)

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

使用道具 舉報

沙發
ID:927591 發表于 2021-5-26 14:50 來自手機 | 只看該作者
請問我仿真完之后只在第一位顯示8怎么處理啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区精品视频 | 夜夜骑首页 | 久久国产精品首页 | www免费视频 | 91精品国产91久久久久游泳池 | 欧美成人一区二区三区 | 亚洲日本成人 | 亚洲国产精品一区二区三区 | 色小姐综合网 | 亚洲 欧美 综合 | 欧美在线日韩 | 久一精品 | 91网在线观看 | 亚洲国产成人精品在线 | 久久一及片 | 91免费看片| 午夜寂寞影院列表 | 成人国产精品久久久 | 蜜桃av一区二区三区 | 亚洲国内精品 | www久久久| 亚洲第一中文字幕 | 欧美日韩精品一区二区三区四区 | 日韩不卡一二区 | 国产精品看片 | 国产精品久久久久久中文字 | 精品美女久久久 | 亚洲欧美日韩精品久久亚洲区 | 成人精品一区二区户外勾搭野战 | 欧美久久电影 | 午夜视频一区 | 亚洲欧美一区二区三区视频 | 欧美一区二区三区,视频 | 欧美亚洲国产成人 | 欧美精品在线一区二区三区 | 毛片黄片免费看 | 日韩欧美中文字幕在线观看 | 国产精品久久久久久一区二区三区 | 欧美日韩久 | 四虎影院在线免费观看 | 成人精品一区二区三区 |