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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機模擬空調遙控恒溫控制 Proteus仿真源程序

[復制鏈接]
跳轉到指定樓層
樓主

一年多沒碰51單片機了,當時還是為STM32過渡學習的。


      這期開了單片機專業課,不得不重拾起來。想吐槽的就是,課上還用的proteus而不是實物,去年自學我好歹還五十來塊,買了個普中的。
大前天上午開了節實驗課,一共五個實驗。

  • 流水燈
  • 外部中斷
  • 數碼管,定時器
  • 矩陣鍵盤,串口
  • 空調模擬。。。。。。。

     前天晚上都做完了,算是初步掌握了proteus簡單操作吧。本想用DS18B20測溫,百度搜了加熱元器件無果,就用燈泡指望燈絲加熱,降溫用一個風扇轉轉,做一個仿真真正能閉環控制的,但是proteus好像無法仿真出環境溫度的變化。模擬不出來就模擬不出來吧,做出來的意思到了就行。
    DS18B20有點玄乎,初始化時序那邊在proteus上面需要改改,不然失敗了,就只顯示000.60還是什么數字來著。按理說當時實物也用的普中例程里面的能運行才對。時序數值稍改了一下,能正常讀值測溫了。顯示部分用的數碼管,懶得在仿真上面費工夫再去弄LCD1602了,有得有失吧,弊端就是讀DS18B20溫度時,讀取函數放在數碼管顯示測得溫度和按鈕設定溫度之間,時間超出了視覺停留,會帶點閃動。用1602就沒這問題了,但玩過實物了,仿真沒興趣。矩陣鍵盤仿真圖里面放了,但沒有使用到,用了兩個帶外部中斷的按鈕,實現增溫減溫的功能,代替了矩陣鍵盤,仿真原理圖里面沒有刪去,沒啥大礙。大燈泡和風扇都用了個繼電器。風扇沒用PWM波去驅動,圖省事,接電就轉。想想了,好像也沒啥了。
    總的來說,難度一般,沒有隊里去年51任務最后一個難度大,要求做個萬年歷帶溫度,密碼鎖,串口上位機能修改時間,設定鬧鈴時間,鬧鈴關還是開等等。


   

   對了,上面忘了提及了,左邊是檢測溫度,右邊是設定溫度。

   用的多文件,proteus7版本的,keil4寫的。都是老版本莫得問題的話,應該都能打開吧。用慣了keil5,再看看4真的簡陋,喵的,而且結合32的CubeMX,更香。習慣了32的變量類型方式,uint8_t就是uchar,依此類推,或者詳見typedef.h文件。

   代碼里面有些部分可能沒用到,但問題不大,工程是幾個實驗慢慢添補的。沒記錯的話,定時器那邊計數還是給交通燈實驗三開著的沒關。

   如果是我同學看到了這個,起碼把原理圖位置改改,代碼函數變量改改,別照搬。我還要寫實驗報告呢,課上我這實驗也演示過了,雷同可不好哦。

   做完算是分享吧,如果該文件有什么問題,可以私信我

單片機源程序如下:
  1. #include "reg52.h"
  2. #include "tydefine.h"
  3. #include "led.h"
  4. #include "timer.h"
  5. #include "exit.h"
  6. #include "ds18b20.h"

  7. #define GPIO_KEY P1

  8. sbit LSA = P2^2;
  9. sbit LSB = P2^3;
  10. sbit LSC = P2^4;

  11. sbit FAN = P2^6;
  12. sbit LAMP = P2^7;

  13. extern uint16_t SetTemNum;
  14. uint16_t CurrentTemNum = 0;


  15. uint8_t code DigitalTubeSegment[] ={
  16.            0x3f,0x06,0x5b,0x4f,0x66,
  17.         0x6d,0x7d,0x07,0x7f,0x6f
  18. };

  19. uint8_t KeyValue = 0;
  20. uint8_t DisplayData[8];


  21. void delay_ms(uint32_t n);
  22. void KeyDown();
  23. void UsartInit();
  24. void DigitalTubeDisplay(uint8_t ShowNumber,uint8_t DigitNumber);
  25. void DisplayCurrentNumber(uint16_t CurrentNumber);
  26. void datapros(int32_t temp);
  27. void TemJudgement();

  28. void main()
  29. {
  30.         Exit0Init();
  31.         Exit1Init();
  32.         while(1)
  33.         {
  34.                 datapros(Ds18b20ReadTemp());
  35.                 DigitalTubeDisplay(DisplayData[2],6);
  36.                 DigitalTubeDisplay(DisplayData[3],5);
  37.                 TemJudgement();
  38.                 datapros(Ds18b20ReadTemp());
  39.                 DisplayCurrentNumber(SetTemNum);
  40.                 TemJudgement();
  41.         }
  42. }



  43. void delay_ms(uint32_t n)
  44. {
  45.     uint32_t i=0,j=0;
  46.     for(i=0;i<n;i++)
  47.         for(j=0;j<123;j++);
  48. }

  49. void KeyDown()
  50. {
  51.         uint8_t KeyWaitcount = 0;
  52.         GPIO_KEY = 0x0F;
  53.         if(GPIO_KEY != 0x0F)
  54.         {
  55.                 delay_ms(10);
  56.                 if(GPIO_KEY != 0x0F)
  57.                 {
  58.                         switch(GPIO_KEY)
  59.                         {
  60.                                 case 0x07:
  61.                                         KeyValue = 1;
  62.                                         break;
  63.                                 case 0x0B:
  64.                                         KeyValue = 2;
  65.                                         break;
  66.                                 case 0x0D:
  67.                                         KeyValue = 3;
  68.                                         break;
  69.                                 case 0x0E:
  70.                                         KeyValue = 4;
  71.                                         break;
  72.                         }
  73.                         GPIO_KEY = 0xF0;
  74.                         switch(GPIO_KEY)
  75.                         {
  76.                                 case 0xE0:
  77.                                         KeyValue = KeyValue;
  78.                                         break;
  79.                                 case 0xD0:
  80.                                         KeyValue = KeyValue + 4;
  81.                                         break;
  82.                                 case 0xB0:
  83.                                         KeyValue = KeyValue + 8;
  84.                                         break;
  85.                                 case 0x70:
  86.                                         KeyValue = KeyValue + 12;
  87.                                         break;
  88.                         }
  89.                         while((KeyWaitcount<50)&&(GPIO_KEY != 0xF0))
  90.                         {
  91.                                 delay_ms(10);
  92.                                 KeyWaitcount++;
  93.                         }

  94. //                        SBUF = KeyValue;
  95. //                        while(!TI);
  96. //                        TI = 0;                       
  97.                 }
  98.         }       
  99. }

  100. void DigitalTubeDisplay(uint8_t ShowNumber,uint8_t DigitNumber)
  101. {
  102.         switch(DigitNumber)
  103.         {
  104.                 case 1:
  105.                         LSC = 0;LSB = 0;LSA = 0;
  106.                         break;
  107.                 case 2:
  108.                         LSC = 0;LSB = 0;LSA = 1;
  109.                         break;
  110.                 case 3:
  111.                         LSC = 0;LSB = 1;LSA = 0;
  112.                         break;
  113.                 case 4:
  114.                         LSC = 0;LSB = 1;LSA = 1;
  115.                         break;
  116.                 case 5:
  117.                         LSC = 1;LSB = 0;LSA = 0;
  118.                         break;
  119.                 case 6:
  120.                         LSC = 1;LSB = 0;LSA = 1;
  121.                         break;
  122.         }
  123.         P0 = DigitalTubeSegment[ShowNumber];
  124.         delay_ms(1);
  125.         P0 = 0x00;
  126. }

  127. void DisplayCurrentNumber(uint16_t CurrentNumber)
  128. {
  129.         uint8_t UnitsDigit = 0;
  130.         uint8_t TensDigit = 0;
  131.         TensDigit = CurrentNumber/10;
  132.         UnitsDigit = CurrentNumber%10;
  133.         switch(3)
  134.         {
  135.                 case 1:
  136.                         DigitalTubeDisplay(TensDigit,6);
  137.                         DigitalTubeDisplay(UnitsDigit,5);
  138.                         break;
  139.                 case 2:
  140.                         DigitalTubeDisplay(TensDigit,4);
  141.                         DigitalTubeDisplay(UnitsDigit,3);
  142.                         break;
  143.                 case 3:
  144.                         DigitalTubeDisplay(TensDigit,2);
  145.                         DigitalTubeDisplay(UnitsDigit,1);
  146.                         break;
  147.         }       
  148. }

  149. void datapros(int32_t temp)          
  150. {
  151.            float tp;  
  152.         if(temp< 0)                                //當溫度值為負數
  153.           {
  154.                 DisplayData[0] = 0x40;           //   -
  155.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  156.                 temp=temp-1;
  157.                 temp=~temp;
  158.                 tp=temp;
  159.                 temp=tp*0.0625*100+0.5;       
  160.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  161.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  162.                 //算加上0.5,還是在小數點后面。

  163.           }
  164.         else
  165.           {                       
  166.                 DisplayData[0] = 0x00;
  167.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  168.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  169.                 temp=tp*0.0625*100+0.5;       
  170.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  171.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  172.                 //算加上0.5,還是在小數點后面。
  173.         }
  174. //        DisplayData[1] = temp / 10000;
  175.         DisplayData[2] = temp % 10000 / 1000;
  176.         DisplayData[3] = temp % 1000 / 100;
  177.         CurrentTemNum =  DisplayData[2]*10 + DisplayData[3];
  178. //        DisplayData[4] = temp % 100 / 10;
  179. //        DisplayData[5] = temp % 10;
  180. }

  181. void TemJudgement()
  182. {
  183. //        CurrentTemNum        SetTemNum
  184.         if(CurrentTemNum > SetTemNum)
  185.         {
  186.                 FAN = 0;
  187.                 LAMP = 1;
  188.         }
  189.         else if(CurrentTemNum < SetTemNum)
  190.         {
  191.                 FAN = 1;
  192.                 LAMP = 0;
  193.         }
  194. }
復制代碼

所有資料51hei提供下載:
06085.zip (117.08 KB, 下載次數: 55)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:744425 發表于 2020-6-14 23:28 | 只看該作者
你好,我想問一下,你會用DAC0832控制直流電機嗎?接線是這樣的
回復

使用道具 舉報

板凳
ID:421451 發表于 2020-12-11 14:58 | 只看該作者
算術平均數 發表于 2020-6-14 23:28
你好,我想問一下,你會用DAC0832控制直流電機嗎?接線是這樣的

沒做過這個仿真。不是課設的話,我都不用這軟件的。。。。。。當初學的時候入手一個開發板實物。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av一区 | 国产精品久久国产精品99 gif | 精品免费在线 | 日韩爱爱网 | 精品一二区 | 综合久久综合久久 | 91一区二区三区在线观看 | 日日射影院| 日韩电影免费在线观看中文字幕 | 中文字幕亚洲视频 | 国产精品久久久久久久久久免费看 | 在线观看视频一区 | 国产日韩亚洲欧美 | 亚洲人成人一区二区在线观看 | 99热免费在线 | 日本欧美国产在线观看 | 国产一区二区三区久久久久久久久 | 久久在视频 | 日本高清视频在线播放 | 久久久高清 | 国精产品一品二品国精在线观看 | 午夜精品久久久久久久久久久久久 | 国产小视频在线观看 | 成人国产免费视频 | 久久久精品影院 | 久久国产精品偷 | 免费在线观看av片 | 国产免费一区二区 | 日韩高清在线观看 | 久久久久久国产免费视网址 | 久草综合在线视频 | 国产精品成人一区 | 一区二区在线免费观看 | 极品粉嫩国产48尤物在线播放 | 国产极品车模吞精高潮呻吟 | 亚洲国产精品激情在线观看 | 91网在线播放 | 久久成人国产精品 | 亚洲精品二区 | 久久精品性视频 | 国产三级国产精品 |